@decaf-ts/logging 0.3.13 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/logging.cjs +21 -7
- package/dist/logging.esm.cjs +21 -7
- package/lib/environment.cjs +20 -6
- package/lib/environment.d.ts +4 -31
- package/lib/esm/environment.d.ts +4 -31
- package/lib/esm/environment.js +20 -6
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/logging.cjs
CHANGED
|
@@ -440,6 +440,7 @@
|
|
|
440
440
|
* end
|
|
441
441
|
* Env-->>Client: merged value
|
|
442
442
|
*/
|
|
443
|
+
const EmptyValue = Symbol("EnvironmentEmpty");
|
|
443
444
|
class Environment extends typedObjectAccumulator.ObjectAccumulator {
|
|
444
445
|
/**
|
|
445
446
|
* @static
|
|
@@ -505,9 +506,9 @@
|
|
|
505
506
|
if (v && typeof v === "object") {
|
|
506
507
|
return Environment.buildEnvProxy(v, [k]);
|
|
507
508
|
}
|
|
508
|
-
// If the model provides an empty string,
|
|
509
|
+
// If the model provides an empty string, mark with EmptyValue so instance proxy can return undefined without enabling key composition
|
|
509
510
|
if (v === "") {
|
|
510
|
-
return
|
|
511
|
+
return EmptyValue;
|
|
511
512
|
}
|
|
512
513
|
return v;
|
|
513
514
|
},
|
|
@@ -534,6 +535,14 @@
|
|
|
534
535
|
const proxied = new Proxy(base, {
|
|
535
536
|
get(target, prop, receiver) {
|
|
536
537
|
const value = Reflect.get(target, prop, receiver);
|
|
538
|
+
if (value === EmptyValue)
|
|
539
|
+
return undefined;
|
|
540
|
+
// If the property exists on the instance but resolves to undefined, return undefined (no proxy)
|
|
541
|
+
if (typeof prop === "string" &&
|
|
542
|
+
Object.prototype.hasOwnProperty.call(target, prop)) {
|
|
543
|
+
if (typeof value === "undefined")
|
|
544
|
+
return undefined;
|
|
545
|
+
}
|
|
537
546
|
if (typeof value !== "undefined")
|
|
538
547
|
return value;
|
|
539
548
|
if (typeof prop === "string") {
|
|
@@ -610,9 +619,8 @@
|
|
|
610
619
|
}
|
|
611
620
|
if (typeof prop === "symbol")
|
|
612
621
|
return undefined;
|
|
613
|
-
const
|
|
614
|
-
|
|
615
|
-
: undefined;
|
|
622
|
+
const hasProp = !!current && Object.prototype.hasOwnProperty.call(current, prop);
|
|
623
|
+
const nextModel = hasProp ? current[prop] : undefined;
|
|
616
624
|
const nextPath = [...path, prop];
|
|
617
625
|
const composedKey = buildKey(nextPath);
|
|
618
626
|
// If an ENV value exists for this path, return it directly
|
|
@@ -623,6 +631,12 @@
|
|
|
623
631
|
const isNextObject = nextModel && typeof nextModel === "object";
|
|
624
632
|
if (isNextObject)
|
|
625
633
|
return Environment.buildEnvProxy(nextModel, nextPath);
|
|
634
|
+
// If the model marks this leaf as an empty string, treat as undefined (no proxy)
|
|
635
|
+
if (hasProp && nextModel === "")
|
|
636
|
+
return undefined;
|
|
637
|
+
// If the model explicitly contains the property with value undefined, treat as undefined (no proxy)
|
|
638
|
+
if (hasProp && typeof nextModel === "undefined")
|
|
639
|
+
return undefined;
|
|
626
640
|
// Always return a proxy for further path composition when no ENV value;
|
|
627
641
|
// do not surface primitive model defaults here (this API is for key composition).
|
|
628
642
|
return Environment.buildEnvProxy(undefined, nextPath);
|
|
@@ -1793,7 +1807,7 @@
|
|
|
1793
1807
|
* @type {string}
|
|
1794
1808
|
* @memberOf module:Logging
|
|
1795
1809
|
*/
|
|
1796
|
-
const VERSION = "0.3.
|
|
1810
|
+
const VERSION = "0.3.14";
|
|
1797
1811
|
|
|
1798
1812
|
exports.BrowserEnvKey = BrowserEnvKey;
|
|
1799
1813
|
exports.DefaultLoggingConfig = DefaultLoggingConfig;
|
|
@@ -1833,4 +1847,4 @@
|
|
|
1833
1847
|
exports.verbose = verbose;
|
|
1834
1848
|
|
|
1835
1849
|
}));
|
|
1836
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvdGV4dC50cyIsIi4uL3NyYy93ZWIudHMiLCIuLi9zcmMvZW52aXJvbm1lbnQudHMiLCIuLi9zcmMvbG9nZ2luZy50cyIsIi4uL3NyYy9Mb2dnZWRDbGFzcy50cyIsIi4uL3NyYy9maWx0ZXJzL0xvZ0ZpbHRlci50cyIsIi4uL3NyYy90aW1lLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZmlsdGVycy9QYXR0ZXJuRmlsdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dpbmdDb25maWcsIFRoZW1lIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2xvYmFsIGtleSB1c2VkIHRvIHN0b3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBicm93c2VyIGNvbnRleHRzLlxuICogQHN1bW1hcnkgRW5hYmxlcyB0aGUgbG9nZ2luZyBlbnZpcm9ubWVudCBoZWxwZXJzIHRvIGxvY2F0ZSBzZXJpYWxpemVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gb24gYGdsb2JhbFRoaXNgLlxuICogQGNvbnN0IEJyb3dzZXJFbnZLZXlcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IEJyb3dzZXJFbnZLZXkgPSBcIkVOVlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWxpbWl0ZXIgdXNlZCBmb3IgY29tcG9zaW5nIG5lc3RlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcy5cbiAqIEBzdW1tYXJ5IEpvaW5zIHBhcmVudCBhbmQgY2hpbGQga2V5cyB3aGVuIG1hcHBpbmcgb2JqZWN0IHBhdGhzIHRvIEVOViBzdHJpbmdzLlxuICogQGNvbnN0IEVOVl9QQVRIX0RFTElNSVRFUlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRU5WX1BBVEhfREVMSU1JVEVSID0gXCJfX1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHByZWZpeCBhbmQgc3VmZml4IHVzZWQgZm9yIHRlbXBsYXRlIHBsYWNlaG9sZGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHdyYXBwZXIgc3RyaW5ncyBhcHBsaWVkIHdoZW4gaW50ZXJwb2xhdGluZyBtZXNzYWdlcyB3aXRoIHtAbGluayBwYXRjaFBsYWNlaG9sZGVyc30uXG4gKiBAY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyV3JhcHBlcnNcbiAqIEB0eXBlIHtzdHJpbmdbXX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyV3JhcHBlcnMgPSBbXCIke1wiLCBcIn1cIl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBCZW5jaG1hcmsgZXZlbnRzIHRoYXQgY2FwdHVyZSBwZXJmb3JtYW5jZSBtZXRyaWNzLiAqL1xuICBiZW5jaG1hcmsgPSBcImJlbmNobWFya1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEVycm9yIGV2ZW50cyB0aGF0IGluZGljYXRlIGZhaWx1cmVzIHJlcXVpcmluZyBhdHRlbnRpb24uICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogQGRlc2NyaXB0aW9uIEluZm9ybWF0aW9uYWwgZXZlbnRzIGRlc2NyaWJpbmcgbm9ybWFsIG9wZXJhdGlvbi4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIFZlcmJvc2UgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgZGV0YWlsZWQgdHJhY2luZy4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogQGRlc2NyaXB0aW9uIERlYnVnIG9yIHRyYWNlIGRldGFpbHMgYWltZWQgYXQgZGV2ZWxvcGVycy4gKi9cbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gRXh0cmVtZWx5IGNoYXR0eSBvciBwbGF5ZnVsIGxvZyBlbnRyaWVzLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQHR5cGVkZWYge09iamVjdH0gTnVtZXJpY0xvZ0xldmVsc1NoYXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gYmVuY2htYXJrIC0gTnVtZXJpYyB2YWx1ZSBmb3IgYmVuY2htYXJrIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgyKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoNCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDcpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDkpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIE51bWVyaWMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIGxvZyBsZXZlbHMgZm9yIGNvbXBhcmlzb24gYW5kIGZpbHRlcmluZy5cbiAqIEBjb25zdCBOdW1lcmljTG9nTGV2ZWxzXG4gKiBAdHlwZSB7TnVtZXJpY0xvZ0xldmVsc1NoYXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBiZW5jaG1hcms6IDAsXG4gIGVycm9yOiAyLFxuICBpbmZvOiA0LFxuICB2ZXJib3NlOiA2LFxuICBkZWJ1ZzogNyxcbiAgc2lsbHk6IDksXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2dnaW5nIG91dHB1dCBtb2Rlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzIGZvciBsb2cgbWVzc2FnZXMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ2dpbmdNb2RlIHtcbiAgLyoqIFJhdyB0ZXh0IGZvcm1hdCBmb3IgaHVtYW4gcmVhZGFiaWxpdHkgKi9cbiAgUkFXID0gXCJyYXdcIixcbiAgLyoqIEpTT04gZm9ybWF0IGZvciBtYWNoaW5lIHBhcnNpbmcgKi9cbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDM0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpZCAtIFN0eWxpbmcgZm9yIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBpZGVudGlmaWVycyAoMzYpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHN0YWNrIC0gU3R5bGluZyBmb3Igc3RhY2sgdHJhY2VzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFN0eWxpbmcgZm9yIHRpbWVzdGFtcHMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZSAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWVzc2FnZS5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbWVzc2FnZXMgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXRob2QgLSBTdHlsaW5nIGZvciBtZXRob2QgbmFtZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgbG9nIGxldmVscy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIGxldmVsIGxvZ3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbG9nTGV2ZWwuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIGxldmVsIGxvZ3MgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvZ0xldmVsLmVycm9yLnN0eWxlIC0gU3R5bGUgYXR0cmlidXRlcyBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoW1wiYm9sZFwiXSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoMzMpLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBhcHA6IHt9LFxuICBzZXBhcmF0b3I6IHt9LFxuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBiZW5jaG1hcms6IHtcbiAgICAgIGZnOiAzMixcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgaW5mbzoge1xuICAgICAgZmc6IDM0LFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICB2ZXJib3NlOiB7XG4gICAgICBmZzogMzQsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBsb2dnaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLCBpbmNsdWRpbmcgdmVyYm9zaXR5LCBsb2cgbGV2ZWwsIHN0eWxpbmcsIGFuZCB0aW1lc3RhbXAgZm9ybWF0LlxuICogQGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ0NvbmZpZ30gRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gRGVmYXVsdCBsb2cgbGV2ZWwgKExvZ0xldmVsLmluZm8pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dMZXZlbCAtIFdoZXRoZXIgdG8gZGlzcGxheSBsb2cgbGV2ZWwgaW4gb3V0cHV0ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ01vZGV9IG1vZGUgLSBPdXRwdXQgZm9ybWF0IG1vZGUgKExvZ2dpbmdNb2RlLlJBVykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXBhcmF0b3IgLSBTZXBhcmF0b3IgYmV0d2VlbiBsb2cgY29tcG9uZW50cyAoXCIgLSBcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lc3RhbXBzIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wRm9ybWF0IC0gRm9ybWF0IGZvciB0aW1lc3RhbXBzIChcIkhIOm1tOnNzLlNTU1wiKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29udGV4dCAtIFdoZXRoZXIgdG8gaW5jbHVkZSBjb250ZXh0IGluZm9ybWF0aW9uIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge1RoZW1lfSB0aGVtZSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmcgbG9nIG1lc3NhZ2VzIChEZWZhdWx0VGhlbWUpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgZW52OiBcImRldmVsb3BtZW50XCIsXG4gIHZlcmJvc2U6IDAsXG4gIGxldmVsOiBMb2dMZXZlbC5pbmZvLFxuICBsb2dMZXZlbDogdHJ1ZSxcbiAgc3R5bGU6IGZhbHNlLFxuICBjb250ZXh0U2VwYXJhdG9yOiBcIi5cIixcbiAgc2VwYXJhdG9yOiBcIi1cIixcbiAgdGltZXN0YW1wOiB0cnVlLFxuICB0aW1lc3RhbXBGb3JtYXQ6IFwiSEg6bW06c3MuU1NTXCIsXG4gIGNvbnRleHQ6IHRydWUsXG4gIGZvcm1hdDogTG9nZ2luZ01vZGUuUkFXLFxuICBwYXR0ZXJuOlxuICAgIFwie2xldmVsfSBbe3RpbWVzdGFtcH1dIHthcHB9IHtjb250ZXh0fSB7c2VwYXJhdG9yfSB7bWVzc2FnZX0ge3N0YWNrfVwiLFxuICB0aGVtZTogRGVmYXVsdFRoZW1lLFxufTtcbiIsImltcG9ydCB7IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZHMgdGhlIGVuZCBvZiBhIHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIGNoYXJhY3Rlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGlucHV0IHN0cmluZyB0byBhIHNwZWNpZmllZCBsZW5ndGggYnkgYWRkaW5nIGEgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdGhlIGVuZC5cbiAqIElmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYWxyZWFkeSBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgZGVzaXJlZCB0b3RhbCBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoYXI9XCIgXCJdIC0gVGhlIGNoYXJhY3RlciB0byB1c2UgZm9yIHBhZGRpbmcuIERlZmF1bHRzIHRvIGEgc3BhY2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYWRkZWQgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYWRkaW5nIGNoYXJhY3RlciBpcyBub3QgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGxvbmcuXG4gKlxuICogQGZ1bmN0aW9uIHBhZEVuZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkRW5kKFxuICBzdHI6IHN0cmluZyxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIGNoYXI6IHN0cmluZyA9IFwiIFwiXG4pOiBzdHJpbmcge1xuICBpZiAoY2hhci5sZW5ndGggIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBwYWRkaW5nLiBtdXN0IGJlIG9uZSFcIik7XG4gIHJldHVybiBzdHIucGFkRW5kKGxlbmd0aCwgY2hhcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBhIHN0cmluZyB3aXRoIHByb3ZpZGVkIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtICR7dmFyaWFibGVOYW1lfVxuICogd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuIElmIGEgcGxhY2Vob2xkZXIgZG9lc24ndCBoYXZlXG4gKiBhIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGluIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPn0gdmFsdWVzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciByZXBsYWNlbWVudC5cbiAqIEBwYXJhbSBwcmVmaXhcbiAqIEBwYXJhbSBzdWZmaXhcbiAqIEBwYXJhbSBmbGFnc1xuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyB3aXRoIHBsYWNlaG9sZGVycyByZXBsYWNlZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaFN0cmluZ1xuICogICBwYXJ0aWNpcGFudCBTdHJpbmcucmVwbGFjZVxuICogICBDYWxsZXItPj5wYXRjaFN0cmluZzogQ2FsbCB3aXRoIGlucHV0IGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hTdHJpbmctPj5TdHJpbmcucmVwbGFjZTogQ2FsbCB3aXRoIHJlZ2V4IGFuZCByZXBsYWNlbWVudCBmdW5jdGlvblxuICogICBTdHJpbmcucmVwbGFjZS0+PnBhdGNoU3RyaW5nOiBSZXR1cm4gcmVwbGFjZWQgc3RyaW5nXG4gKiAgIHBhdGNoU3RyaW5nLS0+PkNhbGxlcjogUmV0dXJuIHBhdGNoZWQgc3RyaW5nXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVycyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+LFxuICBwcmVmaXg6IHN0cmluZyA9IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzWzBdLFxuICBzdWZmaXg6IHN0cmluZyA9IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzWzFdLFxuICBmbGFnczogc3RyaW5nID0gXCJnXCJcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYWNlaG9sZGVycyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlcykucmVkdWNlKFxuICAgIChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGFjY1tgJHtwcmVmaXh9JHtrZXl9JHtzdWZmaXh9YF0gPSB2YWw7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge31cbiAgKTtcbiAgcmV0dXJuIHBhdGNoU3RyaW5nKGlucHV0LCBwbGFjZWhvbGRlcnMsIGZsYWdzKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwbGFjZXMgb2NjdXJyZW5jZXMgb2Yga2V5cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIGEgc3RyaW5nLlxuICogQHN1bW1hcnkgSXRlcmF0ZXMgdGhyb3VnaCBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgYW5kIHJlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBlYWNoIGtleVxuICogaW4gdGhlIGlucHV0IHN0cmluZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLiBTdXBwb3J0cyByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgZm9yIGN1c3RvbWl6ZWQgcmVwbGFjZW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBpbiB3aGljaCByZXBsYWNlbWVudHMgd2lsbCBiZSBtYWRlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHJlcGxhY2VtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGFncz1cImdcIl0gLSBSZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgdG8gY29udHJvbCB0aGUgcmVwbGFjZW1lbnQgYmVoYXZpb3IuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgd2l0aCBhbGwgc3BlY2lmaWVkIHJlcGxhY2VtZW50cyBhcHBsaWVkLlxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaFN0cmluZ1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hTdHJpbmcoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPixcbiAgZmxhZ3M6IHN0cmluZyA9IFwiZ1wiXG4pOiBzdHJpbmcge1xuICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChrZXkpLCBmbGFncyk7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKHJlZ2V4cCwgdmFsIGFzIHN0cmluZyk7XG4gIH0pO1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGNhbWVsQ2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGNhbWVsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgYWZ0ZXIgdGhlIGZpcnN0IHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0NhbWVsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogd29yZC50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byB1cHBlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMsXG4gKiB0eXBpY2FsbHkgdXNlZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICpcbiAqIEBmdW5jdGlvbiB0b0VOVkZvcm1hdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FTlZGb3JtYXQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU25ha2VDYXNlKHRleHQpLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIHNuYWtlX2Nhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gc25ha2VfY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9TbmFrZUNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2VDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDFfJDJcIilcbiAgICAucmVwbGFjZSgvW1xccy1dKy9nLCBcIl9cIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8ga2ViYWItY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSBoeXBoZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGtlYmFiLWNhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvS2ViYWJDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIFBhc2NhbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBQYXNjYWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIFBhc2NhbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCkgPT4gd29yZC50b1VwcGVyQ2FzZSgpKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHN0cmluZyBmb3IgdXNlIGluIGEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHN1bW1hcnkgQWRkcyBiYWNrc2xhc2hlcyBiZWZvcmUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMsXG4gKiBhbGxvd2luZyB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgYSBsaXRlcmFsIG1hdGNoIGluIGEgUmVnRXhwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgcmVndWxhciBleHByZXNzaW9uIHVzZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGVzY2FwZWQgc3RyaW5nIHNhZmUgZm9yIHVzZSBpbiByZWd1bGFyIGV4cHJlc3Npb25zLlxuICpcbiAqIEBmdW5jdGlvbiBlc2NhcGVSZWdFeHBcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTsgLy8gJCYgbWVhbnMgdGhlIHdob2xlIG1hdGNoZWQgc3RyaW5nXG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IFJlY29yZDxzdHJpbmcsIGFueT59IFthcmdzXSByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtdXG4pIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgIGlmIChcbiAgICAgICFhcmdzLmV2ZXJ5KChhcmcpID0+IHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIilcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBPbmx5IHN0cmluZyBhbmQgbnVtYmVyIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkIGZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMuYFxuICAgICAgKTtcbiAgfVxuXG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG9iaiA9IGFyZ3NbMF0gYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgIH0sIHN0cmluZyk7XG4gIH1cblxuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT09IFwidW5kZWZpbmVkXCJcbiAgICAgID8gYXJnc1tudW1iZXJdLnRvU3RyaW5nKClcbiAgICAgIDogXCJ1bmRlZmluZWRcIjtcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBzZWUgc2ZcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdGb3JtYXQgPSBzZjtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBhIGJyb3dzZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBmdW5jdGlvbiBpc0Jyb3dzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsVGhpcykpICE9PVxuICAgIE9iamVjdC5wcm90b3R5cGVcbiAgKTtcbn1cbiIsImltcG9ydCB7IE9iamVjdEFjY3VtdWxhdG9yIH0gZnJvbSBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiO1xuaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tIFwiLi93ZWJcIjtcbmltcG9ydCB7XG4gIEJyb3dzZXJFbnZLZXksXG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBFTlZfUEFUSF9ERUxJTUlURVIsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IHR5cGUgZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAqIEBzdW1tYXJ5IERlc2NyaWJlcyBmYWN0b3JpZXMgdGhhdCBjb25zdHJ1Y3Qge0BsaW5rIEVudmlyb25tZW50fSBkZXJpdmF0aXZlcyB3aXRoIGN1c3RvbSBpbml0aWFsaXphdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRoZSBFbnZpcm9ubWVudCB3aWxsIGFjY3VtdWxhdGUuXG4gKiBAdGVtcGxhdGUgRSAtIFRoZSBzcGVjaWZpYyBFbnZpcm9ubWVudCB0eXBlIHRvIGJlIGNyZWF0ZWQsIGV4dGVuZGluZyBFbnZpcm9ubWVudDxUPi5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih1bmtub3duW10pOiBFfSBFbnZpcm9ubWVudEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudEZhY3Rvcnk8VCBleHRlbmRzIG9iamVjdCwgRSBleHRlbmRzIEVudmlyb25tZW50PFQ+PiA9IChcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IEU7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudmlyb25tZW50IGFjY3VtdWxhdG9yIHRoYXQgbGF6aWx5IHJlYWRzIGZyb20gcnVudGltZSBzb3VyY2VzLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB7QGxpbmsgT2JqZWN0QWNjdW11bGF0b3J9IHRvIG1lcmdlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB3aGlsZSByZXNvbHZpbmcgdmFsdWVzIGZyb20gTm9kZSBvciBicm93c2VyIGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiBkZW1hbmQuXG4gKiBAdGVtcGxhdGUgVFxuICogQGNsYXNzIEVudmlyb25tZW50XG4gKiBAZXhhbXBsZVxuICogY29uc3QgQ29uZmlnID0gRW52aXJvbm1lbnQuYWNjdW11bGF0ZSh7IGxvZ2dpbmc6IHsgbGV2ZWw6IFwiaW5mb1wiIH0gfSk7XG4gKiBjb25zb2xlLmxvZyhDb25maWcubG9nZ2luZy5sZXZlbCk7XG4gKiBjb25zb2xlLmxvZyhTdHJpbmcoQ29uZmlnLmxvZ2dpbmcubGV2ZWwpKTsgLy8gPT4gTE9HR0lOR19fTEVWRUwga2V5IHdoZW4gc2VyaWFsaXplZFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRW52IGFzIEVudmlyb25tZW50XG4gKiAgIHBhcnRpY2lwYW50IFByb2Nlc3MgYXMgcHJvY2Vzcy5lbnZcbiAqICAgcGFydGljaXBhbnQgQnJvd3NlciBhcyBnbG9iYWxUaGlzLkVOVlxuICogICBDbGllbnQtPj5FbnY6IGFjY3VtdWxhdGUocGFydGlhbENvbmZpZylcbiAqICAgRW52LT4+RW52OiBleHBhbmQodmFsdWVzKVxuICogICBDbGllbnQtPj5FbnY6IENvbmZpZy5sb2dnaW5nLmxldmVsXG4gKiAgIGFsdCBCcm93c2VyIHJ1bnRpbWVcbiAqICAgICBFbnYtPj5Ccm93c2VyOiBsb29rdXAgRU5WIGtleVxuICogICAgIEJyb3dzZXItLT4+RW52OiByZXNvbHZlZCB2YWx1ZVxuICogICBlbHNlIE5vZGUgcnVudGltZVxuICogICAgIEVudi0+PlByb2Nlc3M6IGxvb2t1cCBFTlYga2V5XG4gKiAgICAgUHJvY2Vzcy0tPj5FbnY6IHJlc29sdmVkIHZhbHVlXG4gKiAgIGVuZFxuICogICBFbnYtLT4+Q2xpZW50OiBtZXJnZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBicm93c2VyIGFuZCBOb2RlLmpzIGVudmlyb25tZW50cyBieSBub3JtYWxpemluZyBrZXlzIGFuZCBwYXJzaW5nIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGsgLSBLZXkgdG8gcmVzb2x2ZSBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gVmFsdWUgcmVzb2x2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9XG4gICAgICAgIChcbiAgICAgICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICAgICAgW0Jyb3dzZXJFbnZLZXldOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFbnZWYWx1ZShlbnZba10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBzdHJpbmdpZmllZCBlbnZpcm9ubWVudCB2YWx1ZXMgaW50byBuYXRpdmUgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IEludGVycHJldHMgYm9vbGVhbnMgYW5kIG51bWJlcnMgd2hpbGUgbGVhdmluZyBvdGhlciB0eXBlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsIC0gUmF3IHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gUGFyc2VkIHZhbHVlIGNvbnZlcnRlZCB0byBib29sZWFuLCBudW1iZXIsIG9yIGxlZnQgYXMtaXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VFbnZWYWx1ZSh2YWw6IHVua25vd24pIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbDtcbiAgICBpZiAodmFsID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHZhbCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VGbG9hdCh2YWwpO1xuICAgIGlmICghaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHBhbmRzIGFuIG9iamVjdCBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBsYXp5IHByb3BlcnRpZXMgdGhhdCBmaXJzdCBjb25zdWx0IHJ1bnRpbWUgdmFyaWFibGVzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gc2VlZGVkIHZhbHVlcy5cbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgZXhwYW5kZWQuXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBPYmplY3QgdG8gZXhwb3NlIHRocm91Z2ggZW52aXJvbm1lbnQgZ2V0dGVycyBhbmQgc2V0dGVycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnJvbUVudiAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZyb21FbnY7XG4gICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHYgYXMgYW55LCBba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvdmlkZXMgYW4gZW1wdHkgc3RyaW5nLCBleHBvc2UgYSBwcm94eSB0aGF0IGNvbXBvc2VzIEVOViBrZXlzXG4gICAgICAgICAgaWYgKHYgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgW2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKHZhbDogVltrZXlvZiBWXSkgPT4ge1xuICAgICAgICAgIHYgPSB2YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgb25seSBvbmUge0BsaW5rIEVudmlyb25tZW50fSBpbnN0YW5jZSBpcyBjcmVhdGVkLCB3cmFwcGluZyBpdCBpbiBhIHByb3h5IHRvIGNvbXBvc2UgRU5WIGtleXMgb24gZGVtYW5kLlxuICAgKiBAdGVtcGxhdGUgRVxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIEFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGZhY3Rvcnkgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBzaW5nbGV0b24uXG4gICAqIEByZXR1cm4ge0V9IFNpbmdsZXRvbiBlbnZpcm9ubWVudCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U8RSBleHRlbmRzIEVudmlyb25tZW50PGFueT4+KC4uLmFyZ3M6IHVua25vd25bXSk6IEUge1xuICAgIGlmICghRW52aXJvbm1lbnQuX2luc3RhbmNlKSB7XG4gICAgICBjb25zdCBiYXNlID0gRW52aXJvbm1lbnQuZmFjdG9yeSguLi5hcmdzKSBhcyBFO1xuICAgICAgY29uc3QgcHJveGllZCA9IG5ldyBQcm94eShiYXNlIGFzIGFueSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gQXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBsb2dnaW5nIGNvbmZpZyBsb29rdXBzIGZvciBvcHRpb25hbCBmaWVsZHMgbGlrZSAnYXBwJ1xuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiYXBwXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIFtwcm9wXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgRW52aXJvbm1lbnQuX2luc3RhbmNlID0gcHJveGllZCBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmV3IHByb3BlcnRpZXMsIGhpZGluZyByYXcgZGVzY3JpcHRvcnMgdG8gYXZvaWQgbGVha2luZyBlbnVtZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBPYmplY3QgdG8gbWVyZ2UgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50fSBVcGRhdGVkIGVudmlyb25tZW50IHJlZmVyZW5jZS5cbiAgICovXG4gIHN0YXRpYyBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJlxuICAgIFYgJlxuICAgIE9iamVjdEFjY3VtdWxhdG9yPHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJiBWPiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBFbnZpcm9ubWVudC5pbnN0YW5jZSgpO1xuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlIGFzIGFueSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbnN0YW5jZSBhcyBhbnksIGtleSk7XG4gICAgICBpZiAoZGVzYyAmJiBkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLmVudW1lcmFibGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlIGFzIGFueSwga2V5LCB7XG4gICAgICAgICAgLi4uZGVzYyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmFjY3VtdWxhdGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWx1ZSB1c2luZyBhIGRvdC1wYXRoIGtleSBmcm9tIHRoZSBhY2N1bXVsYXRlZCBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgdG8gYWNjZXNzIHN0b3JlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gS2V5IHRvIHJlc29sdmUgZnJvbSB0aGUgZW52aXJvbm1lbnQgc3RvcmUuXG4gICAqIEByZXR1cm4ge3Vua25vd259IFN0b3JlZCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgcHJveHkgdGhhdCBjb21wb3NlcyBlbnZpcm9ubWVudCBrZXlzIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQWxsb3dzIGNoYWluZWQgcHJvcGVydHkgYWNjZXNzIHRvIGVtaXQgdXBwZXJjYXNlIEVOViBpZGVudGlmaWVycyB3aGlsZSBob25vcmluZyBleGlzdGluZyBydW50aW1lIG92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHthbnl9IGN1cnJlbnQgLSBTZWVkIG1vZGVsIHNlZ21lbnQgdXNlZCB3aGVuIHByb2plY3RpbmcgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBBY2N1bXVsYXRlZCBwYXRoIHNlZ21lbnRzIGxlYWRpbmcgdG8gdGhlIHByb3h5LlxuICAgKiBAcmV0dXJuIHthbnl9IFByb3h5IHRoYXQgcmVzb2x2ZXMgZW52aXJvbm1lbnQgdmFsdWVzIG9yIGNvbXBvc2VzIGFkZGl0aW9uYWwgcHJveGllcyBmb3IgZGVlcGVyIHBhdGhzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRFbnZQcm94eShjdXJyZW50OiBhbnksIHBhdGg6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBidWlsZEtleSA9IChwOiBzdHJpbmdbXSkgPT5cbiAgICAgIHAubWFwKChzZWcpID0+IHRvRU5WRm9ybWF0KHNlZykpLmpvaW4oRU5WX1BBVEhfREVMSU1JVEVSKTtcblxuICAgIC8vIEhlbHBlciB0byByZWFkIGZyb20gdGhlIGFjdGl2ZSBlbnZpcm9ubWVudCBnaXZlbiBhIGNvbXBvc2VkIGtleVxuICAgIGNvbnN0IHJlYWRFbnYgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgICBjb25zdCBlbnYgPSAoXG4gICAgICAgICAgZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICAgICAgICAgIFtCcm93c2VyRW52S2V5XT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XTtcbiAgICAgICAgcmV0dXJuIGVudiA/IGVudltrZXldIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSk/LnByb2Nlc3M/LmVudj8uW2tleV07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xuICAgICAgZ2V0KF90YXJnZXQsIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgPT09IFwidmFsdWVPZlwiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXh0TW9kZWwgPVxuICAgICAgICAgIGN1cnJlbnQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHByb3ApXG4gICAgICAgICAgICA/IChjdXJyZW50IGFzIGFueSlbcHJvcF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFsuLi5wYXRoLCBwcm9wXTtcbiAgICAgICAgY29uc3QgY29tcG9zZWRLZXkgPSBidWlsZEtleShuZXh0UGF0aCk7XG5cbiAgICAgICAgLy8gSWYgYW4gRU5WIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBwYXRoLCByZXR1cm4gaXQgZGlyZWN0bHlcbiAgICAgICAgY29uc3QgZW52VmFsdWUgPSByZWFkRW52KGNvbXBvc2VkS2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnZWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVudlZhbHVlO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIG1vZGVsIGhhcyBhbiBvYmplY3QgYXQgdGhpcyBwYXRoLCBrZWVwIGRyaWxsaW5nIHdpdGggYSBwcm94eVxuICAgICAgICBjb25zdCBpc05leHRPYmplY3QgPSBuZXh0TW9kZWwgJiYgdHlwZW9mIG5leHRNb2RlbCA9PT0gXCJvYmplY3RcIjtcbiAgICAgICAgaWYgKGlzTmV4dE9iamVjdCkgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkobmV4dE1vZGVsLCBuZXh0UGF0aCk7XG5cbiAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhIHByb3h5IGZvciBmdXJ0aGVyIHBhdGggY29tcG9zaXRpb24gd2hlbiBubyBFTlYgdmFsdWU7XG4gICAgICAgIC8vIGRvIG5vdCBzdXJmYWNlIHByaW1pdGl2ZSBtb2RlbCBkZWZhdWx0cyBoZXJlICh0aGlzIEFQSSBpcyBmb3Iga2V5IGNvbXBvc2l0aW9uKS5cbiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodW5kZWZpbmVkLCBuZXh0UGF0aCk7XG4gICAgICB9LFxuICAgICAgb3duS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPyBSZWZsZWN0Lm93bktleXMoY3VycmVudCkgOiBbXTtcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3QsIHApIHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBwKSkge1xuICAgICAgICAgIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHt9IGFzIGFueTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBrZXlzIG9mIHRoZSBlbnZpcm9ubWVudCwgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gdG8gRU5WIGZvcm1hdC5cbiAgICogQHN1bW1hcnkgR2V0cyBhbGwga2V5cyBpbiB0aGUgZW52aXJvbm1lbnQsIHdpdGggYW4gb3B0aW9uIHRvIGZvcm1hdCB0aGVtIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvRW52PXRydWVdIC0gV2hldGhlciB0byBjb252ZXJ0IHRoZSBrZXlzIHRvIEVOViBmb3JtYXQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgc3RhdGljIGtleXModG9FbnY6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5pbnN0YW5jZSgpXG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChrKSA9PiAodG9FbnYgPyB0b0VOVkZvcm1hdChrKSA6IGspKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaW5nbGV0b24gZW52aXJvbm1lbnQgaW5zdGFuY2Ugc2VlZGVkIHdpdGggZGVmYXVsdCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAc3VtbWFyeSBDb21iaW5lcyB7QGxpbmsgRGVmYXVsdExvZ2dpbmdDb25maWd9IHdpdGggcnVudGltZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcHJvdmlkZSBjb25zaXN0ZW50IGxvZ2dpbmcgZGVmYXVsdHMgYWNyb3NzIHBsYXRmb3Jtcy5cbiAqIEBjb25zdCBMb2dnZWRFbnZpcm9ubWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBMb2dnZWRFbnZpcm9ubWVudCA9IEVudmlyb25tZW50LmFjY3VtdWxhdGUoXG4gIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRMb2dnaW5nQ29uZmlnLCB7XG4gICAgZW52OlxuICAgICAgKGlzQnJvd3NlcigpICYmIChnbG9iYWxUaGlzIGFzIGFueSlbQnJvd3NlckVudktleV1cbiAgICAgICAgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldW1wiTk9ERV9FTlZcIl1cbiAgICAgICAgOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnByb2Nlc3MuZW52W1wiTk9ERV9FTlZcIl0pIHx8IFwiZGV2ZWxvcG1lbnRcIixcbiAgfSlcbik7XG4iLCJpbXBvcnQge1xuICBMb2dnZXJGYWN0b3J5LFxuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIExvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IERlZmF1bHRUaGVtZSwgTG9nTGV2ZWwsIE51bWVyaWNMb2dMZXZlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4vdGV4dFwiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9lbnZpcm9ubWVudFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMsIHZlcmJvc2l0eSxcbiAqIGNvbnRleHQtYXdhcmUgbG9nZ2luZywgYW5kIGN1c3RvbWl6YWJsZSBmb3JtYXR0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBUaGUgY29udGV4dCAodHlwaWNhbGx5IGNsYXNzIG5hbWUpIHRoaXMgbG9nZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICogQHBhcmFtIHtQYXJ0aWFsPExvZ2dpbmdDb25maWc+fSBjb25mIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBnbG9iYWwgc2V0dGluZ3NcbiAqIEBjbGFzcyBNaW5pTG9nZ2VyXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IGxvZ2dlciBmb3IgYSBjbGFzc1xuICogY29uc3QgbG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoJ015Q2xhc3MnKTtcbiAqXG4gKiAvLyBMb2cgbWVzc2FnZXMgYXQgZGlmZmVyZW50IGxldmVsc1xuICogbG9nZ2VyLmluZm8oJ1RoaXMgaXMgYW4gaW5mbyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1RoaXMgaXMgYSBkZWJ1ZyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZFxuICogY29uc3QgbWV0aG9kTG9nZ2VyID0gbG9nZ2VyLmZvcignbXlNZXRob2QnKTtcbiAqIG1ldGhvZExvZ2dlci52ZXJib3NlKCdEZXRhaWxlZCBpbmZvcm1hdGlvbicsIDIpO1xuICpcbiAqIC8vIExvZyB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uXG4gKiBsb2dnZXIuZm9yKCdzcGVjaWFsTWV0aG9kJywgeyBzdHlsZTogdHJ1ZSB9KS5pbmZvKCdTdHlsZWQgbWVzc2FnZScpO1xuICovXG5leHBvcnQgY2xhc3MgTWluaUxvZ2dlciBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICkge31cblxuICBwcm90ZWN0ZWQgY29uZmlnKFxuICAgIGtleToga2V5b2YgTG9nZ2luZ0NvbmZpZ1xuICApOiBMb2dnaW5nQ29uZmlnW2tleW9mIExvZ2dpbmdDb25maWddIHtcbiAgICBpZiAodGhpcy5jb25mICYmIGtleSBpbiB0aGlzLmNvbmYpIHJldHVybiB0aGlzLmNvbmZba2V5XTtcbiAgICByZXR1cm4gTG9nZ2luZy5nZXRDb25maWcoKVtrZXldO1xuICB9XG5cbiAgZm9yKG1ldGhvZDogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSk6IExvZ2dlcjtcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPik6IExvZ2dlcjtcbiAgZm9yKFxuICAgIG1ldGhvZDogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IExvZ2dlcjtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZCBvciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCBleHRlbmRlZCBieSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBjcmVhdGUgYSBsb2dnZXIgZm9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBzZXR0aW5nc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbG9nZ2VyIGZhY3RvcnlcbiAgICogQHJldHVybiB7TG9nZ2VyfSBBIG5ldyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kXG4gICAqL1xuICBmb3IoXG4gICAgbWV0aG9kPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyIHtcbiAgICBpZiAoIWNvbmZpZyAmJiB0eXBlb2YgbWV0aG9kID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25maWcgPSBtZXRob2Q7XG4gICAgICBtZXRob2QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1ldGhvZFxuICAgICAgICA/IHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IG1ldGhvZFxuICAgICAgICAgIDogKG1ldGhvZCBhcyBhbnkpLm5hbWVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwID09PSBcImNvbmZpZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLmNvbmZpZywge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcy5jb25maWcsIHA6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIHAgaW4gY29uZmlnKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbcCBhcyBrZXlvZiBMb2dnaW5nQ29uZmlnXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gXCJjb250ZXh0XCIgJiYgbWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHQsIG1ldGhvZF0uam9pbihcIi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBmb3JtYXR0ZWQgbG9nIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBsb2cgc3RyaW5nIHdpdGggdGltZXN0YW1wLCBjb2xvcmVkIGxvZyBsZXZlbCwgY29udGV4dCwgYW5kIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIGZvciB0aGlzIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlIHwgRXJyb3J9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBsb2cgb3IgYW4gRXJyb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JdIC0gT3B0aW9uYWwgZXJyb3IgdG8gZXh0cmFjdCBzdGFjayB0cmFjZSB0byBpbmNsdWRlIGluIHRoZSBsb2dcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIGZvcm1hdHRlZCBsb2cgc3RyaW5nIHdpdGggYWxsIGNvbXBvbmVudHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBlcnJvcj86IEVycm9yXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nOiBSZWNvcmQ8XG4gICAgICB8IFwidGltZXN0YW1wXCJcbiAgICAgIHwgXCJsZXZlbFwiXG4gICAgICB8IFwiY29udGV4dFwiXG4gICAgICB8IFwiY29ycmVsYXRpb25JZFwiXG4gICAgICB8IFwibWVzc2FnZVwiXG4gICAgICB8IFwic2VwYXJhdG9yXCJcbiAgICAgIHwgXCJzdGFja1wiXG4gICAgICB8IFwiYXBwXCIsXG4gICAgICBzdHJpbmdcbiAgICA+ID0ge30gYXMgYW55O1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5jb25maWcoXCJzdHlsZVwiKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSB0aGlzLmNvbmZpZyhcInNlcGFyYXRvclwiKTtcbiAgICBjb25zdCBhcHAgPSB0aGlzLmNvbmZpZyhcImFwcFwiKTtcbiAgICBpZiAoYXBwKVxuICAgICAgbG9nLmFwcCA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShhcHAgYXMgc3RyaW5nLCBcImFwcFwiLCBsZXZlbClcbiAgICAgICAgOiAoYXBwIGFzIHN0cmluZyk7XG5cbiAgICBpZiAoc2VwYXJhdG9yKVxuICAgICAgbG9nLnNlcGFyYXRvciA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShzZXBhcmF0b3IgYXMgc3RyaW5nLCBcInNlcGFyYXRvclwiLCBsZXZlbClcbiAgICAgICAgOiAoc2VwYXJhdG9yIGFzIHN0cmluZyk7XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJ0aW1lc3RhbXBcIikpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBzdHlsZSA/IExvZ2dpbmcudGhlbWUoZGF0ZSwgXCJ0aW1lc3RhbXBcIiwgbGV2ZWwpIDogZGF0ZTtcbiAgICAgIGxvZy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwibG9nTGV2ZWxcIikpIHtcbiAgICAgIGNvbnN0IGx2bDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKGxldmVsLCBcImxvZ0xldmVsXCIsIGxldmVsKVxuICAgICAgICA6IGxldmVsO1xuICAgICAgbG9nLmxldmVsID0gbHZsLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29ycmVsYXRpb25JZFwiKSkge1xuICAgICAge1xuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpLCBcImlkXCIsIGxldmVsKVxuICAgICAgICAgIDogdGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpO1xuICAgICAgICBsb2cuY29ycmVsYXRpb25JZCA9IGlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1zZzogc3RyaW5nID0gc3R5bGVcbiAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICBsZXZlbFxuICAgICAgICApXG4gICAgICA6IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWVzc2FnZVxuICAgICAgICA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgIGxvZy5tZXNzYWdlID0gbXNnO1xuICAgIGlmIChlcnJvciB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKGVycm9yPy5zdGFjayB8fCAobWVzc2FnZSBhcyBFcnJvcikuc3RhY2spIGFzIHN0cmluZyxcbiAgICAgICAgICAgIFwic3RhY2tcIixcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgKVxuICAgICAgICA6IGVycm9yPy5zdGFjayB8fCBcIlwiO1xuICAgICAgbG9nLnN0YWNrID0gYCB8ICR7KGVycm9yIHx8IChtZXNzYWdlIGFzIEVycm9yKSkubWVzc2FnZX0gLSBTdGFjayB0cmFjZTpcXG4ke3N0YWNrfWA7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZyhcImZvcm1hdFwiKSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxvZyk7XG4gICAgICBjYXNlIFwicmF3XCI6XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcoXCJwYXR0ZXJuXCIpIGFzIHN0cmluZylcbiAgICAgICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAgICAgLm1hcCgocykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzLm1hdGNoKC9cXHsuKj99L2cpKSByZXR1cm4gcztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFMgPSBzZihzLCBsb2cpO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlZFMgIT09IHMpIHJldHVybiBmb3JtYXR0ZWRTO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGZvcm1hdDogJHt0aGlzLmNvbmZpZyhcImZvcm1hdFwiKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWxcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgZm9ybWF0dGVkIGxvZ1xuICAgKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlIHwgRXJyb3J9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZCBvciBhbiBFcnJvciBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvcl0gLSBPcHRpb25hbCBzdGFjayB0cmFjZSB0byBpbmNsdWRlIGluIHRoZSBsb2dcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBsb2cobGV2ZWw6IExvZ0xldmVsLCBtc2c6IFN0cmluZ0xpa2UgfCBFcnJvciwgZXJyb3I/OiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZMdmwgPSB0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsO1xuICAgIGlmIChOdW1lcmljTG9nTGV2ZWxzW2NvbmZMdmxdIDwgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF0pIHJldHVybjtcbiAgICBsZXQgbWV0aG9kO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuYmVuY2htYXJrOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmxvZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBiZW5jaG1hcmsgbGV2ZWxcbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGJlbmNobWFyayBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgc2V0dGluZyBhbGxvd3MgaXRcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGJlbmNobWFyayhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5iZW5jaG1hcmssIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBzaWxseSBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgc2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IHNldHRpbmcgYWxsb3dzIGl0XG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSB2ZXJib3NlIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSB2ZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBzZXR0aW5nIGFsbG93cyBpdFxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3ZlcmJvc2l0eT0wXSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBpbmZvIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBpbmZvIGxldmVsIGZvciBnZW5lcmFsIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmluZm8sIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBkZWJ1ZyBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgZGVidWcgbGV2ZWwgZm9yIGRldGFpbGVkIHRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZGVidWcsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBlcnJvciBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgZXJyb3IgbGV2ZWwgZm9yIGVycm9ycyBhbmQgZXhjZXB0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2UgfCBFcnJvcn0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkIG9yIGFuIEVycm9yIG9iamVjdFxuICAgKiBAcGFyYW0gZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZXJyb3IobXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsIGU/OiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmVycm9yLCBtc2csIGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSBsb2dnZXIgY29uZmlndXJhdGlvblxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZXhpc3RpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbmYgPSB7IC4uLih0aGlzLmNvbmYgfHwge30pLCAuLi5jb25maWcgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YXRpYyBjbGFzcyBmb3IgbWFuYWdpbmcgbG9nZ2luZyBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTG9nZ2luZyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggc3VwcG9ydCBmb3JcbiAqIGRpZmZlcmVudCBsb2cgbGV2ZWxzLCB2ZXJib3NpdHksIGFuZCBzdHlsaW5nLiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFpbnRhaW4gYSBnbG9iYWxcbiAqIGxvZ2dlciBpbnN0YW5jZSBhbmQgYWxsb3dzIGNyZWF0aW5nIHNwZWNpZmljIGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtZXRob2RzLlxuICogQGNsYXNzIExvZ2dpbmdcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAqIExvZ2dpbmcuc2V0Q29uZmlnKHsgbGV2ZWw6IExvZ0xldmVsLmRlYnVnLCBzdHlsZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBHZXQgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgY2xhc3NcbiAqIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzJyk7XG4gKlxuICogLy8gTG9nIG1lc3NhZ2VzIGF0IGRpZmZlcmVudCBsZXZlbHNcbiAqIGxvZ2dlci5pbmZvKCdBcHBsaWNhdGlvbiBzdGFydGVkJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgZGF0YS4uLicpO1xuICpcbiAqIC8vIExvZyB3aXRoIGNvbnRleHRcbiAqIGNvbnN0IG1ldGhvZExvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzLm15TWV0aG9kJyk7XG4gKiBtZXRob2RMb2dnZXIudmVyYm9zZSgnRGV0YWlsZWQgb3BlcmF0aW9uIGluZm9ybWF0aW9uJywgMSk7XG4gKlxuICogLy8gTG9nIGVycm9yc1xuICogdHJ5IHtcbiAqICAgLy8gc29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGxvZ2dlci5lcnJvcihlcnJvcik7XG4gKiB9XG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIExvZ2dlciB7XG4gKiAgICAgPDxpbnRlcmZhY2U+PlxuICogICAgICtmb3IobWV0aG9kLCBjb25maWcsIC4uLmFyZ3MpXG4gKiAgICAgK3NpbGx5KG1zZywgdmVyYm9zaXR5KVxuICogICAgICt2ZXJib3NlKG1zZywgdmVyYm9zaXR5KVxuICogICAgICtpbmZvKG1zZylcbiAqICAgICArZGVidWcobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK3NldENvbmZpZyhjb25maWcpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIExvZ2dpbmcge1xuICogICAgIC1nbG9iYWw6IExvZ2dlclxuICogICAgIC1fZmFjdG9yeTogTG9nZ2VyRmFjdG9yeVxuICogICAgIC1fY29uZmlnOiBMb2dnaW5nQ29uZmlnXG4gKiAgICAgK3NldEZhY3RvcnkoZmFjdG9yeSlcbiAqICAgICArc2V0Q29uZmlnKGNvbmZpZylcbiAqICAgICArZ2V0Q29uZmlnKClcbiAqICAgICArZ2V0KClcbiAqICAgICArdmVyYm9zZShtc2csIHZlcmJvc2l0eSlcbiAqICAgICAraW5mbyhtc2cpXG4gKiAgICAgK2RlYnVnKG1zZylcbiAqICAgICArc2lsbHkobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK2ZvcihvYmplY3QsIGNvbmZpZywgLi4uYXJncylcbiAqICAgICArYmVjYXVzZShyZWFzb24sIGlkKVxuICogICAgICt0aGVtZSh0ZXh0LCB0eXBlLCBsb2dnZXJMZXZlbCwgdGVtcGxhdGUpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE1pbmlMb2dnZXIge1xuICogICAgICtjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb25mPylcbiAqICAgfVxuICpcbiAqICAgTG9nZ2luZyAuLj4gTG9nZ2VyIDogY3JlYXRlc1xuICogICBMb2dnaW5nIC4uPiBNaW5pTG9nZ2VyIDogY3JlYXRlcyBieSBkZWZhdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbD86IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXNcbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgbmV3IExvZ2dlciBpbnN0YW5jZXMuIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBNaW5pTG9nZ2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIF9jb25maWc6IHR5cGVvZiBMb2dnZWRFbnZpcm9ubWVudCA9IExvZ2dlZEVudmlyb25tZW50O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9nZ2VyIGluc3RhbmNlc1xuICAgKiBAc3VtbWFyeSBBbGxvd3MgY3VzdG9taXppbmcgaG93IGxvZ2dlciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHtMb2dnZXJGYWN0b3J5fSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gdXNlIGZvciBjcmVhdGluZyBsb2dnZXJzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0RmFjdG9yeShmYWN0b3J5OiBMb2dnZXJGYWN0b3J5KSB7XG4gICAgTG9nZ2luZy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHN1bW1hcnkgQWxsb3dzIHVwZGF0aW5nIHRoZSBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uIHdpdGggbmV3IHNldHRpbmdzXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhjb25maWcpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgKHRoaXMuX2NvbmZpZyBhcyBhbnkpW2tdID0gdiBhcyBhbnk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtMb2dnaW5nQ29uZmlnfSBBIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldENvbmZpZygpOiB0eXBlb2YgTG9nZ2VkRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyBnbG9iYWwgbG9nZ2VyIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIGdsb2JhbCBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IExvZ2dlciB7XG4gICAgdGhpcy5nbG9iYWwgPSB0aGlzLmdsb2JhbCA/IHRoaXMuZ2xvYmFsIDogdGhpcy5fZmFjdG9yeShcIkxvZ2dpbmdcIik7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc3RhdGljIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS52ZXJib3NlKG1zZywgdmVyYm9zaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgaW5mbyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuaW5mbyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmRlYnVnKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBiZW5jaG1hcmsgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBiZW5jaG1hcmsgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBiZW5jaG1hcmsobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuYmVuY2htYXJrKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgc2lsbHkobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuc2lsbHkobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGVycm9yIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBlXG4gICAqL1xuICBzdGF0aWMgZXJyb3IobXNnOiBTdHJpbmdMaWtlLCBlPzogRXJyb3IpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5lcnJvcihtc2csIGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG9iamVjdCBvciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IG9yIGNvbnRleHQgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtMb2dnaW5nQ29udGV4dH0gb2JqZWN0IC0gVGhlIG9iamVjdCwgY2xhc3MsIG9yIGNvbnRleHQgdG8gY3JlYXRlIGEgbG9nZ2VyIGZvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IFtjb25maWddIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBnbG9iYWwgc2V0dGluZ3NcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBsb2dnZXIgZmFjdG9yeVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IEEgbmV3IGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3Qgb3IgY29udGV4dFxuICAgKi9cbiAgc3RhdGljIGZvcihcbiAgICBvYmplY3Q6IExvZ2dpbmdDb250ZXh0LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyIHtcbiAgICBvYmplY3QgPVxuICAgICAgdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IG9iamVjdC5jb25zdHJ1Y3RvclxuICAgICAgICAgID8gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICA6IG9iamVjdC5uYW1lO1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KG9iamVjdCwgY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29ycmVsYXRpb24gY29udGV4dFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IHRvIHF1aWNrbHkgY3JlYXRlIGEgbG9nZ2VyIGxhYmVsZWQgd2l0aCBhIGZyZWUtZm9ybSByZWFzb24gYW5kIG9wdGlvbmFsIGlkZW50aWZpZXJcbiAgICogc28gdGhhdCBhZC1ob2Mgb3BlcmF0aW9ucyBjYW4gYmUgdHJhY2VkIHdpdGhvdXQgdHlpbmcgdGhlIGxvZ2dlciB0byBhIGNsYXNzIG9yIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gQSB0ZXh0dWFsIHJlYXNvbiBvciBjb250ZXh0IGxhYmVsIGZvciB0aGlzIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaGVscCBjb3JyZWxhdGUgcmVsYXRlZCBsb2cgZW50cmllc1xuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IEEgbmV3IGxvZ2dlciBpbnN0YW5jZSBsYWJlbGVkIHdpdGggdGhlIHByb3ZpZGVkIHJlYXNvbiBhbmQgaWRcbiAgICovXG4gIHN0YXRpYyBiZWNhdXNlKHJlYXNvbjogc3RyaW5nLCBpZD86IHN0cmluZyk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3RvcnkocmVhc29uLCB0aGlzLl9jb25maWcsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGVtZSBzdHlsaW5nIHRvIHRleHRcbiAgICogQHN1bW1hcnkgQXBwbGllcyBzdHlsaW5nIChjb2xvcnMsIGZvcm1hdHRpbmcpIHRvIHRleHQgYmFzZWQgb24gdGhlIHRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBzdHlsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gc3R5bGUgKGUuZy4sIFwiY2xhc3NcIiwgXCJtZXNzYWdlXCIsIFwibG9nTGV2ZWxcIilcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbG9nZ2VyTGV2ZWwgLSBUaGUgbG9nIGxldmVsIHRvIHVzZSBmb3Igc3R5bGluZ1xuICAgKiBAcGFyYW0ge1RoZW1lfSBbdGVtcGxhdGU9RGVmYXVsdFRoZW1lXSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3R5bGVkIHRleHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgVGhlbWUgYXMgTG9nZ2luZy50aGVtZVxuICAgKiAgIHBhcnRpY2lwYW50IEFwcGx5IGFzIGFwcGx5IGZ1bmN0aW9uXG4gICAqICAgcGFydGljaXBhbnQgU3R5bGUgYXMgc3R5bGVkLXN0cmluZy1idWlsZGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+VGhlbWU6IHRoZW1lKHRleHQsIHR5cGUsIGxvZ2dlckxldmVsKVxuICAgKiAgIFRoZW1lLT4+VGhlbWU6IENoZWNrIGlmIHN0eWxpbmcgaXMgZW5hYmxlZFxuICAgKiAgIGFsdCBzdHlsaW5nIGRpc2FibGVkXG4gICAqICAgICBUaGVtZS0tPj5DYWxsZXI6IHJldHVybiBvcmlnaW5hbCB0ZXh0XG4gICAqICAgZWxzZSBzdHlsaW5nIGVuYWJsZWRcbiAgICogICAgIFRoZW1lLT4+VGhlbWU6IEdldCB0aGVtZSBmb3IgdHlwZVxuICAgKiAgICAgYWx0IHRoZW1lIG5vdCBmb3VuZFxuICAgKiAgICAgICBUaGVtZS0tPj5DYWxsZXI6IHJldHVybiBvcmlnaW5hbCB0ZXh0XG4gICAqICAgICBlbHNlIHRoZW1lIGZvdW5kXG4gICAqICAgICAgIFRoZW1lLT4+VGhlbWU6IERldGVybWluZSBhY3R1YWwgdGhlbWUgYmFzZWQgb24gbG9nIGxldmVsXG4gICAqICAgICAgIFRoZW1lLT4+QXBwbHk6IEFwcGx5IGVhY2ggc3R5bGUgcHJvcGVydHlcbiAgICogICAgICAgQXBwbHktPj5TdHlsZTogQXBwbHkgY29sb3JzIGFuZCBmb3JtYXR0aW5nXG4gICAqICAgICAgIFN0eWxlLS0+PkFwcGx5OiBSZXR1cm4gc3R5bGVkIHRleHRcbiAgICogICAgICAgQXBwbHktLT4+VGhlbWU6IFJldHVybiBzdHlsZWQgdGV4dFxuICAgKiAgICAgICBUaGVtZS0tPj5DYWxsZXI6IFJldHVybiBmaW5hbCBzdHlsZWQgdGV4dFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgdGhlbWUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IGtleW9mIFRoZW1lIHwga2V5b2YgTG9nTGV2ZWwsXG4gICAgbG9nZ2VyTGV2ZWw6IExvZ0xldmVsLFxuICAgIHRlbXBsYXRlOiBUaGVtZSA9IERlZmF1bHRUaGVtZVxuICApIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zdHlsZSkgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IodGhpcy50aGVtZSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseShcbiAgICAgIHR4dDogc3RyaW5nLFxuICAgICAgb3B0aW9uOiBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdIHwgc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdDogc3RyaW5nIHwgU3R5bGVkU3RyaW5nID0gdHh0O1xuICAgICAgICBsZXQgYyA9IHN0eWxlKHQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoXG4gICAgICAgICAgdmFsOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBpc0JnID0gZmFsc2VcbiAgICAgICAgKTogU3R5bGVkU3RyaW5nIHtcbiAgICAgICAgICBsZXQgZjpcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuYmFja2dyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLnJnYlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5jb2xvcjI1NiA9IGlzQmcgPyBjLmJhY2tncm91bmQgOiBjLmZvcmVncm91bmQ7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iYWNrZ3JvdW5kIHwgdHlwZW9mIGMuZm9yZWdyb3VuZCkuY2FsbChcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnQ29sb3IyNTYgOiBjLmNvbG9yMjU2O1xuICAgICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmdDb2xvcjI1NiB8IHR5cGVvZiBjLmNvbG9yMjU2KSh2YWxbMF0pO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdSZ2IgOiBjLnJnYjtcbiAgICAgICAgICAgICAgcmV0dXJuIGMucmdiKHZhbFswXSwgdmFsWzFdLCB2YWxbMl0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCBjb2xvciBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUodCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUodjogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjID0gYy5zdHlsZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGNbdiBhcyBrZXlvZiBDb2xvcml6ZU9wdGlvbnNdIGFzIFN0eWxlZFN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJiZ1wiOlxuICAgICAgICAgIGNhc2UgXCJmZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29sb3IodmFsdWUgYXMgbnVtYmVyKS50ZXh0O1xuICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goYXBwbHlTdHlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBseVN0eWxlKHZhbHVlIGFzIG51bWJlciB8IHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYy50ZXh0O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIHRoZW1lIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgYXBwbHlpbmcgc3R5bGU6ICR7b3B0aW9ufSB3aXRoIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaXZpZHVhbFRoZW1lID0gdGVtcGxhdGVbdHlwZSBhcyBrZXlvZiBUaGVtZV07XG4gICAgaWYgKCFpbmRpdmlkdWFsVGhlbWUgfHwgIU9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsVGhlbWU6IFRoZW1lT3B0aW9uID0gaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uO1xuXG4gICAgY29uc3QgbG9nTGV2ZWxzID0gT2JqZWN0LmFzc2lnbih7fSwgTG9nTGV2ZWwpO1xuICAgIGlmIChPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpWzBdIGluIGxvZ0xldmVscylcbiAgICAgIGFjdHVhbFRoZW1lID1cbiAgICAgICAgKGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwpW2xvZ2dlckxldmVsXSB8fCB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3R1YWxUaGVtZSkucmVkdWNlKChhY2M6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IChhY3R1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbilba2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uXTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICBhY2MsXG4gICAgICAgICAga2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgICAgIHZhbCBhc1xuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgIHwgW251bWJlcl1cbiAgICAgICAgICAgIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICB8IG51bWJlcltdXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgcmVhZHktdG8tdXNlIGxvZ2dlciBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFN1cHBsaWVzIGluaGVyaXRpbmcgY2xhc3NlcyB3aXRoIGEgbGF6aWx5IGNyZWF0ZWQsIGNvbnRleHQtYXdhcmUge0BsaW5rIExvZ2dlcn0gdmlhIHRoZSBwcm90ZWN0ZWQgYGxvZ2AgZ2V0dGVyLCBwcm9tb3RpbmcgY29uc2lzdGVudCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgd2l0aG91dCBtYW51YWwgd2lyaW5nLlxuICogQGNsYXNzIExvZ2dlZENsYXNzXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gKiAgIGNyZWF0ZSh1c2VyOiBVc2VyKSB7XG4gKiAgICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdXNlciAke3VzZXIuaWR9YCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBzdmMgPSBuZXcgVXNlclNlcnZpY2UoKTtcbiAqIHN2Yy5jcmVhdGUoeyBpZDogXCI0MlwiIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5zdGFuY2UgYXMgU3ViY2xhc3MgSW5zdGFuY2VcbiAqICAgcGFydGljaXBhbnQgR2V0dGVyIGFzIExvZ2dlZENsYXNzLmxvZ1xuICogICBwYXJ0aWNpcGFudCBMb2dnaW5nIGFzIExvZ2dpbmdcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dlclxuICpcbiAqICAgQ2xpZW50LT4+SW5zdGFuY2U6IGNhbGwgc29tZU1ldGhvZCgpXG4gKiAgIEluc3RhbmNlLT4+R2V0dGVyOiBhY2Nlc3MgdGhpcy5sb2dcbiAqICAgR2V0dGVyLT4+TG9nZ2luZzogTG9nZ2luZy5mb3IodGhpcylcbiAqICAgTG9nZ2luZy0tPj5HZXR0ZXI6IHJldHVybiBMb2dnZXJcbiAqICAgR2V0dGVyLS0+Pkluc3RhbmNlOiByZXR1cm4gTG9nZ2VyXG4gKiAgIEluc3RhbmNlLT4+TG9nZ2VyOiBpbmZvL2RlYnVnL2Vycm9yKC4uLilcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBfbG9nPzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGF6aWx5IHByb3ZpZGVzIGEgY29udGV4dC1hd2FyZSBsb2dnZXIgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBDYWxscyB7QGxpbmsgTG9nZ2luZy5mb3J9IHdpdGggdGhlIHN1YmNsYXNzIGluc3RhbmNlIHRvIG9idGFpbiBhIGxvZ2dlciB3aG9zZSBjb250ZXh0IG1hdGNoZXMgdGhlIHN1YmNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gTG9nZ2VyIGJvdW5kIHRvIHRoZSBzdWJjbGFzcyBjb250ZXh0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZykgdGhpcy5fbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nQ29uZmlnLCBMb2dnaW5nRmlsdGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCIuLi9Mb2dnZWRDbGFzc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNsYXNzIGZvciBtZXNzYWdlIGZpbHRlcnMgdGhhdCBwbHVnIGludG8gdGhlIGxvZ2dpbmcgcGlwZWxpbmUuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHtAbGluayBMb2dnZWRDbGFzc30gdG8gc3VwcGx5IGEgc2NvcGVkIGxvZ2dlciBhbmQgZGVmaW5lcyB0aGUgY29udHJhY3QgcmVxdWlyZWQgYnkge0BsaW5rIExvZ2dpbmdGaWx0ZXJ9IGltcGxlbWVudGVycyB0aGF0IHRyYW5zZm9ybSBvciBkcm9wIGxvZyBtZXNzYWdlcyBiZWZvcmUgZW1pc3Npb24uXG4gKiBAY2xhc3MgTG9nRmlsdGVyXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgUmVkYWN0U2VjcmV0c0ZpbHRlciBleHRlbmRzIExvZ0ZpbHRlciB7XG4gKiAgIGZpbHRlcihjb25maWc6IExvZ2dpbmdDb25maWcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvc2VjcmV0L2dpLCBcIioqKlwiKTtcbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IGZpbHRlciA9IG5ldyBSZWRhY3RTZWNyZXRzRmlsdGVyKCk7XG4gKiBmaWx0ZXIuZmlsdGVyKHsgLi4uRGVmYXVsdExvZ2dpbmdDb25maWcsIHZlcmJvc2U6IDAgfSwgXCJzZWNyZXQgdG9rZW5cIik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlclxuICogICBwYXJ0aWNpcGFudCBGaWx0ZXIgYXMgTG9nRmlsdGVyXG4gKiAgIHBhcnRpY2lwYW50IEltcGwgYXMgQ29uY3JldGVGaWx0ZXJcbiAqICAgcGFydGljaXBhbnQgT3V0cHV0XG4gKiAgIExvZ2dlci0+PkZpbHRlcjogZmlsdGVyKGNvbmZpZywgbWVzc2FnZSwgY29udGV4dClcbiAqICAgRmlsdGVyLT4+SW1wbDogZGVsZWdhdGUgdG8gc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAqICAgSW1wbC0tPj5GaWx0ZXI6IHRyYW5zZm9ybWVkIG1lc3NhZ2VcbiAqICAgRmlsdGVyLS0+Pk91dHB1dDogcmV0dXJuIGZpbHRlcmVkIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ0ZpbHRlciBleHRlbmRzIExvZ2dlZENsYXNzIGltcGxlbWVudHMgTG9nZ2luZ0ZpbHRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2NvcGVkIGxvZ2dlciB0aGF0IGV4Y2x1ZGVzIG90aGVyIGZpbHRlcnMgZnJvbSB0aGUgY2hhaW4uXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjaGlsZCBsb2dnZXIgZGVkaWNhdGVkIHRvIHRoZSBmaWx0ZXIsIHByZXZlbnRpbmcgcmVjdXJzaXZlIGZpbHRlciBpbnZvY2F0aW9uIHdoZW4gZW1pdHRpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBDb250ZXh0LWF3YXJlIGxvZ2dlciBmb3IgdGhlIGZpbHRlciBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gc3VwZXIubG9nLmZvcih0aGlzIGFzIGFueSwgeyBmaWx0ZXJzOiBbXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNmb3JtIG9yIHN1cHByZXNzIGEgbG9nIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IEluc3BlY3QgdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYW5kIGNvbnRleHQgdG8gcHJvZHVjZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBzdWJzZXF1ZW50IGZpbHRlcnMgb3IgZW1pdHRlcnMuXG4gICAqIEBwYXJhbSB7TG9nZ2luZ0NvbmZpZ30gY29uZmlnIC0gQWN0aXZlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBPcmlnaW5hbCBsb2cgbWVzc2FnZSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjb250ZXh0IC0gQ29udGV4dCB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRmlsdGVyZWQgbWVzc2FnZSB0byBwYXNzIHRvIGRvd25zdHJlYW0gcHJvY2Vzc2luZy5cbiAgICovXG4gIGFic3RyYWN0IGZpbHRlcihcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ6IHN0cmluZ1tdXG4gICk6IHN0cmluZztcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFNuYXBzaG90IG9mIGEgcmVjb3JkZWQgbGFwIGludGVydmFsLlxuICogQHN1bW1hcnkgQ2FwdHVyZXMgdGhlIGxhcCBpbmRleCwgb3B0aW9uYWwgbGFiZWwsIGVsYXBzZWQgbWlsbGlzZWNvbmRzIGZvciB0aGUgbGFwLCBhbmQgY3VtdWxhdGl2ZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHN0b3B3YXRjaCBzdGFydGVkLlxuICogQHR5cGVkZWYge09iamVjdH0gTGFwXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXggLSBaZXJvLWJhc2VkIGxhcCBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFiZWxdIC0gT3B0aW9uYWwgbGFiZWwgZGVzY3JpYmluZyB0aGUgbGFwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1zIC0gRHVyYXRpb24gb2YgdGhlIGxhcCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG90YWxNcyAtIFRvdGFsIGVsYXBzZWQgdGltZSB3aGVuIHRoZSBsYXAgd2FzIHJlY29yZGVkLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIExhcCA9IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBEdXJhdGlvbiBvZiB0aGlzIGxhcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgbXM6IG51bWJlcjtcbiAgLyoqIEN1bXVsYXRpdmUgdGltZSB1cCB0byB0aGlzIGxhcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdG90YWxNczogbnVtYmVyO1xufTtcblxudHlwZSBOb3dGbiA9ICgpID0+IG51bWJlcjsgLy8gbWlsbGlzZWNvbmRzXG5cbmZ1bmN0aW9uIHNhZmVOb3coKTogTm93Rm4ge1xuICAvLyBQcmVmZXIgcGVyZm9ybWFuY2Uubm93IHdoZW4gYXZhaWxhYmxlXG4gIGlmIChcbiAgICB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlPy5ub3cgPT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICByZXR1cm4gKCkgPT4gZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgfVxuICAvLyBOb2RlOiB1c2UgcHJvY2Vzcy5ocnRpbWUuYmlnaW50IGZvciBoaWdoZXIgcHJlY2lzaW9uIGlmIGF2YWlsYWJsZVxuICBpZiAoXG4gICAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ocnRpbWU/LmJpZ2ludCA9PT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBucyA9IChwcm9jZXNzIGFzIGFueSkuaHJ0aW1lLmJpZ2ludCgpIGFzIGJpZ2ludDsgLy8gbmFub3NlY29uZHNcbiAgICAgIHJldHVybiBOdW1iZXIobnMpIC8gMV8wMDBfMDAwOyAvLyB0byBtc1xuICAgIH07XG4gIH1cbiAgLy8gRmFsbGJhY2tcbiAgcmV0dXJuICgpID0+IERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhpZ2gtcmVzb2x1dGlvbiBjbG9jayBhY2Nlc3NvciByZXR1cm5pbmcgbWlsbGlzZWNvbmRzLlxuICogQHN1bW1hcnkgQ2hvb3NlcyB0aGUgbW9zdCBwcmVjaXNlIHRpbWVyIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBydW50aW1lLCBwcmVmZXJyaW5nIGBwZXJmb3JtYW5jZS5ub3dgIG9yIGBwcm9jZXNzLmhydGltZS5iaWdpbnRgLlxuICogQHJldHVybiB7bnVtYmVyfSBNaWxsaXNlY29uZHMgZWxhcHNlZCBhY2NvcmRpbmcgdG8gdGhlIGJlc3QgYXZhaWxhYmxlIGNsb2NrLlxuICovXG5leHBvcnQgY29uc3Qgbm93ID0gc2FmZU5vdygpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIaWdoLXJlc29sdXRpb24gc3RvcHdhdGNoIHdpdGggcGF1c2UsIHJlc3VtZSwgYW5kIGxhcCB0cmFja2luZy5cbiAqIEBzdW1tYXJ5IFRyYWNrcyBlbGFwc2VkIHRpbWUgdXNpbmcgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIHRpbWVyIGF2YWlsYWJsZSwgc3VwcG9ydHMgcGF1c2luZywgcmVzdW1pbmcsIGFuZCByZWNvcmRpbmcgbGFiZWxlZCBsYXBzIGZvciBkaWFnbm9zdGljcyBhbmQgYmVuY2htYXJraW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1N0YXJ0PWZhbHNlXSAtIFdoZW4gdHJ1ZSwgdGhlIHN0b3B3YXRjaCBzdGFydHMgaW1tZWRpYXRlbHkgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gKiBAY2xhc3MgU3RvcFdhdGNoXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc3cgPSBuZXcgU3RvcFdhdGNoKHRydWUpO1xuICogLy8gLi4uIHdvcmsgLi4uXG4gKiBjb25zdCBsYXAgPSBzdy5sYXAoXCJwaGFzZSAxXCIpO1xuICogc3cucGF1c2UoKTtcbiAqIGNvbnNvbGUubG9nKGBFbGFwc2VkOiAke2xhcC50b3RhbE1zfW1zYCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBTdG9wV2F0Y2hcbiAqICAgcGFydGljaXBhbnQgQ2xvY2sgYXMgbm93KClcbiAqICAgQ2xpZW50LT4+U3RvcFdhdGNoOiBzdGFydCgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICogICBDbGllbnQtPj5TdG9wV2F0Y2g6IGxhcCgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICogICBTdG9wV2F0Y2gtLT4+Q2xpZW50OiBMYXBcbiAqICAgQ2xpZW50LT4+U3RvcFdhdGNoOiBwYXVzZSgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICovXG5leHBvcnQgY2xhc3MgU3RvcFdhdGNoIHtcbiAgcHJpdmF0ZSBfc3RhcnRNczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2VsYXBzZWRNcyA9IDA7XG4gIHByaXZhdGUgX3J1bm5pbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFwczogTGFwW10gPSBbXTtcbiAgcHJpdmF0ZSBfbGFzdExhcFRvdGFsTXMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGF1dG9TdGFydCA9IGZhbHNlKSB7XG4gICAgaWYgKGF1dG9TdGFydCkgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcHdhdGNoIGlzIGFjdGl2ZWx5IHJ1bm5pbmcuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYHRydWVgIHdoZW4gdGltaW5nIGlzIGluIHByb2dyZXNzIGFuZCBgZmFsc2VgIHdoZW4gcGF1c2VkIG9yIHN0b3BwZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IEN1cnJlbnQgcnVubmluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ydW5uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbGFwc2VkIHRpbWUgY2FwdHVyZWQgYnkgdGhlIHN0b3B3YXRjaC5cbiAgICogQHN1bW1hcnkgQ29tcHV0ZXMgdGhlIHRvdGFsIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMsIGluY2x1ZGluZyB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHJ1bm5pbmcuXG4gICAqIEByZXR1cm4ge251bWJlcn0gTWlsbGlzZWNvbmRzIGVsYXBzZWQgc2luY2UgdGhlIHN0b3B3YXRjaCBzdGFydGVkLlxuICAgKi9cbiAgZ2V0IGVsYXBzZWRNcygpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fcnVubmluZyB8fCB0aGlzLl9zdGFydE1zID09IG51bGwpIHJldHVybiB0aGlzLl9lbGFwc2VkTXM7XG4gICAgcmV0dXJuIHRoaXMuX2VsYXBzZWRNcyArIChub3coKSAtIHRoaXMuX3N0YXJ0TXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGltaW5nIGlmIHRoZSBzdG9wd2F0Y2ggaXMgbm90IGFscmVhZHkgcnVubmluZy5cbiAgICogQHN1bW1hcnkgUmVjb3JkcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgYW5kIHRyYW5zaXRpb25zIHRoZSBzdG9wd2F0Y2ggaW50byB0aGUgcnVubmluZyBzdGF0ZS5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgc3RhcnQoKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9ydW5uaW5nKSB7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N0YXJ0TXMgPSBub3coKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdXNlcyB0aW1pbmcgYW5kIGFjY3VtdWxhdGVzIGVsYXBzZWQgbWlsbGlzZWNvbmRzLlxuICAgKiBAc3VtbWFyeSBDYXB0dXJlcyB0aGUgcGFydGlhbCBkdXJhdGlvbiwgdXBkYXRlcyB0aGUgYWNjdW11bGF0b3IsIGFuZCBrZWVwcyB0aGUgc3RvcHdhdGNoIHJlYWR5IHRvIHJlc3VtZSBsYXRlci5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgcGF1c2UoKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX3J1bm5pbmcgJiYgdGhpcy5fc3RhcnRNcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9lbGFwc2VkTXMgKz0gbm93KCkgLSB0aGlzLl9zdGFydE1zO1xuICAgICAgdGhpcy5fc3RhcnRNcyA9IG51bGw7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHRpbWluZyBhZnRlciBhIHBhdXNlLlxuICAgKiBAc3VtbWFyeSBDYXB0dXJlcyBhIGZyZXNoIHN0YXJ0IHRpbWVzdGFtcCB3aGlsZSBrZWVwaW5nIHByZXZpb3VzIGVsYXBzZWQgdGltZSBpbnRhY3QuXG4gICAqIEByZXR1cm4ge3RoaXN9IEZsdWVudCByZWZlcmVuY2UgdG8gdGhlIHN0b3B3YXRjaC5cbiAgICovXG4gIHJlc3VtZSgpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuX3J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fc3RhcnRNcyA9IG5vdygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGltaW5nIGFuZCByZXR1cm5zIHRoZSB0b3RhbCBlbGFwc2VkIG1pbGxpc2Vjb25kcy5cbiAgICogQHN1bW1hcnkgSW52b2tlcyB7QGxpbmsgU3RvcFdhdGNoLnBhdXNlfSB0byBjb25zb2xpZGF0ZSBlbGFwc2VkIHRpbWUsIGxlYXZpbmcgdGhlIHN0b3B3YXRjaCBpbiBhIG5vbi1ydW5uaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IE1pbGxpc2Vjb25kcyBhY2N1bXVsYXRlZCBhY3Jvc3MgYWxsIHJ1bnMuXG4gICAqL1xuICBzdG9wKCk6IG51bWJlciB7XG4gICAgdGhpcy5wYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9lbGFwc2VkTXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc2V0cyB0aGUgc3RvcHdhdGNoIHN0YXRlIHdoaWxlIG9wdGlvbmFsbHkgY29udGludWluZyB0byBydW4uXG4gICAqIEBzdW1tYXJ5IENsZWFycyBlbGFwc2VkIHRpbWUgYW5kIGxhcCBoaXN0b3J5LCBwcmVzZXJ2aW5nIHdoZXRoZXIgdGhlIHN0b3B3YXRjaCBzaG91bGQgY29udGludWUgdGlja2luZy5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgcmVzZXQoKTogdGhpcyB7XG4gICAgY29uc3Qgd2FzUnVubmluZyA9IHRoaXMuX3J1bm5pbmc7XG4gICAgdGhpcy5fc3RhcnRNcyA9IHdhc1J1bm5pbmcgPyBub3coKSA6IG51bGw7XG4gICAgdGhpcy5fZWxhcHNlZE1zID0gMDtcbiAgICB0aGlzLl9sYXBzID0gW107XG4gICAgdGhpcy5fbGFzdExhcFRvdGFsTXMgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWNvcmRzIGEgbGFwIHNwbGl0IHNpbmNlIHRoZSBzdG9wd2F0Y2ggc3RhcnRlZCBvciBzaW5jZSB0aGUgcHJldmlvdXMgbGFwLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGxhcCBtZXRhZGF0YSwgdXBkYXRlcyBjdW11bGF0aXZlIHRyYWNraW5nLCBhbmQgcmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgTGFwfS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF0gLSBPcHRpb25hbCBsYWJlbCBkZXNjcmliaW5nIHRoZSBsYXAuXG4gICAqIEByZXR1cm4ge0xhcH0gTGFwIHNuYXBzaG90IGNhcHR1cmluZyBpbmNyZW1lbnRhbCBhbmQgY3VtdWxhdGl2ZSB0aW1pbmdzLlxuICAgKi9cbiAgbGFwKGxhYmVsPzogc3RyaW5nKTogTGFwIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuZWxhcHNlZE1zO1xuICAgIGNvbnN0IG1zID0gdG90YWwgLSB0aGlzLl9sYXN0TGFwVG90YWxNcztcbiAgICBjb25zdCBsYXA6IExhcCA9IHtcbiAgICAgIGluZGV4OiB0aGlzLl9sYXBzLmxlbmd0aCxcbiAgICAgIGxhYmVsLFxuICAgICAgbXMsXG4gICAgICB0b3RhbE1zOiB0b3RhbCxcbiAgICB9O1xuICAgIHRoaXMuX2xhcHMucHVzaChsYXApO1xuICAgIHRoaXMuX2xhc3RMYXBUb3RhbE1zID0gdG90YWw7XG4gICAgcmV0dXJuIGxhcDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgbGFwIGhpc3RvcnkuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGludGVybmFsIGxhcCBhcnJheSBhcyBhIHJlYWQtb25seSB2aWV3IHRvIHByZXZlbnQgZXh0ZXJuYWwgbXV0YXRpb24uXG4gICAqIEByZXR1cm4ge0xhcFtdfSBMYXBzIGNhcHR1cmVkIGJ5IHRoZSBzdG9wd2F0Y2guXG4gICAqL1xuICBnZXQgbGFwcygpOiByZWFkb25seSBMYXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhcHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdHMgdGhlIGVsYXBzZWQgdGltZSBpbiBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAc3VtbWFyeSBVc2VzIHtAbGluayBmb3JtYXRNc30gdG8gcHJvZHVjZSBhbiBgaGg6bW06c3MubW1tYCBzdHJpbmcgZm9yIGRpc3BsYXkgYW5kIGxvZ2dpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRWxhcHNlZCB0aW1lIGZvcm1hdHRlZCBmb3IgcHJlc2VudGF0aW9uLlxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0TXModGhpcy5lbGFwc2VkTXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemVzIHRoZSBzdG9wd2F0Y2ggc3RhdGUuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgSlNPTi1mcmllbmRseSBzbmFwc2hvdCBpbmNsdWRpbmcgcnVubmluZyBzdGF0ZSwgZWxhcHNlZCB0aW1lLCBhbmQgbGFwIGRldGFpbHMuXG4gICAqIEByZXR1cm4ge3tydW5uaW5nOiBib29sZWFuLCBlbGFwc2VkTXM6IG51bWJlciwgbGFwczogTGFwW119fSBTZXJpYWxpemFibGUgc3RvcHdhdGNoIHJlcHJlc2VudGF0aW9uLlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBydW5uaW5nOiB0aGlzLl9ydW5uaW5nLFxuICAgICAgZWxhcHNlZE1zOiB0aGlzLmVsYXBzZWRNcyxcbiAgICAgIGxhcHM6IHRoaXMuX2xhcHMuc2xpY2UoKSxcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGb3JtYXRzIG1pbGxpc2Vjb25kcyBpbnRvIGBoaDptbTpzcy5tbW1gLlxuICogQHN1bW1hcnkgQnJlYWtzIHRoZSBkdXJhdGlvbiBpbnRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzLCByZXR1cm5pbmcgYSB6ZXJvLXBhZGRlZCBzdHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcn0gbXMgLSBNaWxsaXNlY29uZHMgdG8gZm9ybWF0LlxuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZHVyYXRpb24gc3RyaW5nLlxuICogQGZ1bmN0aW9uIGZvcm1hdE1zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEZvcm1hdHRlciBhcyBmb3JtYXRNc1xuICogICBDYWxsZXItPj5Gb3JtYXR0ZXI6IGZvcm1hdE1zKG1zKVxuICogICBGb3JtYXR0ZXItPj5Gb3JtYXR0ZXI6IGRlcml2ZSBob3Vycy9taW51dGVzL3NlY29uZHNcbiAqICAgRm9ybWF0dGVyLT4+Rm9ybWF0dGVyOiBwYWQgc2VnbWVudHNcbiAqICAgRm9ybWF0dGVyLS0+PkNhbGxlcjogaGg6bW06c3MubW1tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNcyhtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2lnbiA9IG1zIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3QgYWJzID0gTWF0aC5hYnMobXMpO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoYWJzIC8gM182MDBfMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKGFicyAlIDNfNjAwXzAwMCkgLyA2MF8wMDApO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigoYWJzICUgNjBfMDAwKSAvIDEwMDApO1xuICBjb25zdCBtaWxsaXMgPSBNYXRoLmZsb29yKGFicyAlIDEwMDApO1xuICBjb25zdCBwYWQgPSAobjogbnVtYmVyLCB3OiBudW1iZXIpID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCh3LCBcIjBcIik7XG4gIHJldHVybiBgJHtzaWdufSR7cGFkKGhvdXJzLCAyKX06JHtwYWQobWludXRlcywgMil9OiR7cGFkKHNlY29uZHMsIDIpfS4ke3BhZChtaWxsaXMsIDMpfWA7XG59XG4iLCJpbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcbmltcG9ydCB7IG5vdyB9IGZyb20gXCIuL3RpbWVcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIi4vTG9nZ2VkQ2xhc3NcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIEFyZ0Zvcm1hdEZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5leHBvcnQgdHlwZSBSZXR1cm5Gb3JtYXRGdW5jdGlvbiA9IChlPzogRXJyb3IsIHJlc3VsdD86IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzLlxuICogQHN1bW1hcnkgV3JhcHMgY2xhc3MgbWV0aG9kcyB0byBhdXRvbWF0aWNhbGx5IGxvZyBlbnRyeSwgZXhpdCwgdGltaW5nLCBhbmQgb3B0aW9uYWwgY3VzdG9tIG1lc3NhZ2VzIGF0IGEgY29uZmlndXJhYmxlIHtAbGluayBMb2dMZXZlbH0uXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIExvZyBsZXZlbCBhcHBsaWVkIHRvIHRoZSBnZW5lcmF0ZWQgbG9nIHN0YXRlbWVudHMgKGRlZmF1bHRzIHRvIGBMb2dMZXZlbC5pbmZvYCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW3ZlcmJvc2l0eT0wXSAtIFZlcmJvc2l0eSB0aHJlc2hvbGQgcmVxdWlyZWQgZm9yIHRoZSBlbnRyeSBsb2cgdG8gYXBwZWFyLlxuICogQHBhcmFtIHtBcmdGb3JtYXRGdW5jdGlvbn0gW2VudHJ5TWVzc2FnZV0gLSBGb3JtYXR0ZXIgaW52b2tlZCB3aXRoIHRoZSBvcmlnaW5hbCBtZXRob2QgYXJndW1lbnRzIHRvIGRlc2NyaWJlIHRoZSBpbnZvY2F0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5Gb3JtYXRGdW5jdGlvbn0gW2V4aXRNZXNzYWdlXSAtIE9wdGlvbmFsIGZvcm1hdHRlciB0aGF0IGRlc2NyaWJlcyB0aGUgb3V0Y29tZSBvciBmYWlsdXJlIG9mIHRoZSBjYWxsLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IE1ldGhvZCBkZWNvcmF0b3IgcHJveHkgdGhhdCBpbmplY3RzIGxvZ2dpbmcgYmVoYXZpb3IuXG4gKiBAZnVuY3Rpb24gbG9nXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgbG9nIGRlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBNZXRob2QgYXMgT3JpZ2luYWwgTWV0aG9kXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlciBhcyBMb2dnaW5nIGluc3RhbmNlXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGNhbGwgZGVjb3JhdGVkIG1ldGhvZFxuICogICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBtZXRob2QgY2FsbFxuICogICBEZWNvcmF0b3ItPj5NZXRob2Q6IGNhbGwgb3JpZ2luYWwgbWV0aG9kXG4gKiAgIGFsdCByZXN1bHQgaXMgUHJvbWlzZVxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHJldHVybiBQcm9taXNlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBhdHRhY2ggdGhlbiBoYW5kbGVyXG4gKiAgICAgTm90ZSBvdmVyIERlY29yYXRvcjogUHJvbWlzZSByZXNvbHZlc1xuICogICAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIGJlbmNobWFyayAoaWYgZW5hYmxlZClcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcmVzdWx0XG4gKiAgIGVsc2UgcmVzdWx0IGlzIG5vdCBQcm9taXNlXG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogcmV0dXJuIHJlc3VsdFxuICogICAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIGJlbmNobWFyayAoaWYgZW5hYmxlZClcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcmVzdWx0XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLmluZm8sXG4gIHZlcmJvc2l0eSA9IDAsXG4gIGVudHJ5TWVzc2FnZTogQXJnRm9ybWF0RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGBjYWxsZWQgd2l0aCAke2FyZ3N9YCxcbiAgZXhpdE1lc3NhZ2U/OiBSZXR1cm5Gb3JtYXRGdW5jdGlvblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsb2codGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSBcIm51bWJlclwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnaW5nIGRlY29yYXRpb24gb25seSBhcHBsaWVzIHRvIG1ldGhvZHNgKTtcbiAgICBjb25zdCBsb2dnZXI6IExvZ2dlciA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBMb2dnZWRDbGFzc1xuICAgICAgICA/IHRhcmdldFtcImxvZ1wiXS5mb3IodGFyZ2V0W3Byb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdKVxuICAgICAgICA6IExvZ2dpbmcuZm9yKHRhcmdldCkuZm9yKHRhcmdldFtwcm9wZXJ0eUtleV0pO1xuICAgIGNvbnN0IG1ldGhvZCA9IGxvZ2dlcltsZXZlbF0uYmluZChsb2dnZXIpIGFzIGFueTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbmV3IFByb3h5KG9yaWdpbmFsTWV0aG9kLCB7XG4gICAgICBhcHBseShmbiwgdGhpc0FyZywgYXJnczogYW55W10pIHtcbiAgICAgICAgbWV0aG9kKGVudHJ5TWVzc2FnZSguLi5hcmdzKSwgdmVyYm9zaXR5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgICAudGhlbigocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXRNZXNzYWdlKSBtZXRob2QoZXhpdE1lc3NhZ2UodW5kZWZpbmVkLCByKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChleGl0TWVzc2FnZSkgbG9nZ2VyLmVycm9yKGV4aXRNZXNzYWdlKGUgYXMgRXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4aXRNZXNzYWdlKSBtZXRob2QoZXhpdE1lc3NhZ2UodW5kZWZpbmVkLCByZXN1bHQpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBpZiAoZXhpdE1lc3NhZ2UpIGxvZ2dlci5lcnJvcihleGl0TWVzc2FnZShlcnIgYXMgRXJyb3IpKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgdGhhdCByZWNvcmRzIGV4ZWN1dGlvbiB0aW1lIGF0IHRoZSBiZW5jaG1hcmsgbGV2ZWwuXG4gKiBAc3VtbWFyeSBXcmFwcyB0aGUgdGFyZ2V0IG1ldGhvZCB0byBlbWl0IHtAbGluayBMb2dnZXIuYmVuY2htYXJrfSBlbnRyaWVzIGNhcHR1cmluZyBjb21wbGV0aW9uIHRpbWUgb3IgZmFpbHVyZSBsYXRlbmN5LlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksICBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBNZXRob2QgZGVjb3JhdG9yIHByb3h5IHRoYXQgYmVuY2htYXJrcyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24uXG4gKiBAZnVuY3Rpb24gYmVuY2htYXJrXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgYmVuY2htYXJrXG4gKiAgIHBhcnRpY2lwYW50IE1ldGhvZCBhcyBPcmlnaW5hbCBNZXRob2RcbiAqICAgQ2FsbGVyLT4+RGVjb3JhdG9yOiBpbnZva2UoKVxuICogICBEZWNvcmF0b3ItPj5NZXRob2Q6IFJlZmxlY3QuYXBwbHkoLi4uKVxuICogICBhbHQgUHJvbWlzZSByZXN1bHRcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiBQcm9taXNlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBhdHRhY2ggdGhlbigpXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBsb2cgY29tcGxldGlvbiBkdXJhdGlvblxuICogICBlbHNlIFN5bmNocm9ub3VzIHJlc3VsdFxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHZhbHVlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBsb2cgY29tcGxldGlvbiBkdXJhdGlvblxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLS0+PkNhbGxlcjogcmV0dXJuIHJlc3VsdFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZW5jaG1hcmsoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiZW5jaG1hcmsodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSBcIm51bWJlclwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiZW5jaG1hcmsgZGVjb3JhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc2ApO1xuICAgIGNvbnN0IGxvZ2dlcjogTG9nZ2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIExvZ2dlZENsYXNzXG4gICAgICAgID8gdGFyZ2V0W1wibG9nXCJdLmZvcih0YXJnZXRbcHJvcGVydHlLZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldF0pXG4gICAgICAgIDogTG9nZ2luZy5mb3IodGFyZ2V0KS5mb3IodGFyZ2V0W3Byb3BlcnR5S2V5XSk7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IG5ldyBQcm94eShvcmlnaW5hbE1ldGhvZCwge1xuICAgICAgYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGxvZ2dlci5iZW5jaG1hcmsoYGNvbXBsZXRlZCBpbiAke25vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmJlbmNobWFyayhgY29tcGxldGVkIGluICR7bm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGxvZ2dlci5iZW5jaG1hcmsoYGZhaWxlZCBpbiAke25vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlYnVnIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5kZWJ1Z2AuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gRGVidWctbGV2ZWwgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gZGVidWdcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoKSB7XG4gIHJldHVybiBsb2coXG4gICAgTG9nTGV2ZWwuZGVidWcsXG4gICAgMCxcbiAgICAoLi4uYXJnczogYW55W10pID0+IGBjYWxsZWQgd2l0aCAke2FyZ3N9YCxcbiAgICAoZT86IEVycm9yLCByZXN1bHQ/OiBhbnkpID0+XG4gICAgICBlXG4gICAgICAgID8gYEZhaWxlZCB3aXRoOiAke2V9YFxuICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgID8gYENvbXBsZXRlZCB3aXRoICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gXG4gICAgICAgICAgOiBcImNvbXBsZXRlZFwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbmZvIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5pbmZvYC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBJbmZvLWxldmVsIGxvZ2dpbmcgZGVjb3JhdG9yLlxuICogQGZ1bmN0aW9uIGluZm9cbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbygpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5pbmZvKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHNpbGx5IGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5zaWxseWAuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gU2lsbHktbGV2ZWwgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gc2lsbHlcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lsbHkoKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuc2lsbHkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggdmVyYm9zZSBsZXZlbC5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHtAbGluayBsb2d9IHRoYXQgbG9ncyB1c2luZyBgTG9nTGV2ZWwudmVyYm9zZWAgd2l0aCBjb25maWd1cmFibGUgdmVyYm9zaXR5LlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IFZlcmJvc2UgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKCk6IChcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5PzogYW55LFxuICBkZXNjcmlwdG9yPzogYW55XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC52ZXJib3NlYCB3aGlsZSB0b2dnbGluZyBiZW5jaG1hcmtpbmcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IFZlcmJvc2UgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKCk6IChcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5PzogYW55LFxuICBkZXNjcmlwdG9yPzogYW55XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC52ZXJib3NlYCB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHkgYW5kIG9wdGlvbmFsIGJlbmNobWFya2luZy5cbiAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IHZlcmJvc2l0eSAtIFZlcmJvc2l0eSBsZXZlbCBmb3IgbG9nIGZpbHRlcmluZyBvciBmbGFnIHRvIGVuYWJsZSBiZW5jaG1hcmtpbmcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSxQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBWZXJib3NlIGxvZ2dpbmcgZGVjb3JhdG9yLlxuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyYm9zZSh2ZXJib3NpdHk6IG51bWJlciB8IGJvb2xlYW4gPSAwKSB7XG4gIGlmICghdmVyYm9zaXR5KSB7XG4gICAgdmVyYm9zaXR5ID0gMDtcbiAgfVxuICByZXR1cm4gbG9nKExvZ0xldmVsLnZlcmJvc2UsIHZlcmJvc2l0eSBhcyBudW1iZXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFrZXMgYSBtZXRob2Qgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEBzdW1tYXJ5IFByZXZlbnRzIG92ZXJyaWRpbmcgYnkgbWFya2luZyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgdGhyb3dpbmcgaWYgYXBwbGllZCB0byBub24tbWV0aG9kIHRhcmdldHMuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihvYmplY3QsIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogUHJvcGVydHlEZXNjcmlwdG9yfHVuZGVmaW5lZH0gRGVjb3JhdG9yIHRoYXQgaGFyZGVucyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IuXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb24gbWV0aG9kc1wiKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8uY29uZmlndXJhYmxlKSB7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiIsImltcG9ydCB7IExvZ0ZpbHRlciB9IGZyb20gXCIuL0xvZ0ZpbHRlclwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlbWVudCBjYWxsYmFjayB1c2VkIHRvIHRyYW5zZm9ybSBSZWdFeHAgbWF0Y2hlcy5cbiAqIEBzdW1tYXJ5IFJlY2VpdmVzIHRoZSBtYXRjaGVkIHN1YnN0cmluZyBhbmQgYWRkaXRpb25hbCBjYXB0dXJlIGFyZ3VtZW50cywgcmV0dXJuaW5nIHRoZSByZXBsYWNlbWVudCB0ZXh0IHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBsb2cgbWVzc2FnZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihzdHJpbmcsIGFueVtdKTogc3RyaW5nfSBSZXBsYWNlbWVudEZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGFjZW1lbnRGdW5jdGlvbiA9IChzdWJzdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHN0cmluZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmlsdGVyIHRoYXQgcGF0Y2hlcyBsb2cgbWVzc2FnZXMgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgYSBjb25maWd1cmVkIHtAbGluayBSZWdFeHB9IGFuZCByZXBsYWNlbWVudCBzdHJhdGVneSB0byByZWRhY3QsIG1hc2ssIG9yIHJlc3RydWN0dXJlIGxvZyBwYXlsb2FkcyBiZWZvcmUgdGhleSBhcmUgZW1pdHRlZC5cbiAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHAgLSBFeHByZXNzaW9uIHVzZWQgdG8gZGV0ZWN0IHNlbnNpdGl2ZSBvciBmb3JtYXR0ZWQgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfFJlcGxhY2VtZW50RnVuY3Rpb259IHJlcGxhY2VtZW50IC0gUmVwbGFjZW1lbnQgc3RyaW5nIG9yIGNhbGxiYWNrIGludm9rZWQgZm9yIGVhY2ggbWF0Y2guXG4gKiBAY2xhc3MgUGF0dGVybkZpbHRlclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZpbHRlciA9IG5ldyBQYXR0ZXJuRmlsdGVyKC90b2tlbj1bXiZdKy9nLCBcInRva2VuPSoqKlwiKTtcbiAqIGNvbnN0IHNhbml0aXplZCA9IGZpbHRlci5maWx0ZXIoY29uZmlnLCBcInRva2VuPTEyMyZ1c2VyPXRvbVwiLCBbXSk7XG4gKiAvLyBzYW5pdGl6ZWQgPT09IFwidG9rZW49KioqJnVzZXI9dG9tXCJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyXG4gKiAgIHBhcnRpY2lwYW50IEZpbHRlciBhcyBQYXR0ZXJuRmlsdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlZ0V4cFxuICogICBMb2dnZXItPj5GaWx0ZXI6IGZpbHRlcihjb25maWcsIG1lc3NhZ2UsIGNvbnRleHQpXG4gKiAgIEZpbHRlci0+PlJlZ0V4cDogZXhlY3V0ZSBtYXRjaCgpXG4gKiAgIGFsdCBtYXRjaCBmb3VuZFxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IGNhcHR1cmVzXG4gKiAgICAgRmlsdGVyLT4+UmVnRXhwOiByZXBsYWNlKG1lc3NhZ2UsIHJlcGxhY2VtZW50KVxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IHRyYW5zZm9ybWVkIG1lc3NhZ2VcbiAqICAgZWxzZSBubyBtYXRjaFxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IG51bGxcbiAqICAgZW5kXG4gKiAgIEZpbHRlci0tPj5Mb2dnZXI6IHNhbml0aXplZCBtZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgTG9nRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXBsYWNlbWVudDogc3RyaW5nIHwgUmVwbGFjZW1lbnRGdW5jdGlvblxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnN1cmVzIGRldGVybWluaXN0aWMgUmVnRXhwIG1hdGNoaW5nLlxuICAgKiBAc3VtbWFyeSBSdW5zIHRoZSBjb25maWd1cmVkIGV4cHJlc3Npb24sIHRoZW4gcmVzZXRzIGl0cyBzdGF0ZSBzbyByZXBlYXRlZCBpbnZvY2F0aW9ucyBiZWhhdmUgY29uc2lzdGVudGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGVzdCBmb3IgbWF0Y2hlcy5cbiAgICogQHJldHVybiB7UmVnRXhwRXhlY0FycmF5fG51bGx9IE1hdGNoIHJlc3VsdCBvciBudWxsIHdoZW4gbm8gbWF0Y2ggaXMgZm91bmQuXG4gICAqL1xuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgbWF0Y2gobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnJlZ2V4cC5leGVjKG1lc3NhZ2UpO1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSByZXBsYWNlbWVudCBzdHJhdGVneSB0byB0aGUgaW5jb21pbmcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMge0BsaW5rIFBhdHRlcm5GaWx0ZXIubWF0Y2h9IGFuZCwgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLCByZXBsYWNlcyBldmVyeSBvY2N1cnJlbmNlIHVzaW5nIHRoZSBjb25maWd1cmVkIHJlcGxhY2VtZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7TG9nZ2luZ0NvbmZpZ30gY29uZmlnIC0gQWN0aXZlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiAodW51c2VkIGJ1dCBwYXJ0IG9mIHRoZSBmaWx0ZXIgY29udHJhY3QpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gYmUgc2FuaXRpemVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjb250ZXh0IC0gQ29udGV4dCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFNhbml0aXplZCBsb2cgbWVzc2FnZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZmlsdGVyKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbWVzc2FnZTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZmlsdGVyKTtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMubWF0Y2gobWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UodGhpcy5yZWdleHAsIHRoaXMucmVwbGFjZW1lbnQgYXMgYW55KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYFBhdHRlcm5GaWx0ZXIgcmVwbGFjZW1lbnQgZXJyb3I6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvZ2dlZENsYXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXByZWhlbnNpdmUgbG9nZ2luZyB0b29sa2l0IGZvciBicm93c2VyIGFuZCBOb2RlIGVudmlyb25tZW50cy5cbiAqIEBzdW1tYXJ5IEV4cG9zZXMge0BsaW5rIExvZ2dpbmd9IGFuZCB7QGxpbmsgTWluaUxvZ2dlcn0gZm9yIHJ1bnRpbWUgbG9nZ2luZywgZGVjb3JhdG9ycyBzdWNoIGFzIHtAbGluayBsb2d9IGZvciBtZXRob2QgaW5zdHJ1bWVudGF0aW9uLCBhbmQgdXRpbGl0aWVzIGxpa2Uge0BsaW5rIFBhdHRlcm5GaWx0ZXJ9LCB7QGxpbmsgU3RvcFdhdGNofSwgYW5kIHtAbGluayBMb2dnZWRFbnZpcm9ubWVudH0gdG8gYnVpbGQgY29uZmlndXJhYmxlLCB0aGVtZS1hd2FyZSBsb2cgcGlwZWxpbmVzLlxuICogQG1vZHVsZSBMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yIGRpYWdub3N0aWNzIGFuZCBjb21wYXRpYmlsaXR5IGNoZWNrcy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkxvZ0xldmVsIiwiTG9nZ2luZ01vZGUiLCJPYmplY3RBY2N1bXVsYXRvciIsInN0eWxlIiwiX19kZWNvcmF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7OztJQU1HO0FBQ0ksVUFBTSxhQUFhLEdBQUc7SUFFN0I7Ozs7OztJQU1HO0FBQ0ksVUFBTSxrQkFBa0IsR0FBRztJQUVsQzs7Ozs7O0lBTUc7VUFDVSwwQkFBMEIsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHO0lBRXBEOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxRQUFRLEVBQUE7O0lBRWxCLElBQUEsUUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCOztJQUV2QixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsUUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7O0lBRWIsSUFBQSxRQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7O0lBRW5CLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7O0lBRWYsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNqQixDQUFDLEVBYldBLGdCQUFRLEtBQVJBLGdCQUFRLEdBYW5CLEVBQUEsQ0FBQSxDQUFBO0lBRUQ7Ozs7Ozs7Ozs7O0lBV0c7SUFDSDs7Ozs7O0lBTUc7QUFDVSxVQUFBLGdCQUFnQixHQUFHO0lBQzlCLElBQUEsU0FBUyxFQUFFLENBQUM7SUFDWixJQUFBLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBQSxJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUEsT0FBTyxFQUFFLENBQUM7SUFDVixJQUFBLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBQSxLQUFLLEVBQUUsQ0FBQzs7SUFHVjs7Ozs7SUFLRztB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
|
|
1850
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvdGV4dC50cyIsIi4uL3NyYy93ZWIudHMiLCIuLi9zcmMvZW52aXJvbm1lbnQudHMiLCIuLi9zcmMvbG9nZ2luZy50cyIsIi4uL3NyYy9Mb2dnZWRDbGFzcy50cyIsIi4uL3NyYy9maWx0ZXJzL0xvZ0ZpbHRlci50cyIsIi4uL3NyYy90aW1lLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZmlsdGVycy9QYXR0ZXJuRmlsdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dpbmdDb25maWcsIFRoZW1lIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2xvYmFsIGtleSB1c2VkIHRvIHN0b3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBicm93c2VyIGNvbnRleHRzLlxuICogQHN1bW1hcnkgRW5hYmxlcyB0aGUgbG9nZ2luZyBlbnZpcm9ubWVudCBoZWxwZXJzIHRvIGxvY2F0ZSBzZXJpYWxpemVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gb24gYGdsb2JhbFRoaXNgLlxuICogQGNvbnN0IEJyb3dzZXJFbnZLZXlcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IEJyb3dzZXJFbnZLZXkgPSBcIkVOVlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWxpbWl0ZXIgdXNlZCBmb3IgY29tcG9zaW5nIG5lc3RlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcy5cbiAqIEBzdW1tYXJ5IEpvaW5zIHBhcmVudCBhbmQgY2hpbGQga2V5cyB3aGVuIG1hcHBpbmcgb2JqZWN0IHBhdGhzIHRvIEVOViBzdHJpbmdzLlxuICogQGNvbnN0IEVOVl9QQVRIX0RFTElNSVRFUlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRU5WX1BBVEhfREVMSU1JVEVSID0gXCJfX1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHByZWZpeCBhbmQgc3VmZml4IHVzZWQgZm9yIHRlbXBsYXRlIHBsYWNlaG9sZGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHdyYXBwZXIgc3RyaW5ncyBhcHBsaWVkIHdoZW4gaW50ZXJwb2xhdGluZyBtZXNzYWdlcyB3aXRoIHtAbGluayBwYXRjaFBsYWNlaG9sZGVyc30uXG4gKiBAY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyV3JhcHBlcnNcbiAqIEB0eXBlIHtzdHJpbmdbXX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyV3JhcHBlcnMgPSBbXCIke1wiLCBcIn1cIl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBCZW5jaG1hcmsgZXZlbnRzIHRoYXQgY2FwdHVyZSBwZXJmb3JtYW5jZSBtZXRyaWNzLiAqL1xuICBiZW5jaG1hcmsgPSBcImJlbmNobWFya1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEVycm9yIGV2ZW50cyB0aGF0IGluZGljYXRlIGZhaWx1cmVzIHJlcXVpcmluZyBhdHRlbnRpb24uICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogQGRlc2NyaXB0aW9uIEluZm9ybWF0aW9uYWwgZXZlbnRzIGRlc2NyaWJpbmcgbm9ybWFsIG9wZXJhdGlvbi4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIFZlcmJvc2UgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgZGV0YWlsZWQgdHJhY2luZy4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogQGRlc2NyaXB0aW9uIERlYnVnIG9yIHRyYWNlIGRldGFpbHMgYWltZWQgYXQgZGV2ZWxvcGVycy4gKi9cbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gRXh0cmVtZWx5IGNoYXR0eSBvciBwbGF5ZnVsIGxvZyBlbnRyaWVzLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQHR5cGVkZWYge09iamVjdH0gTnVtZXJpY0xvZ0xldmVsc1NoYXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gYmVuY2htYXJrIC0gTnVtZXJpYyB2YWx1ZSBmb3IgYmVuY2htYXJrIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgyKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoNCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDcpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDkpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIE51bWVyaWMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIGxvZyBsZXZlbHMgZm9yIGNvbXBhcmlzb24gYW5kIGZpbHRlcmluZy5cbiAqIEBjb25zdCBOdW1lcmljTG9nTGV2ZWxzXG4gKiBAdHlwZSB7TnVtZXJpY0xvZ0xldmVsc1NoYXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBiZW5jaG1hcms6IDAsXG4gIGVycm9yOiAyLFxuICBpbmZvOiA0LFxuICB2ZXJib3NlOiA2LFxuICBkZWJ1ZzogNyxcbiAgc2lsbHk6IDksXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2dnaW5nIG91dHB1dCBtb2Rlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzIGZvciBsb2cgbWVzc2FnZXMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ2dpbmdNb2RlIHtcbiAgLyoqIFJhdyB0ZXh0IGZvcm1hdCBmb3IgaHVtYW4gcmVhZGFiaWxpdHkgKi9cbiAgUkFXID0gXCJyYXdcIixcbiAgLyoqIEpTT04gZm9ybWF0IGZvciBtYWNoaW5lIHBhcnNpbmcgKi9cbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDM0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpZCAtIFN0eWxpbmcgZm9yIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBpZGVudGlmaWVycyAoMzYpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHN0YWNrIC0gU3R5bGluZyBmb3Igc3RhY2sgdHJhY2VzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFN0eWxpbmcgZm9yIHRpbWVzdGFtcHMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZSAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWVzc2FnZS5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbWVzc2FnZXMgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXRob2QgLSBTdHlsaW5nIGZvciBtZXRob2QgbmFtZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgbG9nIGxldmVscy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIGxldmVsIGxvZ3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbG9nTGV2ZWwuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIGxldmVsIGxvZ3MgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvZ0xldmVsLmVycm9yLnN0eWxlIC0gU3R5bGUgYXR0cmlidXRlcyBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoW1wiYm9sZFwiXSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoMzMpLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBhcHA6IHt9LFxuICBzZXBhcmF0b3I6IHt9LFxuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBiZW5jaG1hcms6IHtcbiAgICAgIGZnOiAzMixcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgaW5mbzoge1xuICAgICAgZmc6IDM0LFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICB2ZXJib3NlOiB7XG4gICAgICBmZzogMzQsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBsb2dnaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLCBpbmNsdWRpbmcgdmVyYm9zaXR5LCBsb2cgbGV2ZWwsIHN0eWxpbmcsIGFuZCB0aW1lc3RhbXAgZm9ybWF0LlxuICogQGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ0NvbmZpZ30gRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gRGVmYXVsdCBsb2cgbGV2ZWwgKExvZ0xldmVsLmluZm8pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dMZXZlbCAtIFdoZXRoZXIgdG8gZGlzcGxheSBsb2cgbGV2ZWwgaW4gb3V0cHV0ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ01vZGV9IG1vZGUgLSBPdXRwdXQgZm9ybWF0IG1vZGUgKExvZ2dpbmdNb2RlLlJBVykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXBhcmF0b3IgLSBTZXBhcmF0b3IgYmV0d2VlbiBsb2cgY29tcG9uZW50cyAoXCIgLSBcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lc3RhbXBzIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wRm9ybWF0IC0gRm9ybWF0IGZvciB0aW1lc3RhbXBzIChcIkhIOm1tOnNzLlNTU1wiKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29udGV4dCAtIFdoZXRoZXIgdG8gaW5jbHVkZSBjb250ZXh0IGluZm9ybWF0aW9uIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge1RoZW1lfSB0aGVtZSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmcgbG9nIG1lc3NhZ2VzIChEZWZhdWx0VGhlbWUpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgZW52OiBcImRldmVsb3BtZW50XCIsXG4gIHZlcmJvc2U6IDAsXG4gIGxldmVsOiBMb2dMZXZlbC5pbmZvLFxuICBsb2dMZXZlbDogdHJ1ZSxcbiAgc3R5bGU6IGZhbHNlLFxuICBjb250ZXh0U2VwYXJhdG9yOiBcIi5cIixcbiAgc2VwYXJhdG9yOiBcIi1cIixcbiAgdGltZXN0YW1wOiB0cnVlLFxuICB0aW1lc3RhbXBGb3JtYXQ6IFwiSEg6bW06c3MuU1NTXCIsXG4gIGNvbnRleHQ6IHRydWUsXG4gIGZvcm1hdDogTG9nZ2luZ01vZGUuUkFXLFxuICBwYXR0ZXJuOlxuICAgIFwie2xldmVsfSBbe3RpbWVzdGFtcH1dIHthcHB9IHtjb250ZXh0fSB7c2VwYXJhdG9yfSB7bWVzc2FnZX0ge3N0YWNrfVwiLFxuICB0aGVtZTogRGVmYXVsdFRoZW1lLFxufTtcbiIsImltcG9ydCB7IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZHMgdGhlIGVuZCBvZiBhIHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIGNoYXJhY3Rlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGlucHV0IHN0cmluZyB0byBhIHNwZWNpZmllZCBsZW5ndGggYnkgYWRkaW5nIGEgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdGhlIGVuZC5cbiAqIElmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYWxyZWFkeSBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgZGVzaXJlZCB0b3RhbCBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoYXI9XCIgXCJdIC0gVGhlIGNoYXJhY3RlciB0byB1c2UgZm9yIHBhZGRpbmcuIERlZmF1bHRzIHRvIGEgc3BhY2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYWRkZWQgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYWRkaW5nIGNoYXJhY3RlciBpcyBub3QgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGxvbmcuXG4gKlxuICogQGZ1bmN0aW9uIHBhZEVuZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkRW5kKFxuICBzdHI6IHN0cmluZyxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIGNoYXI6IHN0cmluZyA9IFwiIFwiXG4pOiBzdHJpbmcge1xuICBpZiAoY2hhci5sZW5ndGggIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBwYWRkaW5nLiBtdXN0IGJlIG9uZSFcIik7XG4gIHJldHVybiBzdHIucGFkRW5kKGxlbmd0aCwgY2hhcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBhIHN0cmluZyB3aXRoIHByb3ZpZGVkIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtICR7dmFyaWFibGVOYW1lfVxuICogd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuIElmIGEgcGxhY2Vob2xkZXIgZG9lc24ndCBoYXZlXG4gKiBhIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGluIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPn0gdmFsdWVzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciByZXBsYWNlbWVudC5cbiAqIEBwYXJhbSBwcmVmaXhcbiAqIEBwYXJhbSBzdWZmaXhcbiAqIEBwYXJhbSBmbGFnc1xuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyB3aXRoIHBsYWNlaG9sZGVycyByZXBsYWNlZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaFN0cmluZ1xuICogICBwYXJ0aWNpcGFudCBTdHJpbmcucmVwbGFjZVxuICogICBDYWxsZXItPj5wYXRjaFN0cmluZzogQ2FsbCB3aXRoIGlucHV0IGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hTdHJpbmctPj5TdHJpbmcucmVwbGFjZTogQ2FsbCB3aXRoIHJlZ2V4IGFuZCByZXBsYWNlbWVudCBmdW5jdGlvblxuICogICBTdHJpbmcucmVwbGFjZS0+PnBhdGNoU3RyaW5nOiBSZXR1cm4gcmVwbGFjZWQgc3RyaW5nXG4gKiAgIHBhdGNoU3RyaW5nLS0+PkNhbGxlcjogUmV0dXJuIHBhdGNoZWQgc3RyaW5nXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVycyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+LFxuICBwcmVmaXg6IHN0cmluZyA9IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzWzBdLFxuICBzdWZmaXg6IHN0cmluZyA9IERlZmF1bHRQbGFjZWhvbGRlcldyYXBwZXJzWzFdLFxuICBmbGFnczogc3RyaW5nID0gXCJnXCJcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYWNlaG9sZGVycyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlcykucmVkdWNlKFxuICAgIChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGFjY1tgJHtwcmVmaXh9JHtrZXl9JHtzdWZmaXh9YF0gPSB2YWw7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge31cbiAgKTtcbiAgcmV0dXJuIHBhdGNoU3RyaW5nKGlucHV0LCBwbGFjZWhvbGRlcnMsIGZsYWdzKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwbGFjZXMgb2NjdXJyZW5jZXMgb2Yga2V5cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIGEgc3RyaW5nLlxuICogQHN1bW1hcnkgSXRlcmF0ZXMgdGhyb3VnaCBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgYW5kIHJlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBlYWNoIGtleVxuICogaW4gdGhlIGlucHV0IHN0cmluZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLiBTdXBwb3J0cyByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgZm9yIGN1c3RvbWl6ZWQgcmVwbGFjZW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBpbiB3aGljaCByZXBsYWNlbWVudHMgd2lsbCBiZSBtYWRlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHJlcGxhY2VtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGFncz1cImdcIl0gLSBSZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgdG8gY29udHJvbCB0aGUgcmVwbGFjZW1lbnQgYmVoYXZpb3IuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgd2l0aCBhbGwgc3BlY2lmaWVkIHJlcGxhY2VtZW50cyBhcHBsaWVkLlxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaFN0cmluZ1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hTdHJpbmcoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPixcbiAgZmxhZ3M6IHN0cmluZyA9IFwiZ1wiXG4pOiBzdHJpbmcge1xuICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChrZXkpLCBmbGFncyk7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKHJlZ2V4cCwgdmFsIGFzIHN0cmluZyk7XG4gIH0pO1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGNhbWVsQ2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGNhbWVsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgYWZ0ZXIgdGhlIGZpcnN0IHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0NhbWVsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogd29yZC50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byB1cHBlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMsXG4gKiB0eXBpY2FsbHkgdXNlZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICpcbiAqIEBmdW5jdGlvbiB0b0VOVkZvcm1hdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FTlZGb3JtYXQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU25ha2VDYXNlKHRleHQpLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIHNuYWtlX2Nhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gc25ha2VfY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9TbmFrZUNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2VDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDFfJDJcIilcbiAgICAucmVwbGFjZSgvW1xccy1dKy9nLCBcIl9cIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8ga2ViYWItY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSBoeXBoZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGtlYmFiLWNhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvS2ViYWJDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIFBhc2NhbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBQYXNjYWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIFBhc2NhbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCkgPT4gd29yZC50b1VwcGVyQ2FzZSgpKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHN0cmluZyBmb3IgdXNlIGluIGEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHN1bW1hcnkgQWRkcyBiYWNrc2xhc2hlcyBiZWZvcmUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMsXG4gKiBhbGxvd2luZyB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgYSBsaXRlcmFsIG1hdGNoIGluIGEgUmVnRXhwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgcmVndWxhciBleHByZXNzaW9uIHVzZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGVzY2FwZWQgc3RyaW5nIHNhZmUgZm9yIHVzZSBpbiByZWd1bGFyIGV4cHJlc3Npb25zLlxuICpcbiAqIEBmdW5jdGlvbiBlc2NhcGVSZWdFeHBcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTsgLy8gJCYgbWVhbnMgdGhlIHdob2xlIG1hdGNoZWQgc3RyaW5nXG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IFJlY29yZDxzdHJpbmcsIGFueT59IFthcmdzXSByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtdXG4pIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgIGlmIChcbiAgICAgICFhcmdzLmV2ZXJ5KChhcmcpID0+IHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIilcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBPbmx5IHN0cmluZyBhbmQgbnVtYmVyIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkIGZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMuYFxuICAgICAgKTtcbiAgfVxuXG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG9iaiA9IGFyZ3NbMF0gYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgIH0sIHN0cmluZyk7XG4gIH1cblxuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT09IFwidW5kZWZpbmVkXCJcbiAgICAgID8gYXJnc1tudW1iZXJdLnRvU3RyaW5nKClcbiAgICAgIDogXCJ1bmRlZmluZWRcIjtcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBzZWUgc2ZcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdGb3JtYXQgPSBzZjtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBhIGJyb3dzZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBmdW5jdGlvbiBpc0Jyb3dzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsVGhpcykpICE9PVxuICAgIE9iamVjdC5wcm90b3R5cGVcbiAgKTtcbn1cbiIsImltcG9ydCB7IE9iamVjdEFjY3VtdWxhdG9yIH0gZnJvbSBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiO1xuaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tIFwiLi93ZWJcIjtcbmltcG9ydCB7XG4gIEJyb3dzZXJFbnZLZXksXG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBFTlZfUEFUSF9ERUxJTUlURVIsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IHR5cGUgZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAqIEBzdW1tYXJ5IERlc2NyaWJlcyBmYWN0b3JpZXMgdGhhdCBjb25zdHJ1Y3Qge0BsaW5rIEVudmlyb25tZW50fSBkZXJpdmF0aXZlcyB3aXRoIGN1c3RvbSBpbml0aWFsaXphdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRoZSBFbnZpcm9ubWVudCB3aWxsIGFjY3VtdWxhdGUuXG4gKiBAdGVtcGxhdGUgRSAtIFRoZSBzcGVjaWZpYyBFbnZpcm9ubWVudCB0eXBlIHRvIGJlIGNyZWF0ZWQsIGV4dGVuZGluZyBFbnZpcm9ubWVudDxUPi5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih1bmtub3duW10pOiBFfSBFbnZpcm9ubWVudEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudEZhY3Rvcnk8VCBleHRlbmRzIG9iamVjdCwgRSBleHRlbmRzIEVudmlyb25tZW50PFQ+PiA9IChcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IEU7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudmlyb25tZW50IGFjY3VtdWxhdG9yIHRoYXQgbGF6aWx5IHJlYWRzIGZyb20gcnVudGltZSBzb3VyY2VzLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB7QGxpbmsgT2JqZWN0QWNjdW11bGF0b3J9IHRvIG1lcmdlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB3aGlsZSByZXNvbHZpbmcgdmFsdWVzIGZyb20gTm9kZSBvciBicm93c2VyIGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiBkZW1hbmQuXG4gKiBAdGVtcGxhdGUgVFxuICogQGNsYXNzIEVudmlyb25tZW50XG4gKiBAZXhhbXBsZVxuICogY29uc3QgQ29uZmlnID0gRW52aXJvbm1lbnQuYWNjdW11bGF0ZSh7IGxvZ2dpbmc6IHsgbGV2ZWw6IFwiaW5mb1wiIH0gfSk7XG4gKiBjb25zb2xlLmxvZyhDb25maWcubG9nZ2luZy5sZXZlbCk7XG4gKiBjb25zb2xlLmxvZyhTdHJpbmcoQ29uZmlnLmxvZ2dpbmcubGV2ZWwpKTsgLy8gPT4gTE9HR0lOR19fTEVWRUwga2V5IHdoZW4gc2VyaWFsaXplZFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRW52IGFzIEVudmlyb25tZW50XG4gKiAgIHBhcnRpY2lwYW50IFByb2Nlc3MgYXMgcHJvY2Vzcy5lbnZcbiAqICAgcGFydGljaXBhbnQgQnJvd3NlciBhcyBnbG9iYWxUaGlzLkVOVlxuICogICBDbGllbnQtPj5FbnY6IGFjY3VtdWxhdGUocGFydGlhbENvbmZpZylcbiAqICAgRW52LT4+RW52OiBleHBhbmQodmFsdWVzKVxuICogICBDbGllbnQtPj5FbnY6IENvbmZpZy5sb2dnaW5nLmxldmVsXG4gKiAgIGFsdCBCcm93c2VyIHJ1bnRpbWVcbiAqICAgICBFbnYtPj5Ccm93c2VyOiBsb29rdXAgRU5WIGtleVxuICogICAgIEJyb3dzZXItLT4+RW52OiByZXNvbHZlZCB2YWx1ZVxuICogICBlbHNlIE5vZGUgcnVudGltZVxuICogICAgIEVudi0+PlByb2Nlc3M6IGxvb2t1cCBFTlYga2V5XG4gKiAgICAgUHJvY2Vzcy0tPj5FbnY6IHJlc29sdmVkIHZhbHVlXG4gKiAgIGVuZFxuICogICBFbnYtLT4+Q2xpZW50OiBtZXJnZWQgdmFsdWVcbiAqL1xuY29uc3QgRW1wdHlWYWx1ZSA9IFN5bWJvbChcIkVudmlyb25tZW50RW1wdHlcIik7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudDxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE9iamVjdEFjY3VtdWxhdG9yPFQ+IHtcbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gQSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBFbnZpcm9ubWVudCBpbnN0YW5jZXMuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFbnZpcm9ubWVudDxhbnk+fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZhY3Rvcnk6IEVudmlyb25tZW50RmFjdG9yeTxhbnksIGFueT4gPVxuICAgICgpOiBFbnZpcm9ubWVudDxhbnk+ID0+IG5ldyBFbnZpcm9ubWVudCgpO1xuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcml2YXRlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHR5cGUge0Vudmlyb25tZW50PGFueT59XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVudmlyb25tZW50PGFueT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgYnJvd3NlciBhbmQgTm9kZS5qcyBlbnZpcm9ubWVudHMgYnkgbm9ybWFsaXppbmcga2V5cyBhbmQgcGFyc2luZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrIC0gS2V5IHRvIHJlc29sdmUgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge3Vua25vd259IFZhbHVlIHJlc29sdmVkIGZyb20gdGhlIGVudmlyb25tZW50IG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGZyb21FbnYoazogc3RyaW5nKSB7XG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICBlbnYgPVxuICAgICAgICAoXG4gICAgICAgICAgZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICAgICAgICAgIFtCcm93c2VyRW52S2V5XTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICB9XG4gICAgICAgIClbQnJvd3NlckVudktleV0gfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGdsb2JhbFRoaXMucHJvY2Vzcy5lbnY7XG4gICAgICBrID0gdG9FTlZGb3JtYXQoayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlRW52VmFsdWUoZW52W2tdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgc3RyaW5naWZpZWQgZW52aXJvbm1lbnQgdmFsdWVzIGludG8gbmF0aXZlIHR5cGVzLlxuICAgKiBAc3VtbWFyeSBJbnRlcnByZXRzIGJvb2xlYW5zIGFuZCBudW1iZXJzIHdoaWxlIGxlYXZpbmcgb3RoZXIgdHlwZXMgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbCAtIFJhdyB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge3Vua25vd259IFBhcnNlZCB2YWx1ZSBjb252ZXJ0ZWQgdG8gYm9vbGVhbiwgbnVtYmVyLCBvciBsZWZ0IGFzLWlzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlRW52VmFsdWUodmFsOiB1bmtub3duKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWw7XG4gICAgaWYgKHZhbCA9PT0gXCJ0cnVlXCIpIHJldHVybiB0cnVlO1xuICAgIGlmICh2YWwgPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRmxvYXQodmFsKTtcbiAgICBpZiAoIWlzTmFOKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhwYW5kcyBhbiBvYmplY3QgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgbGF6eSBwcm9wZXJ0aWVzIHRoYXQgZmlyc3QgY29uc3VsdCBydW50aW1lIHZhcmlhYmxlcyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHNlZWRlZCB2YWx1ZXMuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGV4cGFuZGVkLlxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gT2JqZWN0IHRvIGV4cG9zZSB0aHJvdWdoIGVudmlyb25tZW50IGdldHRlcnMgYW5kIHNldHRlcnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhwYW5kPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudiA9IHRoaXMuZnJvbUVudihrKTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZyb21FbnYgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmcm9tRW52O1xuICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh2IGFzIGFueSwgW2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIG1vZGVsIHByb3ZpZGVzIGFuIGVtcHR5IHN0cmluZywgbWFyayB3aXRoIEVtcHR5VmFsdWUgc28gaW5zdGFuY2UgcHJveHkgY2FuIHJldHVybiB1bmRlZmluZWQgd2l0aG91dCBlbmFibGluZyBrZXkgY29tcG9zaXRpb25cbiAgICAgICAgICBpZiAodiA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIEVtcHR5VmFsdWUgYXMgdW5rbm93biBhcyBWW2tleW9mIFZdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyBvbmx5IG9uZSB7QGxpbmsgRW52aXJvbm1lbnR9IGluc3RhbmNlIGlzIGNyZWF0ZWQsIHdyYXBwaW5nIGl0IGluIGEgcHJveHkgdG8gY29tcG9zZSBFTlYga2V5cyBvbiBkZW1hbmQuXG4gICAqIEB0ZW1wbGF0ZSBFXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gQXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgZmFjdG9yeSB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHNpbmdsZXRvbi5cbiAgICogQHJldHVybiB7RX0gU2luZ2xldG9uIGVudmlyb25tZW50IGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTxFIGV4dGVuZHMgRW52aXJvbm1lbnQ8YW55Pj4oLi4uYXJnczogdW5rbm93bltdKTogRSB7XG4gICAgaWYgKCFFbnZpcm9ubWVudC5faW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBFbnZpcm9ubWVudC5mYWN0b3J5KC4uLmFyZ3MpIGFzIEU7XG4gICAgICBjb25zdCBwcm94aWVkID0gbmV3IFByb3h5KGJhc2UgYXMgYW55LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IEVtcHR5VmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgaW5zdGFuY2UgYnV0IHJlc29sdmVzIHRvIHVuZGVmaW5lZCwgcmV0dXJuIHVuZGVmaW5lZCAobm8gcHJveHkpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHByb3AgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHByb3ApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBpbnRlcmZlcmluZyB3aXRoIGxvZ2dpbmcgY29uZmlnIGxvb2t1cHMgZm9yIG9wdGlvbmFsIGZpZWxkcyBsaWtlICdhcHAnXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJhcHBcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgW3Byb3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBFbnZpcm9ubWVudC5faW5zdGFuY2UgPSBwcm94aWVkIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcywgaGlkaW5nIHJhdyBkZXNjcmlwdG9ycyB0byBhdm9pZCBsZWFraW5nIGVudW1lcmF0aW9uIHNlbWFudGljcy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIE9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7RW52aXJvbm1lbnR9IFVwZGF0ZWQgZW52aXJvbm1lbnQgcmVmZXJlbmNlLlxuICAgKi9cbiAgc3RhdGljIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdCwgVEJhc2UgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IEVudmlyb25tZW50PFRCYXNlICYgVj4gJiBUQmFzZSAmIFYge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRW52aXJvbm1lbnQuaW5zdGFuY2U8RW52aXJvbm1lbnQ8VEJhc2UgJiBWPj4oKTtcbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZSBhcyBhbnkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5zdGFuY2UgYXMgYW55LCBrZXkpO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSBhcyBhbnksIGtleSwge1xuICAgICAgICAgIC4uLmRlc2MsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZS5hY2N1bXVsYXRlKHZhbHVlKSBhcyB1bmtub3duIGFzIEVudmlyb25tZW50PFRCYXNlICYgVj4gJlxuICAgICAgVEJhc2UgJlxuICAgICAgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgdXNpbmcgYSBkb3QtcGF0aCBrZXkgZnJvbSB0aGUgYWNjdW11bGF0ZWQgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIHRvIGFjY2VzcyBzdG9yZWQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleSB0byByZXNvbHZlIGZyb20gdGhlIGVudmlyb25tZW50IHN0b3JlLlxuICAgKiBAcmV0dXJuIHt1bmtub3dufSBTdG9yZWQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIHByb3h5IHRoYXQgY29tcG9zZXMgZW52aXJvbm1lbnQga2V5cyBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBjaGFpbmVkIHByb3BlcnR5IGFjY2VzcyB0byBlbWl0IHVwcGVyY2FzZSBFTlYgaWRlbnRpZmllcnMgd2hpbGUgaG9ub3JpbmcgZXhpc3RpbmcgcnVudGltZSBvdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7YW55fSBjdXJyZW50IC0gU2VlZCBtb2RlbCBzZWdtZW50IHVzZWQgd2hlbiBwcm9qZWN0aW5nIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gQWNjdW11bGF0ZWQgcGF0aCBzZWdtZW50cyBsZWFkaW5nIHRvIHRoZSBwcm94eS5cbiAgICogQHJldHVybiB7YW55fSBQcm94eSB0aGF0IHJlc29sdmVzIGVudmlyb25tZW50IHZhbHVlcyBvciBjb21wb3NlcyBhZGRpdGlvbmFsIHByb3hpZXMgZm9yIGRlZXBlciBwYXRocy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkRW52UHJveHkoY3VycmVudDogYW55LCBwYXRoOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgYnVpbGRLZXkgPSAocDogc3RyaW5nW10pID0+XG4gICAgICBwLm1hcCgoc2VnKSA9PiB0b0VOVkZvcm1hdChzZWcpKS5qb2luKEVOVl9QQVRIX0RFTElNSVRFUik7XG5cbiAgICAvLyBIZWxwZXIgdG8gcmVhZCBmcm9tIHRoZSBhY3RpdmUgZW52aXJvbm1lbnQgZ2l2ZW4gYSBjb21wb3NlZCBrZXlcbiAgICBjb25zdCByZWFkRW52ID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgICAgY29uc3QgZW52ID0gKFxuICAgICAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgICAgICBbQnJvd3NlckVudktleV0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB9XG4gICAgICAgIClbQnJvd3NlckVudktleV07XG4gICAgICAgIHJldHVybiBlbnYgPyBlbnZba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpPy5wcm9jZXNzPy5lbnY/LltrZXldO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcbiAgICAgIGdldChfdGFyZ2V0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC50b1ByaW1pdGl2ZSkge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBidWlsZEtleShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcCA9PT0gXCJ0b1N0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInZhbHVlT2ZcIikge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBidWlsZEtleShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgaGFzUHJvcCA9XG4gICAgICAgICAgISFjdXJyZW50ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBwcm9wKTtcbiAgICAgICAgY29uc3QgbmV4dE1vZGVsID0gaGFzUHJvcCA/IChjdXJyZW50IGFzIGFueSlbcHJvcF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IG5leHRQYXRoID0gWy4uLnBhdGgsIHByb3BdO1xuICAgICAgICBjb25zdCBjb21wb3NlZEtleSA9IGJ1aWxkS2V5KG5leHRQYXRoKTtcblxuICAgICAgICAvLyBJZiBhbiBFTlYgdmFsdWUgZXhpc3RzIGZvciB0aGlzIHBhdGgsIHJldHVybiBpdCBkaXJlY3RseVxuICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHJlYWRFbnYoY29tcG9zZWRLZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGVudlZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZW52VmFsdWU7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgbW9kZWwgaGFzIGFuIG9iamVjdCBhdCB0aGlzIHBhdGgsIGtlZXAgZHJpbGxpbmcgd2l0aCBhIHByb3h5XG4gICAgICAgIGNvbnN0IGlzTmV4dE9iamVjdCA9IG5leHRNb2RlbCAmJiB0eXBlb2YgbmV4dE1vZGVsID09PSBcIm9iamVjdFwiO1xuICAgICAgICBpZiAoaXNOZXh0T2JqZWN0KSByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eShuZXh0TW9kZWwsIG5leHRQYXRoKTtcblxuICAgICAgICAvLyBJZiB0aGUgbW9kZWwgbWFya3MgdGhpcyBsZWFmIGFzIGFuIGVtcHR5IHN0cmluZywgdHJlYXQgYXMgdW5kZWZpbmVkIChubyBwcm94eSlcbiAgICAgICAgaWYgKGhhc1Byb3AgJiYgbmV4dE1vZGVsID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAvLyBJZiB0aGUgbW9kZWwgZXhwbGljaXRseSBjb250YWlucyB0aGUgcHJvcGVydHkgd2l0aCB2YWx1ZSB1bmRlZmluZWQsIHRyZWF0IGFzIHVuZGVmaW5lZCAobm8gcHJveHkpXG4gICAgICAgIGlmIChoYXNQcm9wICYmIHR5cGVvZiBuZXh0TW9kZWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhIHByb3h5IGZvciBmdXJ0aGVyIHBhdGggY29tcG9zaXRpb24gd2hlbiBubyBFTlYgdmFsdWU7XG4gICAgICAgIC8vIGRvIG5vdCBzdXJmYWNlIHByaW1pdGl2ZSBtb2RlbCBkZWZhdWx0cyBoZXJlICh0aGlzIEFQSSBpcyBmb3Iga2V5IGNvbXBvc2l0aW9uKS5cbiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodW5kZWZpbmVkLCBuZXh0UGF0aCk7XG4gICAgICB9LFxuICAgICAgb3duS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPyBSZWZsZWN0Lm93bktleXMoY3VycmVudCkgOiBbXTtcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3QsIHApIHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBwKSkge1xuICAgICAgICAgIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHt9IGFzIGFueTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBrZXlzIG9mIHRoZSBlbnZpcm9ubWVudCwgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gdG8gRU5WIGZvcm1hdC5cbiAgICogQHN1bW1hcnkgR2V0cyBhbGwga2V5cyBpbiB0aGUgZW52aXJvbm1lbnQsIHdpdGggYW4gb3B0aW9uIHRvIGZvcm1hdCB0aGVtIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvRW52PXRydWVdIC0gV2hldGhlciB0byBjb252ZXJ0IHRoZSBrZXlzIHRvIEVOViBmb3JtYXQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgc3RhdGljIGtleXModG9FbnY6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5pbnN0YW5jZSgpXG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChrKSA9PiAodG9FbnYgPyB0b0VOVkZvcm1hdChrKSA6IGspKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaW5nbGV0b24gZW52aXJvbm1lbnQgaW5zdGFuY2Ugc2VlZGVkIHdpdGggZGVmYXVsdCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAc3VtbWFyeSBDb21iaW5lcyB7QGxpbmsgRGVmYXVsdExvZ2dpbmdDb25maWd9IHdpdGggcnVudGltZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcHJvdmlkZSBjb25zaXN0ZW50IGxvZ2dpbmcgZGVmYXVsdHMgYWNyb3NzIHBsYXRmb3Jtcy5cbiAqIEBjb25zdCBMb2dnZWRFbnZpcm9ubWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBMb2dnZWRFbnZpcm9ubWVudCA9IEVudmlyb25tZW50LmFjY3VtdWxhdGUoXG4gIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRMb2dnaW5nQ29uZmlnLCB7XG4gICAgZW52OlxuICAgICAgKGlzQnJvd3NlcigpICYmIChnbG9iYWxUaGlzIGFzIGFueSlbQnJvd3NlckVudktleV1cbiAgICAgICAgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldW1wiTk9ERV9FTlZcIl1cbiAgICAgICAgOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnByb2Nlc3MuZW52W1wiTk9ERV9FTlZcIl0pIHx8IFwiZGV2ZWxvcG1lbnRcIixcbiAgfSlcbik7XG4iLCJpbXBvcnQge1xuICBMb2dnZXJGYWN0b3J5LFxuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIExvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IERlZmF1bHRUaGVtZSwgTG9nTGV2ZWwsIE51bWVyaWNMb2dMZXZlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4vdGV4dFwiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9lbnZpcm9ubWVudFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMsIHZlcmJvc2l0eSxcbiAqIGNvbnRleHQtYXdhcmUgbG9nZ2luZywgYW5kIGN1c3RvbWl6YWJsZSBmb3JtYXR0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBUaGUgY29udGV4dCAodHlwaWNhbGx5IGNsYXNzIG5hbWUpIHRoaXMgbG9nZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICogQHBhcmFtIHtQYXJ0aWFsPExvZ2dpbmdDb25maWc+fSBjb25mIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBnbG9iYWwgc2V0dGluZ3NcbiAqIEBjbGFzcyBNaW5pTG9nZ2VyXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IGxvZ2dlciBmb3IgYSBjbGFzc1xuICogY29uc3QgbG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoJ015Q2xhc3MnKTtcbiAqXG4gKiAvLyBMb2cgbWVzc2FnZXMgYXQgZGlmZmVyZW50IGxldmVsc1xuICogbG9nZ2VyLmluZm8oJ1RoaXMgaXMgYW4gaW5mbyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1RoaXMgaXMgYSBkZWJ1ZyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZFxuICogY29uc3QgbWV0aG9kTG9nZ2VyID0gbG9nZ2VyLmZvcignbXlNZXRob2QnKTtcbiAqIG1ldGhvZExvZ2dlci52ZXJib3NlKCdEZXRhaWxlZCBpbmZvcm1hdGlvbicsIDIpO1xuICpcbiAqIC8vIExvZyB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uXG4gKiBsb2dnZXIuZm9yKCdzcGVjaWFsTWV0aG9kJywgeyBzdHlsZTogdHJ1ZSB9KS5pbmZvKCdTdHlsZWQgbWVzc2FnZScpO1xuICovXG5leHBvcnQgY2xhc3MgTWluaUxvZ2dlciBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICkge31cblxuICBwcm90ZWN0ZWQgY29uZmlnKFxuICAgIGtleToga2V5b2YgTG9nZ2luZ0NvbmZpZ1xuICApOiBMb2dnaW5nQ29uZmlnW2tleW9mIExvZ2dpbmdDb25maWddIHtcbiAgICBpZiAodGhpcy5jb25mICYmIGtleSBpbiB0aGlzLmNvbmYpIHJldHVybiB0aGlzLmNvbmZba2V5XTtcbiAgICByZXR1cm4gTG9nZ2luZy5nZXRDb25maWcoKVtrZXldO1xuICB9XG5cbiAgZm9yKG1ldGhvZDogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSk6IExvZ2dlcjtcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPik6IExvZ2dlcjtcbiAgZm9yKFxuICAgIG1ldGhvZDogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IExvZ2dlcjtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZCBvciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCBleHRlbmRlZCBieSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBjcmVhdGUgYSBsb2dnZXIgZm9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBzZXR0aW5nc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbG9nZ2VyIGZhY3RvcnlcbiAgICogQHJldHVybiB7TG9nZ2VyfSBBIG5ldyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kXG4gICAqL1xuICBmb3IoXG4gICAgbWV0aG9kPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyIHtcbiAgICBpZiAoIWNvbmZpZyAmJiB0eXBlb2YgbWV0aG9kID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25maWcgPSBtZXRob2Q7XG4gICAgICBtZXRob2QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1ldGhvZFxuICAgICAgICA/IHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IG1ldGhvZFxuICAgICAgICAgIDogKG1ldGhvZCBhcyBhbnkpLm5hbWVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwID09PSBcImNvbmZpZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLmNvbmZpZywge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcy5jb25maWcsIHA6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIHAgaW4gY29uZmlnKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbcCBhcyBrZXlvZiBMb2dnaW5nQ29uZmlnXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gXCJjb250ZXh0XCIgJiYgbWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHQsIG1ldGhvZF0uam9pbihcIi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBmb3JtYXR0ZWQgbG9nIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBsb2cgc3RyaW5nIHdpdGggdGltZXN0YW1wLCBjb2xvcmVkIGxvZyBsZXZlbCwgY29udGV4dCwgYW5kIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIGZvciB0aGlzIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlIHwgRXJyb3J9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBsb2cgb3IgYW4gRXJyb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JdIC0gT3B0aW9uYWwgZXJyb3IgdG8gZXh0cmFjdCBzdGFjayB0cmFjZSB0byBpbmNsdWRlIGluIHRoZSBsb2dcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIGZvcm1hdHRlZCBsb2cgc3RyaW5nIHdpdGggYWxsIGNvbXBvbmVudHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBlcnJvcj86IEVycm9yXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nOiBSZWNvcmQ8XG4gICAgICB8IFwidGltZXN0YW1wXCJcbiAgICAgIHwgXCJsZXZlbFwiXG4gICAgICB8IFwiY29udGV4dFwiXG4gICAgICB8IFwiY29ycmVsYXRpb25JZFwiXG4gICAgICB8IFwibWVzc2FnZVwiXG4gICAgICB8IFwic2VwYXJhdG9yXCJcbiAgICAgIHwgXCJzdGFja1wiXG4gICAgICB8IFwiYXBwXCIsXG4gICAgICBzdHJpbmdcbiAgICA+ID0ge30gYXMgYW55O1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5jb25maWcoXCJzdHlsZVwiKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSB0aGlzLmNvbmZpZyhcInNlcGFyYXRvclwiKTtcbiAgICBjb25zdCBhcHAgPSB0aGlzLmNvbmZpZyhcImFwcFwiKTtcbiAgICBpZiAoYXBwKVxuICAgICAgbG9nLmFwcCA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShhcHAgYXMgc3RyaW5nLCBcImFwcFwiLCBsZXZlbClcbiAgICAgICAgOiAoYXBwIGFzIHN0cmluZyk7XG5cbiAgICBpZiAoc2VwYXJhdG9yKVxuICAgICAgbG9nLnNlcGFyYXRvciA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShzZXBhcmF0b3IgYXMgc3RyaW5nLCBcInNlcGFyYXRvclwiLCBsZXZlbClcbiAgICAgICAgOiAoc2VwYXJhdG9yIGFzIHN0cmluZyk7XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJ0aW1lc3RhbXBcIikpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBzdHlsZSA/IExvZ2dpbmcudGhlbWUoZGF0ZSwgXCJ0aW1lc3RhbXBcIiwgbGV2ZWwpIDogZGF0ZTtcbiAgICAgIGxvZy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwibG9nTGV2ZWxcIikpIHtcbiAgICAgIGNvbnN0IGx2bDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKGxldmVsLCBcImxvZ0xldmVsXCIsIGxldmVsKVxuICAgICAgICA6IGxldmVsO1xuICAgICAgbG9nLmxldmVsID0gbHZsLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29ycmVsYXRpb25JZFwiKSkge1xuICAgICAge1xuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpLCBcImlkXCIsIGxldmVsKVxuICAgICAgICAgIDogdGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpO1xuICAgICAgICBsb2cuY29ycmVsYXRpb25JZCA9IGlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1zZzogc3RyaW5nID0gc3R5bGVcbiAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICBsZXZlbFxuICAgICAgICApXG4gICAgICA6IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWVzc2FnZVxuICAgICAgICA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgIGxvZy5tZXNzYWdlID0gbXNnO1xuICAgIGlmIChlcnJvciB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKGVycm9yPy5zdGFjayB8fCAobWVzc2FnZSBhcyBFcnJvcikuc3RhY2spIGFzIHN0cmluZyxcbiAgICAgICAgICAgIFwic3RhY2tcIixcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgKVxuICAgICAgICA6IGVycm9yPy5zdGFjayB8fCBcIlwiO1xuICAgICAgbG9nLnN0YWNrID0gYCB8ICR7KGVycm9yIHx8IChtZXNzYWdlIGFzIEVycm9yKSkubWVzc2FnZX0gLSBTdGFjayB0cmFjZTpcXG4ke3N0YWNrfWA7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZyhcImZvcm1hdFwiKSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxvZyk7XG4gICAgICBjYXNlIFwicmF3XCI6XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcoXCJwYXR0ZXJuXCIpIGFzIHN0cmluZylcbiAgICAgICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAgICAgLm1hcCgocykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzLm1hdGNoKC9cXHsuKj99L2cpKSByZXR1cm4gcztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFMgPSBzZihzLCBsb2cpO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlZFMgIT09IHMpIHJldHVybiBmb3JtYXR0ZWRTO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGZvcm1hdDogJHt0aGlzLmNvbmZpZyhcImZvcm1hdFwiKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWxcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgZm9ybWF0dGVkIGxvZ1xuICAgKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlIHwgRXJyb3J9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZCBvciBhbiBFcnJvciBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvcl0gLSBPcHRpb25hbCBzdGFjayB0cmFjZSB0byBpbmNsdWRlIGluIHRoZSBsb2dcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBsb2cobGV2ZWw6IExvZ0xldmVsLCBtc2c6IFN0cmluZ0xpa2UgfCBFcnJvciwgZXJyb3I/OiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZMdmwgPSB0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsO1xuICAgIGlmIChOdW1lcmljTG9nTGV2ZWxzW2NvbmZMdmxdIDwgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF0pIHJldHVybjtcbiAgICBsZXQgbWV0aG9kO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuYmVuY2htYXJrOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmxvZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBiZW5jaG1hcmsgbGV2ZWxcbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGJlbmNobWFyayBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgc2V0dGluZyBhbGxvd3MgaXRcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGJlbmNobWFyayhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5iZW5jaG1hcmssIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBzaWxseSBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgc2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IHNldHRpbmcgYWxsb3dzIGl0XG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSB2ZXJib3NlIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSB2ZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBzZXR0aW5nIGFsbG93cyBpdFxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3ZlcmJvc2l0eT0wXSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBpbmZvIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBpbmZvIGxldmVsIGZvciBnZW5lcmFsIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmluZm8sIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBkZWJ1ZyBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgZGVidWcgbGV2ZWwgZm9yIGRldGFpbGVkIHRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZGVidWcsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBlcnJvciBsZXZlbFxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgZXJyb3IgbGV2ZWwgZm9yIGVycm9ycyBhbmQgZXhjZXB0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2UgfCBFcnJvcn0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkIG9yIGFuIEVycm9yIG9iamVjdFxuICAgKiBAcGFyYW0gZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZXJyb3IobXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsIGU/OiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmVycm9yLCBtc2csIGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSBsb2dnZXIgY29uZmlndXJhdGlvblxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZXhpc3RpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbmYgPSB7IC4uLih0aGlzLmNvbmYgfHwge30pLCAuLi5jb25maWcgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YXRpYyBjbGFzcyBmb3IgbWFuYWdpbmcgbG9nZ2luZyBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTG9nZ2luZyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggc3VwcG9ydCBmb3JcbiAqIGRpZmZlcmVudCBsb2cgbGV2ZWxzLCB2ZXJib3NpdHksIGFuZCBzdHlsaW5nLiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFpbnRhaW4gYSBnbG9iYWxcbiAqIGxvZ2dlciBpbnN0YW5jZSBhbmQgYWxsb3dzIGNyZWF0aW5nIHNwZWNpZmljIGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtZXRob2RzLlxuICogQGNsYXNzIExvZ2dpbmdcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAqIExvZ2dpbmcuc2V0Q29uZmlnKHsgbGV2ZWw6IExvZ0xldmVsLmRlYnVnLCBzdHlsZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBHZXQgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgY2xhc3NcbiAqIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzJyk7XG4gKlxuICogLy8gTG9nIG1lc3NhZ2VzIGF0IGRpZmZlcmVudCBsZXZlbHNcbiAqIGxvZ2dlci5pbmZvKCdBcHBsaWNhdGlvbiBzdGFydGVkJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgZGF0YS4uLicpO1xuICpcbiAqIC8vIExvZyB3aXRoIGNvbnRleHRcbiAqIGNvbnN0IG1ldGhvZExvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzLm15TWV0aG9kJyk7XG4gKiBtZXRob2RMb2dnZXIudmVyYm9zZSgnRGV0YWlsZWQgb3BlcmF0aW9uIGluZm9ybWF0aW9uJywgMSk7XG4gKlxuICogLy8gTG9nIGVycm9yc1xuICogdHJ5IHtcbiAqICAgLy8gc29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGxvZ2dlci5lcnJvcihlcnJvcik7XG4gKiB9XG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIExvZ2dlciB7XG4gKiAgICAgPDxpbnRlcmZhY2U+PlxuICogICAgICtmb3IobWV0aG9kLCBjb25maWcsIC4uLmFyZ3MpXG4gKiAgICAgK3NpbGx5KG1zZywgdmVyYm9zaXR5KVxuICogICAgICt2ZXJib3NlKG1zZywgdmVyYm9zaXR5KVxuICogICAgICtpbmZvKG1zZylcbiAqICAgICArZGVidWcobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK3NldENvbmZpZyhjb25maWcpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIExvZ2dpbmcge1xuICogICAgIC1nbG9iYWw6IExvZ2dlclxuICogICAgIC1fZmFjdG9yeTogTG9nZ2VyRmFjdG9yeVxuICogICAgIC1fY29uZmlnOiBMb2dnaW5nQ29uZmlnXG4gKiAgICAgK3NldEZhY3RvcnkoZmFjdG9yeSlcbiAqICAgICArc2V0Q29uZmlnKGNvbmZpZylcbiAqICAgICArZ2V0Q29uZmlnKClcbiAqICAgICArZ2V0KClcbiAqICAgICArdmVyYm9zZShtc2csIHZlcmJvc2l0eSlcbiAqICAgICAraW5mbyhtc2cpXG4gKiAgICAgK2RlYnVnKG1zZylcbiAqICAgICArc2lsbHkobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK2ZvcihvYmplY3QsIGNvbmZpZywgLi4uYXJncylcbiAqICAgICArYmVjYXVzZShyZWFzb24sIGlkKVxuICogICAgICt0aGVtZSh0ZXh0LCB0eXBlLCBsb2dnZXJMZXZlbCwgdGVtcGxhdGUpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE1pbmlMb2dnZXIge1xuICogICAgICtjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb25mPylcbiAqICAgfVxuICpcbiAqICAgTG9nZ2luZyAuLj4gTG9nZ2VyIDogY3JlYXRlc1xuICogICBMb2dnaW5nIC4uPiBNaW5pTG9nZ2VyIDogY3JlYXRlcyBieSBkZWZhdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbD86IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXNcbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgbmV3IExvZ2dlciBpbnN0YW5jZXMuIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBNaW5pTG9nZ2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIF9jb25maWc6IHR5cGVvZiBMb2dnZWRFbnZpcm9ubWVudCA9IExvZ2dlZEVudmlyb25tZW50O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9nZ2VyIGluc3RhbmNlc1xuICAgKiBAc3VtbWFyeSBBbGxvd3MgY3VzdG9taXppbmcgaG93IGxvZ2dlciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHtMb2dnZXJGYWN0b3J5fSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gdXNlIGZvciBjcmVhdGluZyBsb2dnZXJzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0RmFjdG9yeShmYWN0b3J5OiBMb2dnZXJGYWN0b3J5KSB7XG4gICAgTG9nZ2luZy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHN1bW1hcnkgQWxsb3dzIHVwZGF0aW5nIHRoZSBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uIHdpdGggbmV3IHNldHRpbmdzXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhjb25maWcpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgKHRoaXMuX2NvbmZpZyBhcyBhbnkpW2tdID0gdiBhcyBhbnk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtMb2dnaW5nQ29uZmlnfSBBIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldENvbmZpZygpOiB0eXBlb2YgTG9nZ2VkRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyBnbG9iYWwgbG9nZ2VyIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIGdsb2JhbCBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IExvZ2dlciB7XG4gICAgdGhpcy5nbG9iYWwgPSB0aGlzLmdsb2JhbCA/IHRoaXMuZ2xvYmFsIDogdGhpcy5fZmFjdG9yeShcIkxvZ2dpbmdcIik7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc3RhdGljIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS52ZXJib3NlKG1zZywgdmVyYm9zaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgaW5mbyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuaW5mbyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmRlYnVnKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBiZW5jaG1hcmsgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBiZW5jaG1hcmsgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBiZW5jaG1hcmsobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuYmVuY2htYXJrKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgc2lsbHkobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuc2lsbHkobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGVycm9yIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBlXG4gICAqL1xuICBzdGF0aWMgZXJyb3IobXNnOiBTdHJpbmdMaWtlLCBlPzogRXJyb3IpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5lcnJvcihtc2csIGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG9iamVjdCBvciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IG9yIGNvbnRleHQgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtMb2dnaW5nQ29udGV4dH0gb2JqZWN0IC0gVGhlIG9iamVjdCwgY2xhc3MsIG9yIGNvbnRleHQgdG8gY3JlYXRlIGEgbG9nZ2VyIGZvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IFtjb25maWddIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBnbG9iYWwgc2V0dGluZ3NcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBsb2dnZXIgZmFjdG9yeVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IEEgbmV3IGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3Qgb3IgY29udGV4dFxuICAgKi9cbiAgc3RhdGljIGZvcihcbiAgICBvYmplY3Q6IExvZ2dpbmdDb250ZXh0LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyIHtcbiAgICBvYmplY3QgPVxuICAgICAgdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IG9iamVjdC5jb25zdHJ1Y3RvclxuICAgICAgICAgID8gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICA6IG9iamVjdC5uYW1lO1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KG9iamVjdCwgY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29ycmVsYXRpb24gY29udGV4dFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IHRvIHF1aWNrbHkgY3JlYXRlIGEgbG9nZ2VyIGxhYmVsZWQgd2l0aCBhIGZyZWUtZm9ybSByZWFzb24gYW5kIG9wdGlvbmFsIGlkZW50aWZpZXJcbiAgICogc28gdGhhdCBhZC1ob2Mgb3BlcmF0aW9ucyBjYW4gYmUgdHJhY2VkIHdpdGhvdXQgdHlpbmcgdGhlIGxvZ2dlciB0byBhIGNsYXNzIG9yIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gQSB0ZXh0dWFsIHJlYXNvbiBvciBjb250ZXh0IGxhYmVsIGZvciB0aGlzIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaGVscCBjb3JyZWxhdGUgcmVsYXRlZCBsb2cgZW50cmllc1xuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IEEgbmV3IGxvZ2dlciBpbnN0YW5jZSBsYWJlbGVkIHdpdGggdGhlIHByb3ZpZGVkIHJlYXNvbiBhbmQgaWRcbiAgICovXG4gIHN0YXRpYyBiZWNhdXNlKHJlYXNvbjogc3RyaW5nLCBpZD86IHN0cmluZyk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3RvcnkocmVhc29uLCB0aGlzLl9jb25maWcsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGVtZSBzdHlsaW5nIHRvIHRleHRcbiAgICogQHN1bW1hcnkgQXBwbGllcyBzdHlsaW5nIChjb2xvcnMsIGZvcm1hdHRpbmcpIHRvIHRleHQgYmFzZWQgb24gdGhlIHRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBzdHlsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gc3R5bGUgKGUuZy4sIFwiY2xhc3NcIiwgXCJtZXNzYWdlXCIsIFwibG9nTGV2ZWxcIilcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbG9nZ2VyTGV2ZWwgLSBUaGUgbG9nIGxldmVsIHRvIHVzZSBmb3Igc3R5bGluZ1xuICAgKiBAcGFyYW0ge1RoZW1lfSBbdGVtcGxhdGU9RGVmYXVsdFRoZW1lXSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3R5bGVkIHRleHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgVGhlbWUgYXMgTG9nZ2luZy50aGVtZVxuICAgKiAgIHBhcnRpY2lwYW50IEFwcGx5IGFzIGFwcGx5IGZ1bmN0aW9uXG4gICAqICAgcGFydGljaXBhbnQgU3R5bGUgYXMgc3R5bGVkLXN0cmluZy1idWlsZGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+VGhlbWU6IHRoZW1lKHRleHQsIHR5cGUsIGxvZ2dlckxldmVsKVxuICAgKiAgIFRoZW1lLT4+VGhlbWU6IENoZWNrIGlmIHN0eWxpbmcgaXMgZW5hYmxlZFxuICAgKiAgIGFsdCBzdHlsaW5nIGRpc2FibGVkXG4gICAqICAgICBUaGVtZS0tPj5DYWxsZXI6IHJldHVybiBvcmlnaW5hbCB0ZXh0XG4gICAqICAgZWxzZSBzdHlsaW5nIGVuYWJsZWRcbiAgICogICAgIFRoZW1lLT4+VGhlbWU6IEdldCB0aGVtZSBmb3IgdHlwZVxuICAgKiAgICAgYWx0IHRoZW1lIG5vdCBmb3VuZFxuICAgKiAgICAgICBUaGVtZS0tPj5DYWxsZXI6IHJldHVybiBvcmlnaW5hbCB0ZXh0XG4gICAqICAgICBlbHNlIHRoZW1lIGZvdW5kXG4gICAqICAgICAgIFRoZW1lLT4+VGhlbWU6IERldGVybWluZSBhY3R1YWwgdGhlbWUgYmFzZWQgb24gbG9nIGxldmVsXG4gICAqICAgICAgIFRoZW1lLT4+QXBwbHk6IEFwcGx5IGVhY2ggc3R5bGUgcHJvcGVydHlcbiAgICogICAgICAgQXBwbHktPj5TdHlsZTogQXBwbHkgY29sb3JzIGFuZCBmb3JtYXR0aW5nXG4gICAqICAgICAgIFN0eWxlLS0+PkFwcGx5OiBSZXR1cm4gc3R5bGVkIHRleHRcbiAgICogICAgICAgQXBwbHktLT4+VGhlbWU6IFJldHVybiBzdHlsZWQgdGV4dFxuICAgKiAgICAgICBUaGVtZS0tPj5DYWxsZXI6IFJldHVybiBmaW5hbCBzdHlsZWQgdGV4dFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgdGhlbWUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IGtleW9mIFRoZW1lIHwga2V5b2YgTG9nTGV2ZWwsXG4gICAgbG9nZ2VyTGV2ZWw6IExvZ0xldmVsLFxuICAgIHRlbXBsYXRlOiBUaGVtZSA9IERlZmF1bHRUaGVtZVxuICApIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zdHlsZSkgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IodGhpcy50aGVtZSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseShcbiAgICAgIHR4dDogc3RyaW5nLFxuICAgICAgb3B0aW9uOiBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdIHwgc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdDogc3RyaW5nIHwgU3R5bGVkU3RyaW5nID0gdHh0O1xuICAgICAgICBsZXQgYyA9IHN0eWxlKHQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoXG4gICAgICAgICAgdmFsOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBpc0JnID0gZmFsc2VcbiAgICAgICAgKTogU3R5bGVkU3RyaW5nIHtcbiAgICAgICAgICBsZXQgZjpcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuYmFja2dyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLnJnYlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5jb2xvcjI1NiA9IGlzQmcgPyBjLmJhY2tncm91bmQgOiBjLmZvcmVncm91bmQ7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iYWNrZ3JvdW5kIHwgdHlwZW9mIGMuZm9yZWdyb3VuZCkuY2FsbChcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnQ29sb3IyNTYgOiBjLmNvbG9yMjU2O1xuICAgICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmdDb2xvcjI1NiB8IHR5cGVvZiBjLmNvbG9yMjU2KSh2YWxbMF0pO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdSZ2IgOiBjLnJnYjtcbiAgICAgICAgICAgICAgcmV0dXJuIGMucmdiKHZhbFswXSwgdmFsWzFdLCB2YWxbMl0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCBjb2xvciBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUodCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUodjogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjID0gYy5zdHlsZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGNbdiBhcyBrZXlvZiBDb2xvcml6ZU9wdGlvbnNdIGFzIFN0eWxlZFN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJiZ1wiOlxuICAgICAgICAgIGNhc2UgXCJmZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29sb3IodmFsdWUgYXMgbnVtYmVyKS50ZXh0O1xuICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goYXBwbHlTdHlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBseVN0eWxlKHZhbHVlIGFzIG51bWJlciB8IHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYy50ZXh0O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIHRoZW1lIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgYXBwbHlpbmcgc3R5bGU6ICR7b3B0aW9ufSB3aXRoIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaXZpZHVhbFRoZW1lID0gdGVtcGxhdGVbdHlwZSBhcyBrZXlvZiBUaGVtZV07XG4gICAgaWYgKCFpbmRpdmlkdWFsVGhlbWUgfHwgIU9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsVGhlbWU6IFRoZW1lT3B0aW9uID0gaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uO1xuXG4gICAgY29uc3QgbG9nTGV2ZWxzID0gT2JqZWN0LmFzc2lnbih7fSwgTG9nTGV2ZWwpO1xuICAgIGlmIChPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpWzBdIGluIGxvZ0xldmVscylcbiAgICAgIGFjdHVhbFRoZW1lID1cbiAgICAgICAgKGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwpW2xvZ2dlckxldmVsXSB8fCB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3R1YWxUaGVtZSkucmVkdWNlKChhY2M6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IChhY3R1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbilba2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uXTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICBhY2MsXG4gICAgICAgICAga2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgICAgIHZhbCBhc1xuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgIHwgW251bWJlcl1cbiAgICAgICAgICAgIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICB8IG51bWJlcltdXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgcmVhZHktdG8tdXNlIGxvZ2dlciBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFN1cHBsaWVzIGluaGVyaXRpbmcgY2xhc3NlcyB3aXRoIGEgbGF6aWx5IGNyZWF0ZWQsIGNvbnRleHQtYXdhcmUge0BsaW5rIExvZ2dlcn0gdmlhIHRoZSBwcm90ZWN0ZWQgYGxvZ2AgZ2V0dGVyLCBwcm9tb3RpbmcgY29uc2lzdGVudCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgd2l0aG91dCBtYW51YWwgd2lyaW5nLlxuICogQGNsYXNzIExvZ2dlZENsYXNzXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gKiAgIGNyZWF0ZSh1c2VyOiBVc2VyKSB7XG4gKiAgICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdXNlciAke3VzZXIuaWR9YCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBzdmMgPSBuZXcgVXNlclNlcnZpY2UoKTtcbiAqIHN2Yy5jcmVhdGUoeyBpZDogXCI0MlwiIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5zdGFuY2UgYXMgU3ViY2xhc3MgSW5zdGFuY2VcbiAqICAgcGFydGljaXBhbnQgR2V0dGVyIGFzIExvZ2dlZENsYXNzLmxvZ1xuICogICBwYXJ0aWNpcGFudCBMb2dnaW5nIGFzIExvZ2dpbmdcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dlclxuICpcbiAqICAgQ2xpZW50LT4+SW5zdGFuY2U6IGNhbGwgc29tZU1ldGhvZCgpXG4gKiAgIEluc3RhbmNlLT4+R2V0dGVyOiBhY2Nlc3MgdGhpcy5sb2dcbiAqICAgR2V0dGVyLT4+TG9nZ2luZzogTG9nZ2luZy5mb3IodGhpcylcbiAqICAgTG9nZ2luZy0tPj5HZXR0ZXI6IHJldHVybiBMb2dnZXJcbiAqICAgR2V0dGVyLS0+Pkluc3RhbmNlOiByZXR1cm4gTG9nZ2VyXG4gKiAgIEluc3RhbmNlLT4+TG9nZ2VyOiBpbmZvL2RlYnVnL2Vycm9yKC4uLilcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBfbG9nPzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGF6aWx5IHByb3ZpZGVzIGEgY29udGV4dC1hd2FyZSBsb2dnZXIgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBDYWxscyB7QGxpbmsgTG9nZ2luZy5mb3J9IHdpdGggdGhlIHN1YmNsYXNzIGluc3RhbmNlIHRvIG9idGFpbiBhIGxvZ2dlciB3aG9zZSBjb250ZXh0IG1hdGNoZXMgdGhlIHN1YmNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gTG9nZ2VyIGJvdW5kIHRvIHRoZSBzdWJjbGFzcyBjb250ZXh0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZykgdGhpcy5fbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nQ29uZmlnLCBMb2dnaW5nRmlsdGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCIuLi9Mb2dnZWRDbGFzc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNsYXNzIGZvciBtZXNzYWdlIGZpbHRlcnMgdGhhdCBwbHVnIGludG8gdGhlIGxvZ2dpbmcgcGlwZWxpbmUuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHtAbGluayBMb2dnZWRDbGFzc30gdG8gc3VwcGx5IGEgc2NvcGVkIGxvZ2dlciBhbmQgZGVmaW5lcyB0aGUgY29udHJhY3QgcmVxdWlyZWQgYnkge0BsaW5rIExvZ2dpbmdGaWx0ZXJ9IGltcGxlbWVudGVycyB0aGF0IHRyYW5zZm9ybSBvciBkcm9wIGxvZyBtZXNzYWdlcyBiZWZvcmUgZW1pc3Npb24uXG4gKiBAY2xhc3MgTG9nRmlsdGVyXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgUmVkYWN0U2VjcmV0c0ZpbHRlciBleHRlbmRzIExvZ0ZpbHRlciB7XG4gKiAgIGZpbHRlcihjb25maWc6IExvZ2dpbmdDb25maWcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvc2VjcmV0L2dpLCBcIioqKlwiKTtcbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IGZpbHRlciA9IG5ldyBSZWRhY3RTZWNyZXRzRmlsdGVyKCk7XG4gKiBmaWx0ZXIuZmlsdGVyKHsgLi4uRGVmYXVsdExvZ2dpbmdDb25maWcsIHZlcmJvc2U6IDAgfSwgXCJzZWNyZXQgdG9rZW5cIik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlclxuICogICBwYXJ0aWNpcGFudCBGaWx0ZXIgYXMgTG9nRmlsdGVyXG4gKiAgIHBhcnRpY2lwYW50IEltcGwgYXMgQ29uY3JldGVGaWx0ZXJcbiAqICAgcGFydGljaXBhbnQgT3V0cHV0XG4gKiAgIExvZ2dlci0+PkZpbHRlcjogZmlsdGVyKGNvbmZpZywgbWVzc2FnZSwgY29udGV4dClcbiAqICAgRmlsdGVyLT4+SW1wbDogZGVsZWdhdGUgdG8gc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAqICAgSW1wbC0tPj5GaWx0ZXI6IHRyYW5zZm9ybWVkIG1lc3NhZ2VcbiAqICAgRmlsdGVyLS0+Pk91dHB1dDogcmV0dXJuIGZpbHRlcmVkIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ0ZpbHRlciBleHRlbmRzIExvZ2dlZENsYXNzIGltcGxlbWVudHMgTG9nZ2luZ0ZpbHRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2NvcGVkIGxvZ2dlciB0aGF0IGV4Y2x1ZGVzIG90aGVyIGZpbHRlcnMgZnJvbSB0aGUgY2hhaW4uXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjaGlsZCBsb2dnZXIgZGVkaWNhdGVkIHRvIHRoZSBmaWx0ZXIsIHByZXZlbnRpbmcgcmVjdXJzaXZlIGZpbHRlciBpbnZvY2F0aW9uIHdoZW4gZW1pdHRpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBDb250ZXh0LWF3YXJlIGxvZ2dlciBmb3IgdGhlIGZpbHRlciBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gc3VwZXIubG9nLmZvcih0aGlzIGFzIGFueSwgeyBmaWx0ZXJzOiBbXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNmb3JtIG9yIHN1cHByZXNzIGEgbG9nIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IEluc3BlY3QgdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYW5kIGNvbnRleHQgdG8gcHJvZHVjZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBzdWJzZXF1ZW50IGZpbHRlcnMgb3IgZW1pdHRlcnMuXG4gICAqIEBwYXJhbSB7TG9nZ2luZ0NvbmZpZ30gY29uZmlnIC0gQWN0aXZlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBPcmlnaW5hbCBsb2cgbWVzc2FnZSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjb250ZXh0IC0gQ29udGV4dCB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRmlsdGVyZWQgbWVzc2FnZSB0byBwYXNzIHRvIGRvd25zdHJlYW0gcHJvY2Vzc2luZy5cbiAgICovXG4gIGFic3RyYWN0IGZpbHRlcihcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ6IHN0cmluZ1tdXG4gICk6IHN0cmluZztcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFNuYXBzaG90IG9mIGEgcmVjb3JkZWQgbGFwIGludGVydmFsLlxuICogQHN1bW1hcnkgQ2FwdHVyZXMgdGhlIGxhcCBpbmRleCwgb3B0aW9uYWwgbGFiZWwsIGVsYXBzZWQgbWlsbGlzZWNvbmRzIGZvciB0aGUgbGFwLCBhbmQgY3VtdWxhdGl2ZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHN0b3B3YXRjaCBzdGFydGVkLlxuICogQHR5cGVkZWYge09iamVjdH0gTGFwXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXggLSBaZXJvLWJhc2VkIGxhcCBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFiZWxdIC0gT3B0aW9uYWwgbGFiZWwgZGVzY3JpYmluZyB0aGUgbGFwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1zIC0gRHVyYXRpb24gb2YgdGhlIGxhcCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG90YWxNcyAtIFRvdGFsIGVsYXBzZWQgdGltZSB3aGVuIHRoZSBsYXAgd2FzIHJlY29yZGVkLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIExhcCA9IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBEdXJhdGlvbiBvZiB0aGlzIGxhcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgbXM6IG51bWJlcjtcbiAgLyoqIEN1bXVsYXRpdmUgdGltZSB1cCB0byB0aGlzIGxhcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdG90YWxNczogbnVtYmVyO1xufTtcblxudHlwZSBOb3dGbiA9ICgpID0+IG51bWJlcjsgLy8gbWlsbGlzZWNvbmRzXG5cbmZ1bmN0aW9uIHNhZmVOb3coKTogTm93Rm4ge1xuICAvLyBQcmVmZXIgcGVyZm9ybWFuY2Uubm93IHdoZW4gYXZhaWxhYmxlXG4gIGlmIChcbiAgICB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlPy5ub3cgPT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICByZXR1cm4gKCkgPT4gZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgfVxuICAvLyBOb2RlOiB1c2UgcHJvY2Vzcy5ocnRpbWUuYmlnaW50IGZvciBoaWdoZXIgcHJlY2lzaW9uIGlmIGF2YWlsYWJsZVxuICBpZiAoXG4gICAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ocnRpbWU/LmJpZ2ludCA9PT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBucyA9IChwcm9jZXNzIGFzIGFueSkuaHJ0aW1lLmJpZ2ludCgpIGFzIGJpZ2ludDsgLy8gbmFub3NlY29uZHNcbiAgICAgIHJldHVybiBOdW1iZXIobnMpIC8gMV8wMDBfMDAwOyAvLyB0byBtc1xuICAgIH07XG4gIH1cbiAgLy8gRmFsbGJhY2tcbiAgcmV0dXJuICgpID0+IERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhpZ2gtcmVzb2x1dGlvbiBjbG9jayBhY2Nlc3NvciByZXR1cm5pbmcgbWlsbGlzZWNvbmRzLlxuICogQHN1bW1hcnkgQ2hvb3NlcyB0aGUgbW9zdCBwcmVjaXNlIHRpbWVyIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBydW50aW1lLCBwcmVmZXJyaW5nIGBwZXJmb3JtYW5jZS5ub3dgIG9yIGBwcm9jZXNzLmhydGltZS5iaWdpbnRgLlxuICogQHJldHVybiB7bnVtYmVyfSBNaWxsaXNlY29uZHMgZWxhcHNlZCBhY2NvcmRpbmcgdG8gdGhlIGJlc3QgYXZhaWxhYmxlIGNsb2NrLlxuICovXG5leHBvcnQgY29uc3Qgbm93ID0gc2FmZU5vdygpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIaWdoLXJlc29sdXRpb24gc3RvcHdhdGNoIHdpdGggcGF1c2UsIHJlc3VtZSwgYW5kIGxhcCB0cmFja2luZy5cbiAqIEBzdW1tYXJ5IFRyYWNrcyBlbGFwc2VkIHRpbWUgdXNpbmcgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIHRpbWVyIGF2YWlsYWJsZSwgc3VwcG9ydHMgcGF1c2luZywgcmVzdW1pbmcsIGFuZCByZWNvcmRpbmcgbGFiZWxlZCBsYXBzIGZvciBkaWFnbm9zdGljcyBhbmQgYmVuY2htYXJraW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1N0YXJ0PWZhbHNlXSAtIFdoZW4gdHJ1ZSwgdGhlIHN0b3B3YXRjaCBzdGFydHMgaW1tZWRpYXRlbHkgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gKiBAY2xhc3MgU3RvcFdhdGNoXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc3cgPSBuZXcgU3RvcFdhdGNoKHRydWUpO1xuICogLy8gLi4uIHdvcmsgLi4uXG4gKiBjb25zdCBsYXAgPSBzdy5sYXAoXCJwaGFzZSAxXCIpO1xuICogc3cucGF1c2UoKTtcbiAqIGNvbnNvbGUubG9nKGBFbGFwc2VkOiAke2xhcC50b3RhbE1zfW1zYCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBTdG9wV2F0Y2hcbiAqICAgcGFydGljaXBhbnQgQ2xvY2sgYXMgbm93KClcbiAqICAgQ2xpZW50LT4+U3RvcFdhdGNoOiBzdGFydCgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICogICBDbGllbnQtPj5TdG9wV2F0Y2g6IGxhcCgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICogICBTdG9wV2F0Y2gtLT4+Q2xpZW50OiBMYXBcbiAqICAgQ2xpZW50LT4+U3RvcFdhdGNoOiBwYXVzZSgpXG4gKiAgIFN0b3BXYXRjaC0+PkNsb2NrOiBub3coKVxuICogICBDbG9jay0tPj5TdG9wV2F0Y2g6IHRpbWVzdGFtcFxuICovXG5leHBvcnQgY2xhc3MgU3RvcFdhdGNoIHtcbiAgcHJpdmF0ZSBfc3RhcnRNczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2VsYXBzZWRNcyA9IDA7XG4gIHByaXZhdGUgX3J1bm5pbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFwczogTGFwW10gPSBbXTtcbiAgcHJpdmF0ZSBfbGFzdExhcFRvdGFsTXMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGF1dG9TdGFydCA9IGZhbHNlKSB7XG4gICAgaWYgKGF1dG9TdGFydCkgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcHdhdGNoIGlzIGFjdGl2ZWx5IHJ1bm5pbmcuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYHRydWVgIHdoZW4gdGltaW5nIGlzIGluIHByb2dyZXNzIGFuZCBgZmFsc2VgIHdoZW4gcGF1c2VkIG9yIHN0b3BwZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IEN1cnJlbnQgcnVubmluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ydW5uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbGFwc2VkIHRpbWUgY2FwdHVyZWQgYnkgdGhlIHN0b3B3YXRjaC5cbiAgICogQHN1bW1hcnkgQ29tcHV0ZXMgdGhlIHRvdGFsIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMsIGluY2x1ZGluZyB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHJ1bm5pbmcuXG4gICAqIEByZXR1cm4ge251bWJlcn0gTWlsbGlzZWNvbmRzIGVsYXBzZWQgc2luY2UgdGhlIHN0b3B3YXRjaCBzdGFydGVkLlxuICAgKi9cbiAgZ2V0IGVsYXBzZWRNcygpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fcnVubmluZyB8fCB0aGlzLl9zdGFydE1zID09IG51bGwpIHJldHVybiB0aGlzLl9lbGFwc2VkTXM7XG4gICAgcmV0dXJuIHRoaXMuX2VsYXBzZWRNcyArIChub3coKSAtIHRoaXMuX3N0YXJ0TXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGltaW5nIGlmIHRoZSBzdG9wd2F0Y2ggaXMgbm90IGFscmVhZHkgcnVubmluZy5cbiAgICogQHN1bW1hcnkgUmVjb3JkcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgYW5kIHRyYW5zaXRpb25zIHRoZSBzdG9wd2F0Y2ggaW50byB0aGUgcnVubmluZyBzdGF0ZS5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgc3RhcnQoKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9ydW5uaW5nKSB7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N0YXJ0TXMgPSBub3coKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdXNlcyB0aW1pbmcgYW5kIGFjY3VtdWxhdGVzIGVsYXBzZWQgbWlsbGlzZWNvbmRzLlxuICAgKiBAc3VtbWFyeSBDYXB0dXJlcyB0aGUgcGFydGlhbCBkdXJhdGlvbiwgdXBkYXRlcyB0aGUgYWNjdW11bGF0b3IsIGFuZCBrZWVwcyB0aGUgc3RvcHdhdGNoIHJlYWR5IHRvIHJlc3VtZSBsYXRlci5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgcGF1c2UoKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX3J1bm5pbmcgJiYgdGhpcy5fc3RhcnRNcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9lbGFwc2VkTXMgKz0gbm93KCkgLSB0aGlzLl9zdGFydE1zO1xuICAgICAgdGhpcy5fc3RhcnRNcyA9IG51bGw7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHRpbWluZyBhZnRlciBhIHBhdXNlLlxuICAgKiBAc3VtbWFyeSBDYXB0dXJlcyBhIGZyZXNoIHN0YXJ0IHRpbWVzdGFtcCB3aGlsZSBrZWVwaW5nIHByZXZpb3VzIGVsYXBzZWQgdGltZSBpbnRhY3QuXG4gICAqIEByZXR1cm4ge3RoaXN9IEZsdWVudCByZWZlcmVuY2UgdG8gdGhlIHN0b3B3YXRjaC5cbiAgICovXG4gIHJlc3VtZSgpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuX3J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fc3RhcnRNcyA9IG5vdygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGltaW5nIGFuZCByZXR1cm5zIHRoZSB0b3RhbCBlbGFwc2VkIG1pbGxpc2Vjb25kcy5cbiAgICogQHN1bW1hcnkgSW52b2tlcyB7QGxpbmsgU3RvcFdhdGNoLnBhdXNlfSB0byBjb25zb2xpZGF0ZSBlbGFwc2VkIHRpbWUsIGxlYXZpbmcgdGhlIHN0b3B3YXRjaCBpbiBhIG5vbi1ydW5uaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IE1pbGxpc2Vjb25kcyBhY2N1bXVsYXRlZCBhY3Jvc3MgYWxsIHJ1bnMuXG4gICAqL1xuICBzdG9wKCk6IG51bWJlciB7XG4gICAgdGhpcy5wYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9lbGFwc2VkTXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc2V0cyB0aGUgc3RvcHdhdGNoIHN0YXRlIHdoaWxlIG9wdGlvbmFsbHkgY29udGludWluZyB0byBydW4uXG4gICAqIEBzdW1tYXJ5IENsZWFycyBlbGFwc2VkIHRpbWUgYW5kIGxhcCBoaXN0b3J5LCBwcmVzZXJ2aW5nIHdoZXRoZXIgdGhlIHN0b3B3YXRjaCBzaG91bGQgY29udGludWUgdGlja2luZy5cbiAgICogQHJldHVybiB7dGhpc30gRmx1ZW50IHJlZmVyZW5jZSB0byB0aGUgc3RvcHdhdGNoLlxuICAgKi9cbiAgcmVzZXQoKTogdGhpcyB7XG4gICAgY29uc3Qgd2FzUnVubmluZyA9IHRoaXMuX3J1bm5pbmc7XG4gICAgdGhpcy5fc3RhcnRNcyA9IHdhc1J1bm5pbmcgPyBub3coKSA6IG51bGw7XG4gICAgdGhpcy5fZWxhcHNlZE1zID0gMDtcbiAgICB0aGlzLl9sYXBzID0gW107XG4gICAgdGhpcy5fbGFzdExhcFRvdGFsTXMgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWNvcmRzIGEgbGFwIHNwbGl0IHNpbmNlIHRoZSBzdG9wd2F0Y2ggc3RhcnRlZCBvciBzaW5jZSB0aGUgcHJldmlvdXMgbGFwLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGxhcCBtZXRhZGF0YSwgdXBkYXRlcyBjdW11bGF0aXZlIHRyYWNraW5nLCBhbmQgcmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgTGFwfS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF0gLSBPcHRpb25hbCBsYWJlbCBkZXNjcmliaW5nIHRoZSBsYXAuXG4gICAqIEByZXR1cm4ge0xhcH0gTGFwIHNuYXBzaG90IGNhcHR1cmluZyBpbmNyZW1lbnRhbCBhbmQgY3VtdWxhdGl2ZSB0aW1pbmdzLlxuICAgKi9cbiAgbGFwKGxhYmVsPzogc3RyaW5nKTogTGFwIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuZWxhcHNlZE1zO1xuICAgIGNvbnN0IG1zID0gdG90YWwgLSB0aGlzLl9sYXN0TGFwVG90YWxNcztcbiAgICBjb25zdCBsYXA6IExhcCA9IHtcbiAgICAgIGluZGV4OiB0aGlzLl9sYXBzLmxlbmd0aCxcbiAgICAgIGxhYmVsLFxuICAgICAgbXMsXG4gICAgICB0b3RhbE1zOiB0b3RhbCxcbiAgICB9O1xuICAgIHRoaXMuX2xhcHMucHVzaChsYXApO1xuICAgIHRoaXMuX2xhc3RMYXBUb3RhbE1zID0gdG90YWw7XG4gICAgcmV0dXJuIGxhcDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgbGFwIGhpc3RvcnkuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGludGVybmFsIGxhcCBhcnJheSBhcyBhIHJlYWQtb25seSB2aWV3IHRvIHByZXZlbnQgZXh0ZXJuYWwgbXV0YXRpb24uXG4gICAqIEByZXR1cm4ge0xhcFtdfSBMYXBzIGNhcHR1cmVkIGJ5IHRoZSBzdG9wd2F0Y2guXG4gICAqL1xuICBnZXQgbGFwcygpOiByZWFkb25seSBMYXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhcHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdHMgdGhlIGVsYXBzZWQgdGltZSBpbiBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAc3VtbWFyeSBVc2VzIHtAbGluayBmb3JtYXRNc30gdG8gcHJvZHVjZSBhbiBgaGg6bW06c3MubW1tYCBzdHJpbmcgZm9yIGRpc3BsYXkgYW5kIGxvZ2dpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRWxhcHNlZCB0aW1lIGZvcm1hdHRlZCBmb3IgcHJlc2VudGF0aW9uLlxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0TXModGhpcy5lbGFwc2VkTXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemVzIHRoZSBzdG9wd2F0Y2ggc3RhdGUuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgSlNPTi1mcmllbmRseSBzbmFwc2hvdCBpbmNsdWRpbmcgcnVubmluZyBzdGF0ZSwgZWxhcHNlZCB0aW1lLCBhbmQgbGFwIGRldGFpbHMuXG4gICAqIEByZXR1cm4ge3tydW5uaW5nOiBib29sZWFuLCBlbGFwc2VkTXM6IG51bWJlciwgbGFwczogTGFwW119fSBTZXJpYWxpemFibGUgc3RvcHdhdGNoIHJlcHJlc2VudGF0aW9uLlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBydW5uaW5nOiB0aGlzLl9ydW5uaW5nLFxuICAgICAgZWxhcHNlZE1zOiB0aGlzLmVsYXBzZWRNcyxcbiAgICAgIGxhcHM6IHRoaXMuX2xhcHMuc2xpY2UoKSxcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGb3JtYXRzIG1pbGxpc2Vjb25kcyBpbnRvIGBoaDptbTpzcy5tbW1gLlxuICogQHN1bW1hcnkgQnJlYWtzIHRoZSBkdXJhdGlvbiBpbnRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzLCByZXR1cm5pbmcgYSB6ZXJvLXBhZGRlZCBzdHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcn0gbXMgLSBNaWxsaXNlY29uZHMgdG8gZm9ybWF0LlxuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZHVyYXRpb24gc3RyaW5nLlxuICogQGZ1bmN0aW9uIGZvcm1hdE1zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEZvcm1hdHRlciBhcyBmb3JtYXRNc1xuICogICBDYWxsZXItPj5Gb3JtYXR0ZXI6IGZvcm1hdE1zKG1zKVxuICogICBGb3JtYXR0ZXItPj5Gb3JtYXR0ZXI6IGRlcml2ZSBob3Vycy9taW51dGVzL3NlY29uZHNcbiAqICAgRm9ybWF0dGVyLT4+Rm9ybWF0dGVyOiBwYWQgc2VnbWVudHNcbiAqICAgRm9ybWF0dGVyLS0+PkNhbGxlcjogaGg6bW06c3MubW1tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNcyhtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2lnbiA9IG1zIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3QgYWJzID0gTWF0aC5hYnMobXMpO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoYWJzIC8gM182MDBfMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKGFicyAlIDNfNjAwXzAwMCkgLyA2MF8wMDApO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigoYWJzICUgNjBfMDAwKSAvIDEwMDApO1xuICBjb25zdCBtaWxsaXMgPSBNYXRoLmZsb29yKGFicyAlIDEwMDApO1xuICBjb25zdCBwYWQgPSAobjogbnVtYmVyLCB3OiBudW1iZXIpID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCh3LCBcIjBcIik7XG4gIHJldHVybiBgJHtzaWdufSR7cGFkKGhvdXJzLCAyKX06JHtwYWQobWludXRlcywgMil9OiR7cGFkKHNlY29uZHMsIDIpfS4ke3BhZChtaWxsaXMsIDMpfWA7XG59XG4iLCJpbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcbmltcG9ydCB7IG5vdyB9IGZyb20gXCIuL3RpbWVcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIi4vTG9nZ2VkQ2xhc3NcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIEFyZ0Zvcm1hdEZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5leHBvcnQgdHlwZSBSZXR1cm5Gb3JtYXRGdW5jdGlvbiA9IChlPzogRXJyb3IsIHJlc3VsdD86IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzLlxuICogQHN1bW1hcnkgV3JhcHMgY2xhc3MgbWV0aG9kcyB0byBhdXRvbWF0aWNhbGx5IGxvZyBlbnRyeSwgZXhpdCwgdGltaW5nLCBhbmQgb3B0aW9uYWwgY3VzdG9tIG1lc3NhZ2VzIGF0IGEgY29uZmlndXJhYmxlIHtAbGluayBMb2dMZXZlbH0uXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIExvZyBsZXZlbCBhcHBsaWVkIHRvIHRoZSBnZW5lcmF0ZWQgbG9nIHN0YXRlbWVudHMgKGRlZmF1bHRzIHRvIGBMb2dMZXZlbC5pbmZvYCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW3ZlcmJvc2l0eT0wXSAtIFZlcmJvc2l0eSB0aHJlc2hvbGQgcmVxdWlyZWQgZm9yIHRoZSBlbnRyeSBsb2cgdG8gYXBwZWFyLlxuICogQHBhcmFtIHtBcmdGb3JtYXRGdW5jdGlvbn0gW2VudHJ5TWVzc2FnZV0gLSBGb3JtYXR0ZXIgaW52b2tlZCB3aXRoIHRoZSBvcmlnaW5hbCBtZXRob2QgYXJndW1lbnRzIHRvIGRlc2NyaWJlIHRoZSBpbnZvY2F0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5Gb3JtYXRGdW5jdGlvbn0gW2V4aXRNZXNzYWdlXSAtIE9wdGlvbmFsIGZvcm1hdHRlciB0aGF0IGRlc2NyaWJlcyB0aGUgb3V0Y29tZSBvciBmYWlsdXJlIG9mIHRoZSBjYWxsLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IE1ldGhvZCBkZWNvcmF0b3IgcHJveHkgdGhhdCBpbmplY3RzIGxvZ2dpbmcgYmVoYXZpb3IuXG4gKiBAZnVuY3Rpb24gbG9nXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgbG9nIGRlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBNZXRob2QgYXMgT3JpZ2luYWwgTWV0aG9kXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlciBhcyBMb2dnaW5nIGluc3RhbmNlXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGNhbGwgZGVjb3JhdGVkIG1ldGhvZFxuICogICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBtZXRob2QgY2FsbFxuICogICBEZWNvcmF0b3ItPj5NZXRob2Q6IGNhbGwgb3JpZ2luYWwgbWV0aG9kXG4gKiAgIGFsdCByZXN1bHQgaXMgUHJvbWlzZVxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHJldHVybiBQcm9taXNlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBhdHRhY2ggdGhlbiBoYW5kbGVyXG4gKiAgICAgTm90ZSBvdmVyIERlY29yYXRvcjogUHJvbWlzZSByZXNvbHZlc1xuICogICAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIGJlbmNobWFyayAoaWYgZW5hYmxlZClcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcmVzdWx0XG4gKiAgIGVsc2UgcmVzdWx0IGlzIG5vdCBQcm9taXNlXG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogcmV0dXJuIHJlc3VsdFxuICogICAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIGJlbmNobWFyayAoaWYgZW5hYmxlZClcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcmVzdWx0XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLmluZm8sXG4gIHZlcmJvc2l0eSA9IDAsXG4gIGVudHJ5TWVzc2FnZTogQXJnRm9ybWF0RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGBjYWxsZWQgd2l0aCAke2FyZ3N9YCxcbiAgZXhpdE1lc3NhZ2U/OiBSZXR1cm5Gb3JtYXRGdW5jdGlvblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsb2codGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSBcIm51bWJlclwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnaW5nIGRlY29yYXRpb24gb25seSBhcHBsaWVzIHRvIG1ldGhvZHNgKTtcbiAgICBjb25zdCBsb2dnZXI6IExvZ2dlciA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBMb2dnZWRDbGFzc1xuICAgICAgICA/IHRhcmdldFtcImxvZ1wiXS5mb3IodGFyZ2V0W3Byb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdKVxuICAgICAgICA6IExvZ2dpbmcuZm9yKHRhcmdldCkuZm9yKHRhcmdldFtwcm9wZXJ0eUtleV0pO1xuICAgIGNvbnN0IG1ldGhvZCA9IGxvZ2dlcltsZXZlbF0uYmluZChsb2dnZXIpIGFzIGFueTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbmV3IFByb3h5KG9yaWdpbmFsTWV0aG9kLCB7XG4gICAgICBhcHBseShmbiwgdGhpc0FyZywgYXJnczogYW55W10pIHtcbiAgICAgICAgbWV0aG9kKGVudHJ5TWVzc2FnZSguLi5hcmdzKSwgdmVyYm9zaXR5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgICAudGhlbigocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXRNZXNzYWdlKSBtZXRob2QoZXhpdE1lc3NhZ2UodW5kZWZpbmVkLCByKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChleGl0TWVzc2FnZSkgbG9nZ2VyLmVycm9yKGV4aXRNZXNzYWdlKGUgYXMgRXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4aXRNZXNzYWdlKSBtZXRob2QoZXhpdE1lc3NhZ2UodW5kZWZpbmVkLCByZXN1bHQpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBpZiAoZXhpdE1lc3NhZ2UpIGxvZ2dlci5lcnJvcihleGl0TWVzc2FnZShlcnIgYXMgRXJyb3IpKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgdGhhdCByZWNvcmRzIGV4ZWN1dGlvbiB0aW1lIGF0IHRoZSBiZW5jaG1hcmsgbGV2ZWwuXG4gKiBAc3VtbWFyeSBXcmFwcyB0aGUgdGFyZ2V0IG1ldGhvZCB0byBlbWl0IHtAbGluayBMb2dnZXIuYmVuY2htYXJrfSBlbnRyaWVzIGNhcHR1cmluZyBjb21wbGV0aW9uIHRpbWUgb3IgZmFpbHVyZSBsYXRlbmN5LlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksICBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBNZXRob2QgZGVjb3JhdG9yIHByb3h5IHRoYXQgYmVuY2htYXJrcyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24uXG4gKiBAZnVuY3Rpb24gYmVuY2htYXJrXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgYmVuY2htYXJrXG4gKiAgIHBhcnRpY2lwYW50IE1ldGhvZCBhcyBPcmlnaW5hbCBNZXRob2RcbiAqICAgQ2FsbGVyLT4+RGVjb3JhdG9yOiBpbnZva2UoKVxuICogICBEZWNvcmF0b3ItPj5NZXRob2Q6IFJlZmxlY3QuYXBwbHkoLi4uKVxuICogICBhbHQgUHJvbWlzZSByZXN1bHRcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiBQcm9taXNlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBhdHRhY2ggdGhlbigpXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBsb2cgY29tcGxldGlvbiBkdXJhdGlvblxuICogICBlbHNlIFN5bmNocm9ub3VzIHJlc3VsdFxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHZhbHVlXG4gKiAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBsb2cgY29tcGxldGlvbiBkdXJhdGlvblxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLS0+PkNhbGxlcjogcmV0dXJuIHJlc3VsdFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZW5jaG1hcmsoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiZW5jaG1hcmsodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSBcIm51bWJlclwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiZW5jaG1hcmsgZGVjb3JhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc2ApO1xuICAgIGNvbnN0IGxvZ2dlcjogTG9nZ2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIExvZ2dlZENsYXNzXG4gICAgICAgID8gdGFyZ2V0W1wibG9nXCJdLmZvcih0YXJnZXRbcHJvcGVydHlLZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldF0pXG4gICAgICAgIDogTG9nZ2luZy5mb3IodGFyZ2V0KS5mb3IodGFyZ2V0W3Byb3BlcnR5S2V5XSk7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IG5ldyBQcm94eShvcmlnaW5hbE1ldGhvZCwge1xuICAgICAgYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGxvZ2dlci5iZW5jaG1hcmsoYGNvbXBsZXRlZCBpbiAke25vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmJlbmNobWFyayhgY29tcGxldGVkIGluICR7bm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGxvZ2dlci5iZW5jaG1hcmsoYGZhaWxlZCBpbiAke25vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlYnVnIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5kZWJ1Z2AuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gRGVidWctbGV2ZWwgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gZGVidWdcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoKSB7XG4gIHJldHVybiBsb2coXG4gICAgTG9nTGV2ZWwuZGVidWcsXG4gICAgMCxcbiAgICAoLi4uYXJnczogYW55W10pID0+IGBjYWxsZWQgd2l0aCAke2FyZ3N9YCxcbiAgICAoZT86IEVycm9yLCByZXN1bHQ/OiBhbnkpID0+XG4gICAgICBlXG4gICAgICAgID8gYEZhaWxlZCB3aXRoOiAke2V9YFxuICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgID8gYENvbXBsZXRlZCB3aXRoICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gXG4gICAgICAgICAgOiBcImNvbXBsZXRlZFwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbmZvIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5pbmZvYC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBJbmZvLWxldmVsIGxvZ2dpbmcgZGVjb3JhdG9yLlxuICogQGZ1bmN0aW9uIGluZm9cbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbygpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5pbmZvKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHNpbGx5IGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC5zaWxseWAuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gU2lsbHktbGV2ZWwgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gc2lsbHlcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lsbHkoKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuc2lsbHkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggdmVyYm9zZSBsZXZlbC5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHtAbGluayBsb2d9IHRoYXQgbG9ncyB1c2luZyBgTG9nTGV2ZWwudmVyYm9zZWAgd2l0aCBjb25maWd1cmFibGUgdmVyYm9zaXR5LlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IFZlcmJvc2UgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKCk6IChcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5PzogYW55LFxuICBkZXNjcmlwdG9yPzogYW55XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC52ZXJib3NlYCB3aGlsZSB0b2dnbGluZyBiZW5jaG1hcmtpbmcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IFZlcmJvc2UgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKCk6IChcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5PzogYW55LFxuICBkZXNjcmlwdG9yPzogYW55XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC52ZXJib3NlYCB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHkgYW5kIG9wdGlvbmFsIGJlbmNobWFya2luZy5cbiAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IHZlcmJvc2l0eSAtIFZlcmJvc2l0eSBsZXZlbCBmb3IgbG9nIGZpbHRlcmluZyBvciBmbGFnIHRvIGVuYWJsZSBiZW5jaG1hcmtpbmcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSxQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBWZXJib3NlIGxvZ2dpbmcgZGVjb3JhdG9yLlxuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyYm9zZSh2ZXJib3NpdHk6IG51bWJlciB8IGJvb2xlYW4gPSAwKSB7XG4gIGlmICghdmVyYm9zaXR5KSB7XG4gICAgdmVyYm9zaXR5ID0gMDtcbiAgfVxuICByZXR1cm4gbG9nKExvZ0xldmVsLnZlcmJvc2UsIHZlcmJvc2l0eSBhcyBudW1iZXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFrZXMgYSBtZXRob2Qgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEBzdW1tYXJ5IFByZXZlbnRzIG92ZXJyaWRpbmcgYnkgbWFya2luZyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgdGhyb3dpbmcgaWYgYXBwbGllZCB0byBub24tbWV0aG9kIHRhcmdldHMuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihvYmplY3QsIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogUHJvcGVydHlEZXNjcmlwdG9yfHVuZGVmaW5lZH0gRGVjb3JhdG9yIHRoYXQgaGFyZGVucyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IuXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb24gbWV0aG9kc1wiKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8uY29uZmlndXJhYmxlKSB7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiIsImltcG9ydCB7IExvZ0ZpbHRlciB9IGZyb20gXCIuL0xvZ0ZpbHRlclwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlbWVudCBjYWxsYmFjayB1c2VkIHRvIHRyYW5zZm9ybSBSZWdFeHAgbWF0Y2hlcy5cbiAqIEBzdW1tYXJ5IFJlY2VpdmVzIHRoZSBtYXRjaGVkIHN1YnN0cmluZyBhbmQgYWRkaXRpb25hbCBjYXB0dXJlIGFyZ3VtZW50cywgcmV0dXJuaW5nIHRoZSByZXBsYWNlbWVudCB0ZXh0IHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBsb2cgbWVzc2FnZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihzdHJpbmcsIGFueVtdKTogc3RyaW5nfSBSZXBsYWNlbWVudEZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGFjZW1lbnRGdW5jdGlvbiA9IChzdWJzdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHN0cmluZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmlsdGVyIHRoYXQgcGF0Y2hlcyBsb2cgbWVzc2FnZXMgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgYSBjb25maWd1cmVkIHtAbGluayBSZWdFeHB9IGFuZCByZXBsYWNlbWVudCBzdHJhdGVneSB0byByZWRhY3QsIG1hc2ssIG9yIHJlc3RydWN0dXJlIGxvZyBwYXlsb2FkcyBiZWZvcmUgdGhleSBhcmUgZW1pdHRlZC5cbiAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHAgLSBFeHByZXNzaW9uIHVzZWQgdG8gZGV0ZWN0IHNlbnNpdGl2ZSBvciBmb3JtYXR0ZWQgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfFJlcGxhY2VtZW50RnVuY3Rpb259IHJlcGxhY2VtZW50IC0gUmVwbGFjZW1lbnQgc3RyaW5nIG9yIGNhbGxiYWNrIGludm9rZWQgZm9yIGVhY2ggbWF0Y2guXG4gKiBAY2xhc3MgUGF0dGVybkZpbHRlclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZpbHRlciA9IG5ldyBQYXR0ZXJuRmlsdGVyKC90b2tlbj1bXiZdKy9nLCBcInRva2VuPSoqKlwiKTtcbiAqIGNvbnN0IHNhbml0aXplZCA9IGZpbHRlci5maWx0ZXIoY29uZmlnLCBcInRva2VuPTEyMyZ1c2VyPXRvbVwiLCBbXSk7XG4gKiAvLyBzYW5pdGl6ZWQgPT09IFwidG9rZW49KioqJnVzZXI9dG9tXCJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyXG4gKiAgIHBhcnRpY2lwYW50IEZpbHRlciBhcyBQYXR0ZXJuRmlsdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlZ0V4cFxuICogICBMb2dnZXItPj5GaWx0ZXI6IGZpbHRlcihjb25maWcsIG1lc3NhZ2UsIGNvbnRleHQpXG4gKiAgIEZpbHRlci0+PlJlZ0V4cDogZXhlY3V0ZSBtYXRjaCgpXG4gKiAgIGFsdCBtYXRjaCBmb3VuZFxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IGNhcHR1cmVzXG4gKiAgICAgRmlsdGVyLT4+UmVnRXhwOiByZXBsYWNlKG1lc3NhZ2UsIHJlcGxhY2VtZW50KVxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IHRyYW5zZm9ybWVkIG1lc3NhZ2VcbiAqICAgZWxzZSBubyBtYXRjaFxuICogICAgIFJlZ0V4cC0tPj5GaWx0ZXI6IG51bGxcbiAqICAgZW5kXG4gKiAgIEZpbHRlci0tPj5Mb2dnZXI6IHNhbml0aXplZCBtZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgTG9nRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXBsYWNlbWVudDogc3RyaW5nIHwgUmVwbGFjZW1lbnRGdW5jdGlvblxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnN1cmVzIGRldGVybWluaXN0aWMgUmVnRXhwIG1hdGNoaW5nLlxuICAgKiBAc3VtbWFyeSBSdW5zIHRoZSBjb25maWd1cmVkIGV4cHJlc3Npb24sIHRoZW4gcmVzZXRzIGl0cyBzdGF0ZSBzbyByZXBlYXRlZCBpbnZvY2F0aW9ucyBiZWhhdmUgY29uc2lzdGVudGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGVzdCBmb3IgbWF0Y2hlcy5cbiAgICogQHJldHVybiB7UmVnRXhwRXhlY0FycmF5fG51bGx9IE1hdGNoIHJlc3VsdCBvciBudWxsIHdoZW4gbm8gbWF0Y2ggaXMgZm91bmQuXG4gICAqL1xuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgbWF0Y2gobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnJlZ2V4cC5leGVjKG1lc3NhZ2UpO1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSByZXBsYWNlbWVudCBzdHJhdGVneSB0byB0aGUgaW5jb21pbmcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMge0BsaW5rIFBhdHRlcm5GaWx0ZXIubWF0Y2h9IGFuZCwgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLCByZXBsYWNlcyBldmVyeSBvY2N1cnJlbmNlIHVzaW5nIHRoZSBjb25maWd1cmVkIHJlcGxhY2VtZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7TG9nZ2luZ0NvbmZpZ30gY29uZmlnIC0gQWN0aXZlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiAodW51c2VkIGJ1dCBwYXJ0IG9mIHRoZSBmaWx0ZXIgY29udHJhY3QpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gYmUgc2FuaXRpemVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjb250ZXh0IC0gQ29udGV4dCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFNhbml0aXplZCBsb2cgbWVzc2FnZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZmlsdGVyKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbWVzc2FnZTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZmlsdGVyKTtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMubWF0Y2gobWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UodGhpcy5yZWdleHAsIHRoaXMucmVwbGFjZW1lbnQgYXMgYW55KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYFBhdHRlcm5GaWx0ZXIgcmVwbGFjZW1lbnQgZXJyb3I6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvZ2dlZENsYXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXByZWhlbnNpdmUgbG9nZ2luZyB0b29sa2l0IGZvciBicm93c2VyIGFuZCBOb2RlIGVudmlyb25tZW50cy5cbiAqIEBzdW1tYXJ5IEV4cG9zZXMge0BsaW5rIExvZ2dpbmd9IGFuZCB7QGxpbmsgTWluaUxvZ2dlcn0gZm9yIHJ1bnRpbWUgbG9nZ2luZywgZGVjb3JhdG9ycyBzdWNoIGFzIHtAbGluayBsb2d9IGZvciBtZXRob2QgaW5zdHJ1bWVudGF0aW9uLCBhbmQgdXRpbGl0aWVzIGxpa2Uge0BsaW5rIFBhdHRlcm5GaWx0ZXJ9LCB7QGxpbmsgU3RvcFdhdGNofSwgYW5kIHtAbGluayBMb2dnZWRFbnZpcm9ubWVudH0gdG8gYnVpbGQgY29uZmlndXJhYmxlLCB0aGVtZS1hd2FyZSBsb2cgcGlwZWxpbmVzLlxuICogQG1vZHVsZSBMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yIGRpYWdub3N0aWNzIGFuZCBjb21wYXRpYmlsaXR5IGNoZWNrcy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkxvZ0xldmVsIiwiTG9nZ2luZ01vZGUiLCJPYmplY3RBY2N1bXVsYXRvciIsInN0eWxlIiwiX19kZWNvcmF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7OztJQU1HO0FBQ0ksVUFBTSxhQUFhLEdBQUc7SUFFN0I7Ozs7OztJQU1HO0FBQ0ksVUFBTSxrQkFBa0IsR0FBRztJQUVsQzs7Ozs7O0lBTUc7VUFDVSwwQkFBMEIsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHO0lBRXBEOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxRQUFRLEVBQUE7O0lBRWxCLElBQUEsUUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCOztJQUV2QixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsUUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7O0lBRWIsSUFBQSxRQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7O0lBRW5CLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7O0lBRWYsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNqQixDQUFDLEVBYldBLGdCQUFRLEtBQVJBLGdCQUFRLEdBYW5CLEVBQUEsQ0FBQSxDQUFBO0lBRUQ7Ozs7Ozs7Ozs7O0lBV0c7SUFDSDs7Ozs7O0lBTUc7QUFDVSxVQUFBLGdCQUFnQixHQUFHO0lBQzlCLElBQUEsU0FBUyxFQUFFLENBQUM7SUFDWixJQUFBLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBQSxJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUEsT0FBTyxFQUFFLENBQUM7SUFDVixJQUFBLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBQSxLQUFLLEVBQUUsQ0FBQzs7SUFHVjs7Ozs7SUFLRztBQUNTQztJQUFa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
|