sliftutils 1.7.97 → 1.7.99
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/index.d.ts +18 -1
- package/package.json +1 -1
- package/storage/remoteStorage/blobStore.d.ts +2 -0
- package/storage/remoteStorage/blobStore.ts +19 -1
- package/storage/remoteStorage/chainStartup.d.ts +1 -0
- package/storage/remoteStorage/chainStartup.ts +6 -1
- package/storage/remoteStorage/createArchives.ts +1 -1
- package/storage/remoteStorage/dist/blobStore.ts.cache +21 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +3 -3
- package/storage/remoteStorage/dist/storageClientController.ts.cache +45 -4
- package/storage/remoteStorage/dist/storageServerState.ts.cache +15 -4
- package/storage/remoteStorage/dist/storeConfig.ts.cache +7 -2
- package/storage/remoteStorage/storageClientController.d.ts +14 -0
- package/storage/remoteStorage/storageClientController.ts +42 -1
- package/storage/remoteStorage/storageServerState.d.ts +1 -1
- package/storage/remoteStorage/storageServerState.ts +11 -2
- package/storage/remoteStorage/storeConfig.ts +5 -0
|
@@ -30,6 +30,8 @@ class ChainStateManager {
|
|
|
30
30
|
this.unsubscribeRoutingPush = (0, storageClientController_1.onServerRoutingChanged)(() => {
|
|
31
31
|
void this.refreshActiveConfig().catch((e) => { var _a; return console.error(`Config refresh failed for ${this.config.debugName()}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
32
32
|
});
|
|
33
|
+
// So a server can ask what config we intended for a store name (see StorageClientController.getRoutingConfigForName)
|
|
34
|
+
this.untrackConfig = (0, storageClientController_1.trackChainConfig)({ configured: config.configured, active: () => this.activeConfig });
|
|
33
35
|
}
|
|
34
36
|
/** The newest adopted state, synchronously - undefined until the first init finishes. */
|
|
35
37
|
latest() {
|
|
@@ -264,6 +266,7 @@ class ChainStateManager {
|
|
|
264
266
|
dispose() {
|
|
265
267
|
var _a;
|
|
266
268
|
this.disposed = true;
|
|
269
|
+
this.untrackConfig();
|
|
267
270
|
(_a = this.unsubscribeRoutingPush) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
268
271
|
if (this.pollTimer) {
|
|
269
272
|
clearInterval(this.pollTimer);
|
|
@@ -462,5 +465,5 @@ class RoutingRewriteLoop {
|
|
|
462
465
|
}
|
|
463
466
|
}
|
|
464
467
|
exports.RoutingRewriteLoop = RoutingRewriteLoop;
|
|
465
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5TdGFydHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2hhaW5TdGFydHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFrRDtBQUVsRCxpREFBK0g7QUFDL0gsbURBQWtHO0FBQ2xHLCtEQUFtRTtBQUNuRSx1RUFBbUU7QUFFbkUsNGRBQTRkO0FBRTVkLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQy9DLHNOQUFzTjtBQUN6TSxRQUFBLDJCQUEyQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pELGdIQUFnSDtBQUNuRyxRQUFBLDZCQUE2QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBTzVELG1PQUFtTztBQUNuTyxNQUFhLGlCQUFpQjtJQWMxQixZQUFvQixNQUtuQjtRQUxtQixXQUFNLEdBQU4sTUFBTSxDQUt6QjtRQVpPLG1CQUFjLEdBQUcsaUNBQWlCLENBQUM7UUFHbkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQWtOakIsNEJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBeE1oQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQztZQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBQSxnREFBc0IsRUFBQyxHQUFHLEVBQUU7WUFDdEQsS0FBSyxJ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RUFBRSxDQUFDLENBQUM7UUFDcEksSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsYUFBYSxJQUFBLCtCQUFnQixFQUFDLFVBQVUsQ0FBQyxlQUFlLFFBQVEsQ0FBQyxNQUFNLE9BQU8sS0FBSyx5QkFBeUIsbUNBQTJCLEdBQUcsSUFBSSxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFQLElBQUksQ0FBQyxRQUFRLENBQUMsbUNBQTJCLENBQUMsQ0FBQztZQUMzQyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMscUNBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0o7QUFoRUQsZ0RBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldENvbmZpZ1ZlcnNpb24sIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IFNvdXJjZVdyYXBwZXIsIFJFVFJZX1NUQVJUX0RFTEFZLCBSRVRSWV9NQVhfREVMQVksIFJFVFJZX0dST1dUSCB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlU291cmNlc1wiO1xuaW1wb3J0IHsgb25TZXJ2ZXJSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDbGllbnRDb250cm9sbGVyXCI7XG5cbi8vIFRoZSBMSUZFQ1lDTEUgb2YgYW4gQXJjaGl2ZXNDaGFpbidzIHN0YXRlLCBhbmQgbm90aGluZyBlbHNlOiBpbml0aWFsaXppbmcgaXQgKHByb2JpbmcgZXZlcnkgY29uZmlndXJlZCBzb3VyY2UsIGRlY2lkaW5nIHdoaWNoIHJvdXRpbmcgY29uZmlnIHRvIHJ1biwgd3JpdGluZyBvdXJzIG91dCB3aGVuIGl0IGlzIHRoZSBuZXdlc3QpLCB0aGUgcmV0cnkgd2hlbiBpbml0aWFsaXphdGlvbiBmYWlscywgdGhlIHBvbGwgdGhhdCBhZG9wdHMgbmV3ZXIgY29uZmlncywgdGhlIGF2YWlsYWJpbGl0eSByZWNoZWNrLCBhbmQgdGhlIGxvb3AgdGhhdCBrZWVwcyByZS13cml0aW5nIG91ciBjb25maWcuIE5vbmUgb2YgdGhpcyBpcyByZXF1ZXN0IGRpc3BhdGNoIC0gdGhlIGNoYWluIChjcmVhdGVBcmNoaXZlcy50cykgYXNrcyB0aGUgQ2hhaW5TdGF0ZU1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBkaXNwYXRjaGVzIG92ZXIgaXQuXG5cbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IEFWQUlMQUJJTElUWV9SRUNIRUNLX1RIUk9UVExFID0gNSAqIDEwMDA7XG4vLyBUaGUgcm91dGluZyBjb25maWcgd3JpdGUgaXMgcmV0cmllZCBvbiB0aGlzIGNhZGVuY2Ugd2hpbGUgaXQgaXMgZmFpbGluZy4gQSBzdG9yZSB0aGF0IG5ldmVyIHJlY2VpdmVkIHRoZSBjb25maWcgcmVqZWN0cyBldmVyeSB3cml0ZSBhaW1lZCBhdCBpdCwgc28gdGhpcyBub3QgbGFuZGluZyBpcyBhIGJpZyBkZWFsIC0gZWFjaCBmYWlsZWQgYXR0ZW1wdCBpcyBsb2dnZWQuXG5leHBvcnQgY29uc3QgQ09ORklHX1dSSVRFX1JFVFJZX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbi8vIC4uLmFuZCBldmVuIGFmdGVyIHN1Y2Nlc3MgaXQgaXMgcmUtd3JpdHRlbiBvbiB0aGlzIGNhZGVuY2UsIGluIGNhc2UgYSBzdG9yZSBsb3N0IGl0IG9yIGEgc2VydmVyIGFwcGVhcmVkIGxhdGVcbmV4cG9ydCBjb25zdCBDT05GSUdfV1JJVEVfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogNjAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBDaGFpblN0YXRlID0ge1xuICAgIGNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXTtcbn07XG5cbi8qKiBUaGUgY2hhaW4ncyBzdGF0ZSBhbmQgZXZlcnl0aGluZyBhYm91dCBIQVZJTkcgb25lOiBpbml0ICh3aXRoIGl0cyByZXRyeSksIHRoZSBjb25maWcgcG9sbCwgYXZhaWxhYmlsaXR5IHJlY2hlY2tzLCBhbmQgdGhlIHJvdXRpbmcgcmV3cml0ZSBsb29wLiBUaGUgY2hhaW4gY29uc3RydWN0cyBvbmUsIGFza3MgaXQgZ2V0U3RhdGUoKSBvbiBldmVyeSBjYWxsLCBhbmQgZGlzcG9zZXMgaXQuICovXG5leHBvcnQgY2xhc3MgQ2hhaW5TdGF0ZU1hbmFnZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBjb25maWd1cmVkOiBSZW1vdGVDb25maWc7XG4gICAgLyoqIFRoZSBuZXdlc3QgYWRvcHRlZCBjb25maWcgLSB3aGF0IGdldERlYnVnTmFtZSBhbmQgZGlzcGF0Y2ggZGVjaXNpb25zIHJlYWQuIFN0YXJ0cyBhcyB0aGUgY29uZmlndXJlZCBvbmUgYW5kIG1vdmVzIHdpdGggZXZlcnkgYWRvcHRpb24uICovXG4gICAgcHVibGljIGFjdGl2ZUNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHByaXZhdGUgc3RhdGVQcm9taXNlOiBQcm9taXNlPENoYWluU3RhdGU+IHwgdW5kZWZpbmVkO1xuICAgIC8vIFRoZSByZXNvbHZlZCBzdGF0ZSwgZm9yIHN5bmNocm9ub3VzIGFjY2VzcyAoZ2V0R2V0VVJMcykgLSBhbHdheXMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgd2hlcmUgc3RhdGVQcm9taXNlIG1heSBicmllZmx5IGxhZyBkdXJpbmcgYSByZWJ1aWxkXG4gICAgcHJpdmF0ZSBsYXRlc3RTdGF0ZTogQ2hhaW5TdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgcHJpdmF0ZSBpbml0UmV0cnlUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZVJvdXRpbmdQdXNoOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByb3V0aW5nUmV3cml0ZXI6IFJvdXRpbmdSZXdyaXRlTG9vcDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiB7XG4gICAgICAgIGNvbmZpZ3VyZWQ6IFJlbW90ZUNvbmZpZztcbiAgICAgICAgZGVidWdOYW1lOiAoKSA9PiBzdHJpbmc7XG4gICAgICAgIC8qKiBTZWUgQXJjaGl2ZXNDaGFpbk9wdGlvbnMuZGlyZWN0Q29ubmVjdC4gKi9cbiAgICAgICAgZGlyZWN0Q29ubmVjdD86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZWQgPSBjb25maWcuY29uZmlndXJlZDtcbiAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSBjb25maWcuY29uZmlndXJlZDtcbiAgICAgICAgdGhpcy5yb3V0aW5nUmV3cml0ZXIgPSBuZXcgUm91dGluZ1Jld3JpdGVMb29wKHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IGNvbmZpZy5jb25maWd1cmVkLFxuICAgICAgICAgICAgZGVidWdOYW1lOiBjb25maWcuZGVidWdOYW1lLFxuICAgICAgICAgICAgbGF0ZXN0OiAoKSA9PiB0aGlzLmxhdGVzdFN0YXRlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVJvdXRpbmdQdXNoID0gb25TZXJ2ZXJSb3V0aW5nQ2hhbmdlZCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQ29uZmlnIHJlZnJlc2ggZmFpbGVkIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfTogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogVGhlIG5ld2VzdCBhZG9wdGVkIHN0YXRlLCBzeW5jaHJvbm91c2x5IC0gdW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBpbml0IGZpbmlzaGVzLiAqL1xuICAgIHB1YmxpYyBsYXRlc3QoKTogQ2hhaW5TdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhdGVzdFN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0ZSgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEFyY2hpdmVzQ2hhaW4gJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gaGFzIGJlZW4gZGlzcG9zZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IFJFVFJZX1NUQVJUX0RFTEFZO1xuICAgICAgICAgICAgfSwgKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQgfHwgdGhpcy5pbml0UmV0cnlUaW1lcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFN0b3JhZ2UgaW5pdCBmYWlsZWQgZm9yICR7dGhpcy5jb25maWcuZGVidWdOYW1lKCl9LCByZXRyeWluZyBpbiAke01hdGgucm91bmQodGhpcy5pbml0UmV0cnlEZWxheSAvIDEwMDApfXMuICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVQcm9taXNlID09PSBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRlKCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLmluaXRSZXRyeURlbGF5KTtcbiAgICAgICAgICAgICAgICAodGhpcy5pbml0UmV0cnlUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgdGhpcy5pbml0UmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8Q2hhaW5TdGF0ZT4ge1xuICAgICAgICBsZXQgY29uZmlncyA9IHRoaXMuY29uZmlndXJlZC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkodGhpcy5jb25maWd1cmVkKTtcbiAgICAgICAgbGV0IHByb2JlcyA9IGF3YWl0IHByb2JlU291cmNlcyhjb25maWdzLCByZWFkT25seSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBhY3RpdmUsIG5lZWRzV3JpdGUsIGV4aXN0aW5nIH0gPSBjaG9vc2VTdGFydHVwQ29uZmlnKHsgY29uZmlndXJlZDogdGhpcy5jb25maWd1cmVkLCBwcm9iZXMsIGRlYnVnTmFtZTogdGhpcy5jb25maWcuZGVidWdOYW1lKCkgfSk7XG4gICAgICAgICAgICBsZXQgc291cmNlcyA9IGF3YWl0IHRoaXMuYnVpbGRTb3VyY2VzKGFjdGl2ZSk7XG4gICAgICAgICAgICBsZXQgY29uZmlnV3JpdGVGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5jb25maWcuZGVidWdOYW1lKCl9IGlzIG91dCBvZiBkYXRlIChzdG9yZWQgdmVyc2lvbiAke2V4aXN0aW5nICYmIGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpIHx8IFwibm9uZVwifSwgb3VycyAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IHsgZmFpbHVyZXMsIHRvdGFsIH0gPSBhd2FpdCB3cml0ZVJvdXRpbmdUb0FsbFN0b3Jlcyh7IGNvbmZpZ3VyZWQ6IHRoaXMuY29uZmlndXJlZCwgc291cmNlcywgZGVidWdOYW1lOiB0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKSB9KTtcbiAgICAgICAgICAgICAgICBjb25maWdXcml0ZUZhaWxlZCA9IGZhaWx1cmVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCAmJiBmYWlsdXJlcy5sZW5ndGggPT09IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vYm9keSBoYXMgb3VyIGNvbmZpZywgc28gcnVubmluZyBvbiBpdCB3b3VsZCBqdXN0IGRpc2FncmVlIHdpdGggZXZlcnkgc2VydmVyLiBUaGUgc3RvcmVkIG9uZSAod2hlbiB0aGVyZSBpcyBvbmUpIGlzIHdoYXQgdGhlIHNlcnZlcnMgYWN0dWFsbHkgcnVuLlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byBBTlkgb2YgdGhlICR7dG90YWx9IHN0b3Jlcy4gJHtleGlzdGluZyAmJiBgUnVubmluZyBvbiB0aGUgc3RvcmVkIGNvbmZpZyAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpfSkgdW50aWwgYSB3cml0ZSBzdWNjZWVkcy5gIHx8IGBObyBzdG9yZWQgY29uZmlnIGV4aXN0cyBlaXRoZXIsIHNvIHNlcnZlcnMgd2lsbCByZWplY3Qgd3JpdGVzIHVudGlsIHRoaXMgc3VjY2VlZHMuYH0gUmV0cnlpbmcgaW4gJHtDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwgLyAxMDAwfXMuIEZhaWx1cmVzOiAke2ZhaWx1cmVzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbHVyZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0pIHdhcyB3cml0dGVuIHRvICR7dG90YWwgLSBmYWlsdXJlcy5sZW5ndGh9IG9mICR7dG90YWx9IHN0b3Jlcy4gUmV0cnlpbmcgdGhlIHJlc3QgaW4gJHtDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwgLyAxMDAwfXMgKHRoZXkgYWxzbyBwdWxsIGl0IGZyb20gdGhlIHN0b3JlcyB0aGF0IGhhdmUgaXQpLiBGYWlsdXJlczogJHtmYWlsdXJlcy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb2JlID0gcHJvYmVzLmZpbmQoeCA9PiB4LnJlc3BvbmRlZCAmJiB4LnNvdXJjZUNvbmZpZy51cmwgPT09IHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNlZWRMYXRlbmN5KHByb2JlLmxhdGVuY3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbmZpZ1BvbGwoKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZTogQ2hhaW5TdGF0ZSA9IHsgY29uZmlnOiBhY3RpdmUsIHNvdXJjZXMgfTtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ1Jld3JpdGVyLnN0YXJ0KGNvbmZpZ1dyaXRlRmFpbGVkKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRpc3Bvc2VQcm9iZXMocHJvYmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDbGllbnRzaWRlLCBhIGNvbmZpZyB3aXRoIHB1YmxpYyBzb3VyY2VzIGlzIHNlcnZlZCBlbnRpcmVseSBvdmVyIHBsYWluIFVSTCBkb3dubG9hZHMgLSBubyBBUEkgY29ubmVjdGlvbiwgbm8gYWNjZXNzIGdyYW50LCBhbmQgbm8gd3JpdGluZy4gZGlyZWN0Q29ubmVjdCBvcHRzIG91dCBvZiB0aGF0LiAqL1xuICAgIHByaXZhdGUgaXNSZWFkT25seShjb25maWc6IFJlbW90ZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlyZWN0Q29ubmVjdCB8fCBpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkuc29tZSh4ID0+IHgucHVibGljKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnLCByZWFkT25seTogYm9vbGVhbik6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgc291cmNlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IHJlYWRPbmx5IH0pO1xuICAgICAgICBzb3VyY2Uuc3RhcnRQaW5naW5nKCk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXJbXT4ge1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkoY29uZmlnKTtcbiAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2VDb25maWcgb2YgY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZywgcmVhZE9ubHkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0Q29uZmlnUG9sbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nIGZvciBhIG5ldyBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZhaWxlZCBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIENPTkZJR19QT0xMX0lOVEVSVkFMKTtcbiAgICAgICAgKHRoaXMucG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZXMgY29uY3VycmVudCByZWZyZXNoZXMgKHRoZSBwb2xsIHRpbWVyIGFuZCB3cm9uZy10YXJnZXQgd3JpdGUgcmV0cmllcyBzaGFyZSB0aGlzKVxuICAgIHByaXZhdGUgY29uZmlnUmVmcmVzaEluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyByZWZyZXNoQWN0aXZlQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnUmVmcmVzaEluRmxpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHRoaXMuY2hlY2tGb3JOZXdDb25maWcoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhdGVzdCA9IGF3YWl0IHNvdXJjZS5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIGlmIChsYXRlc3QpIHJldHVybiBub3JtYWxpemVSZW1vdGVDb25maWcobGF0ZXN0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IHN0YXRlLnNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN0b3JhZ2Ugc291cmNlIGNvdWxkIGdpdmUgdXMgdGhlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfTogJHtlcnJvcnMuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tGb3JOZXdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkIHx8ICF0aGlzLnN0YXRlUHJvbWlzZSkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhdGU6IENoYWluU3RhdGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGVQcm9taXNlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGF0ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaExhdGVzdENvbmZpZyhzdGF0ZSk7XG4gICAgICAgIGlmICghbGF0ZXN0KSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuYWRvcHROZXdDb25maWcoc3RhdGUsIGxhdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZG9wdE5ld0NvbmZpZyhzdGF0ZTogQ2hhaW5TdGF0ZSwgbGF0ZXN0OiBSZW1vdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGxhdGVzdCkgPT09IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbmZpZykpIHJldHVybjtcbiAgICAgICAgbGV0IHJlY2VpdmVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICBsZXQgb25seUludGVybWVkaWF0ZXNDaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkocmVzb2x2ZUludGVybWVkaWF0ZVNvdXJjZXMobGF0ZXN0KSkgPT09IEpTT04uc3RyaW5naWZ5KHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzKHN0YXRlLmNvbmZpZykpO1xuICAgICAgICBpZiAob25seUludGVybWVkaWF0ZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIHN3aXRjaG92ZXIgd2luZG93cyBjaGFuZ2VkICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpfSAtPiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0pLCByZWNlaXZlZCAke3JlY2VpdmVkfSwgcmVidWlsZGluZyBzb3VyY2VzLiBOZXcgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdCl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIGNvbmZpZyBjaGFuZ2VkICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpfSAtPiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0pLCByZWNlaXZlZCAke3JlY2VpdmVkfSwgcmVidWlsZGluZyBzb3VyY2VzLiBOZXcgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0cmlwcGVkS2V5ID0gKGNvbmZpZzogU291cmNlQ29uZmlnKSA9PiBKU09OLnN0cmluZ2lmeSh7IC4uLmNvbmZpZywgdmFsaWRXaW5kb3c6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IG9sZEJ5Q29uZmlnID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVdyYXBwZXJbXT4oKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBzdHJpcHBlZEtleShzb3VyY2UuY29uZmlnKTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gb2xkQnlDb25maWcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgb2xkQnlDb25maWcuc2V0KGtleSwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0LnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkobGF0ZXN0KTtcbiAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2VDb25maWcgb2YgbGF0ZXN0LnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkpIHtcbiAgICAgICAgICAgIGxldCBvbGQgPSBvbGRCeUNvbmZpZy5nZXQoc3RyaXBwZWRLZXkoc291cmNlQ29uZmlnKSk/LnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAob2xkKSB7XG4gICAgICAgICAgICAgICAgb2xkLnVwZGF0ZVZhbGlkV2luZG93KHNvdXJjZUNvbmZpZy52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKG9sZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZywgcmVhZE9ubHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBsZWZ0b3ZlcnMgb2Ygb2xkQnlDb25maWcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxlZnRvdmVyIG9mIGxlZnRvdmVycykge1xuICAgICAgICAgICAgICAgIGxlZnRvdmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IGxhdGVzdDtcbiAgICAgICAgbGV0IG5ld1N0YXRlOiBDaGFpblN0YXRlID0geyBjb25maWc6IGxhdGVzdCwgc291cmNlcyB9O1xuICAgICAgICB0aGlzLmxhdGVzdFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrID0gMDtcbiAgICBwcml2YXRlIGF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICAvKiogRXZlcnkgc291cmNlIGZhaWxlZDogcmUtY29udGFjdCBhbGwgb2YgdGhlbSAocm91dGluZyByZS1yZWFkICsgY29ubmVjdGlvbiByZS1hdHRlbXB0KSBhbmQgYWRvcHQgd2hhdGV2ZXIgY29uZmlnIGNvbWVzIGJhY2suIFRocm90dGxlZCwgYW5kIGRlZHVwbGljYXRlZCBhY3Jvc3MgY29uY3VycmVudCBjYWxsZXJzLiAqL1xuICAgIHB1YmxpYyByZWNoZWNrQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQpIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrIDwgQVZBSUxBQklMSVRZX1JFQ0hFQ0tfVEhST1RUTEUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5sYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0ID0gdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyByZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYEV2ZXJ5IHN0b3JhZ2Ugc291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX07IHJlLWNvbnRhY3RpbmcgYWxsICR7c3RhdGUuc291cmNlcy5sZW5ndGh9IHNvdXJjZXMgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb24gcmUtYXR0ZW1wdClgKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChzdGF0ZS5zb3VyY2VzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgc291cmNlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBsYXRlc3QgPSByZXN1bHRzLmZpbmQoeCA9PiB4KTtcbiAgICAgICAgaWYgKCFsYXRlc3QpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5hZG9wdE5ld0NvbmZpZyhzdGF0ZSwgbGF0ZXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVSb3V0aW5nUHVzaD8uKCk7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5pdFJldHJ5VGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluaXRSZXRyeVRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdXRpbmdSZXdyaXRlci5kaXNwb3NlKCk7XG4gICAgICAgIGxldCBzdGF0ZVByb21pc2UgPSB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgaWYgKHN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgdm9pZCBzdGF0ZVByb21pc2UudGhlbihzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBTb3VyY2VQcm9iZSA9IHtcbiAgICBwcm9iZTogU291cmNlV3JhcHBlcjtcbiAgICBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZztcbiAgICByZXNwb25kZWQ6IGJvb2xlYW47XG4gICAgbGF0ZW5jeTogbnVtYmVyO1xuICAgIGV4aXN0aW5nOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgZXJyb3I6IHN0cmluZztcbn07XG5cbi8qKiBPbmUgdGhyb3dhd2F5IFNvdXJjZVdyYXBwZXIgcGVyIGNvbmZpZ3VyZWQgc291cmNlLCBlYWNoIGFza2VkIGZvciBpdHMgc3RvcmVkIHJvdXRpbmcgY29uZmlnIC0gd2hpY2ggYWxzbyBtZWFzdXJlcyBmaXJzdC1jb250YWN0IGxhdGVuY3ksIHNlZWRlZCBpbnRvIHRoZSByZWFsIHNvdXJjZXMgYWZ0ZXJ3YXJkcy4gVGhlIHByb2JlcyBNVVNUIGJlIGRpc3Bvc2VkIChkaXNwb3NlUHJvYmVzKSBvbmNlIHRoZSBjYWxsZXIgaXMgZG9uZSB3aXRoIHRoZW0uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTb3VyY2VzKGNvbmZpZ3M6IFNvdXJjZUNvbmZpZ1tdLCByZWFkT25seTogYm9vbGVhbik6IFByb21pc2U8U291cmNlUHJvYmVbXT4ge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChjb25maWdzLm1hcChhc3luYyBzb3VyY2VDb25maWcgPT4ge1xuICAgICAgICBsZXQgcHJvYmUgPSBhd2FpdCBTb3VyY2VXcmFwcGVyLmNyZWF0ZShzb3VyY2VDb25maWcsIHsgYmFja2dyb3VuZDogZmFsc2UsIHJlYWRPbmx5IH0pO1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgcHJvYmUucmVhZFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgIHJldHVybiB7IHByb2JlLCBzb3VyY2VDb25maWcsIHJlc3BvbmRlZDogdHJ1ZSwgbGF0ZW5jeTogRGF0ZS5ub3coKSAtIHN0YXJ0LCBleGlzdGluZywgZXJyb3I6IFwiXCIgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJvYmUsIHNvdXJjZUNvbmZpZywgcmVzcG9uZGVkOiBmYWxzZSwgbGF0ZW5jeTogMCwgZXhpc3Rpbmc6IHVuZGVmaW5lZCwgZXJyb3I6IGAke3NvdXJjZUNvbmZpZy51cmx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWAgfTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VQcm9iZXMocHJvYmVzOiBTb3VyY2VQcm9iZVtdKTogdm9pZCB7XG4gICAgZm9yIChsZXQgcHJvYmUgb2YgcHJvYmVzKSB7XG4gICAgICAgIHByb2JlLnByb2JlLmRpc3Bvc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogV2hpY2ggcm91dGluZyBjb25maWcgdGhlIGNoYWluIHNob3VsZCBSVU46IHRoZSBuZXdlc3Qgb2Ygb3VycyBhbmQgZXZlcnkgc3RvcmVkIG9uZS4gbmVlZHNXcml0ZVxuICogd2hlbiBvdXJzIGlzIHN0cmljdGx5IHRoZSBuZXdlc3QsIG1lYW5pbmcgdGhlIHN0b3JlcyBoYXZlIHRvIGJlIHRvbGQgYWJvdXQgaXQuIEEgc3RvcmVkIGNvbmZpZ1xuICogd2l0aCBvdXIgZXhhY3QgdmVyc2lvbiBidXQgRElGRkVSRU5UIGNvbnRlbnQgd2lucyB3aXRob3V0IGEgd3JpdGUsIGxvdWRseTogY29uZmlnIHVwZGF0ZXMgbXVzdFxuICogYnVtcCB0aGUgdmVyc2lvbiwgb3IgdGhleSBhcmUgaWdub3JlZCAtIHNpbGVudGx5IHRha2luZyB0aGUgY2hhbmdlZCBvbmUgd291bGQgbWFrZSBcIndoYXQgaXMgdGhlXG4gKiBidWNrZXQgcnVubmluZ1wiIGRlcGVuZCBvbiB3aGljaCBwcm9jZXNzIHN0YXJ0ZWQgbGFzdC5cbiAqXG4gKiBUaHJvd3Mgd2hlbiBubyBzb3VyY2UgYW5zd2VyZWQgYXQgYWxsOiB3aXRoIG5vdGhpbmcgc3RvcmVkIGFuZCBub2JvZHkgdG8gd3JpdGUgdG8sIHRoZXJlIGlzIG5vXG4gKiBjb25maWcgdG8gcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hvb3NlU3RhcnR1cENvbmZpZyhjb25maWc6IHsgY29uZmlndXJlZDogUmVtb3RlQ29uZmlnOyBwcm9iZXM6IFNvdXJjZVByb2JlW107IGRlYnVnTmFtZTogc3RyaW5nIH0pOiB7IGFjdGl2ZTogUmVtb3RlQ29uZmlnOyBuZWVkc1dyaXRlOiBib29sZWFuOyBleGlzdGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkIH0ge1xuICAgIGxldCB7IGNvbmZpZ3VyZWQsIHByb2JlcywgZGVidWdOYW1lIH0gPSBjb25maWc7XG4gICAgbGV0IGZvdW5kID0gcHJvYmVzLmZpbmQoeCA9PiB4LnJlc3BvbmRlZCk7XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIHN0b3JhZ2UgZm9yICR7ZGVidWdOYW1lfTogbm8gc291cmNlIGFuc3dlcmVkLiAke3Byb2Jlcy5tYXAoeCA9PiB4LmVycm9yKS5qb2luKFwiIHwgXCIpfWApO1xuICAgIH1cbiAgICBsZXQgZXhpc3RpbmcgPSBmb3VuZC5leGlzdGluZztcbiAgICBsZXQgYWN0aXZlID0gY29uZmlndXJlZDtcbiAgICBsZXQgbmVlZHNXcml0ZSA9IHRydWU7XG4gICAgaWYgKGV4aXN0aW5nICYmIGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpID49IGdldENvbmZpZ1ZlcnNpb24oY29uZmlndXJlZCkpIHtcbiAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpID09PSBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpICYmIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSAhPT0gSlNPTi5zdHJpbmdpZnkoY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFyY2hpdmVzIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCB3aXRob3V0IHVwZGF0aW5nIHRoZSB2ZXJzaW9uLCBmb3IgJHtmb3VuZC5zb3VyY2VDb25maWcudXJsfS4gVXBkYXRlcyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgeW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uLiBVc2luZzogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZyl9LCBpZ25vcmluZzogJHtKU09OLnN0cmluZ2lmeShjb25maWd1cmVkKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmUgPSBleGlzdGluZztcbiAgICAgICAgbmVlZHNXcml0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmVlZHNXcml0ZSkge1xuICAgICAgICBsZXQgYmVzdDogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY29uZmxpY3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgcHJvYmUgb2YgcHJvYmVzKSB7XG4gICAgICAgICAgICBsZXQgc3RvcmVkID0gcHJvYmUuZXhpc3Rpbmc7XG4gICAgICAgICAgICBpZiAoIXN0b3JlZCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWJlc3QgfHwgZ2V0Q29uZmlnVmVyc2lvbihzdG9yZWQpID4gZ2V0Q29uZmlnVmVyc2lvbihiZXN0KSkge1xuICAgICAgICAgICAgICAgIGJlc3QgPSBzdG9yZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihzdG9yZWQpID09PSBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpICYmIEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgIT09IEpTT04uc3RyaW5naWZ5KGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3RVcmwgPSBwcm9iZS5zb3VyY2VDb25maWcudXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0ICYmIGdldENvbmZpZ1ZlcnNpb24oYmVzdCkgPj0gZ2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKSkge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0VXJsICYmIGdldENvbmZpZ1ZlcnNpb24oYmVzdCkgPT09IGdldENvbmZpZ1ZlcnNpb24oY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBcmNoaXZlcyBjb25maWd1cmF0aW9uIHVwZGF0ZWQgd2l0aG91dCB1cGRhdGluZyB0aGUgdmVyc2lvbiwgZm9yICR7Y29uZmxpY3RVcmx9LiBVcGRhdGVzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24uIFVzaW5nOiAke0pTT04uc3RyaW5naWZ5KGJlc3QpfSwgaWdub3Jpbmc6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY3RpdmUgPSBiZXN0O1xuICAgICAgICAgICAgbmVlZHNXcml0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGFjdGl2ZSwgbmVlZHNXcml0ZSwgZXhpc3RpbmcgfTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGdpdmVuIHJvdXRpbmcgY29uZmlnIHRvIGV2ZXJ5IGNvbmZpZ3VyZWQgc3RvcmUsIG9uZSB3cml0ZSBwZXIgdXJsK25hbWU6IHRoZSB3cml0ZVxuICogbGFuZHMgaW4gdGhlIHN0b3JlIHRoZSBlbnRyeSBOQU1FUywgc28gdHdvIGVudHJpZXMgc2hhcmluZyBhIFVSTCBidXQgbmFtaW5nIGRpZmZlcmVudCBzdG9yZXMgYXJlXG4gKiB0d28gc2VwYXJhdGUgZGVsaXZlcmllcyAtIGRlZHVwaW5nIGJ5IFVSTCBhbG9uZSBsZWF2ZXMgdGhlIHNlY29uZCBzdG9yZSB1bmNvbmZpZ3VyZWQgZm9yZXZlci4gQWxsXG4gKiBpbiBwYXJhbGxlbCwgZXZlcnkgZmFpbHVyZSB0b2xlcmF0ZWQgKG5vLXdyaXRlLWFjY2VzcyBpbmNsdWRlZCAtIHRoZSBhdHRlbXB0IGNsYXNzaWZpZXMgaXQsXG4gKiBub3RoaW5nIHByZS1jaGVja3MgaXQpOiBhIGRvd24gbm9kZSBtdXN0IG5vdCBzdG9wIHRoZSBvdGhlcnMgZnJvbSBnZXR0aW5nIHRoZSBjb25maWcgLSB0aGV5IHdvdWxkXG4gKiB0aGVuIHJlamVjdCB3cml0ZXMgYXMgdW5jb25maWd1cmVkIHByZWNpc2VseSBCRUNBVVNFIGl0IG5ldmVyIGFycml2ZWQgLSBhbmQgaXQgbXVzdCBuZXZlciBzdG9wXG4gKiB0aGUgY2hhaW4gZnJvbSBzdGFydGluZy4gQSBzdG9yZSB0aGF0IG1pc3NlZCBpdCBwdWxscyBpdCBvZmYgaXRzIHBlZXJzLCBhbmQgdGhlIHJld3JpdGUgbG9vcFxuICogdHJpZXMgYWdhaW4gKHNlZSBSb3V0aW5nUmV3cml0ZUxvb3ApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nVG9BbGxTdG9yZXMoY29uZmlnOiB7IGNvbmZpZ3VyZWQ6IFJlbW90ZUNvbmZpZzsgc291cmNlczogU291cmNlV3JhcHBlcltdOyBkZWJ1Z05hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IGZhaWx1cmVzOiBzdHJpbmdbXTsgdG90YWw6IG51bWJlciB9PiB7XG4gICAgbGV0IHsgY29uZmlndXJlZCwgc291cmNlcywgZGVidWdOYW1lIH0gPSBjb25maWc7XG4gICAgbGV0IHJvdXRpbmdEYXRhID0gc2VyaWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZ3VyZWQpO1xuICAgIGxldCByb3V0aW5nV3JpdGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgdGFyZ2V0czogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgbGV0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICBsZXQga2V5ID0gYCR7c291cmNlLmNvbmZpZy51cmx9fCR7c291cmNlLmNvbmZpZy5uYW1lfWA7XG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgdGFyZ2V0cy5wdXNoKHNvdXJjZSk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBXcml0aW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpfSBmb3IgJHtkZWJ1Z05hbWV9IHRvIGFsbCAke3RhcmdldHMubGVuZ3RofSBzdG9yZXMgKHdyaXRlIHRpbWUgJHtuZXcgRGF0ZShyb3V0aW5nV3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSk6ICR7dGFyZ2V0cy5tYXAoeCA9PiBgJHt4LmNvbmZpZy51cmx9IChzdG9yZSAke0pTT04uc3RyaW5naWZ5KHguY29uZmlnLm5hbWUpfSlgKS5qb2luKFwiLCBcIil9YCk7XG4gICAgbGV0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzb3VyY2Uud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KFJPVVRJTkdfRklMRSwgcm91dGluZ0RhdGEsIHsgbGFzdE1vZGlmaWVkOiByb3V0aW5nV3JpdGVUaW1lIH0pKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpfSB0byAke3NvdXJjZS5jb25maWcudXJsfSAoc3RvcmUgJHtKU09OLnN0cmluZ2lmeShzb3VyY2UuY29uZmlnLm5hbWUpfSlgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIHJldHVybiB7IGZhaWx1cmVzLCB0b3RhbDogdGFyZ2V0cy5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBUaGUgcGVyaW9kaWMgcmUtd3JpdGUgb2YgdGhlIGNoYWluJ3MgaW4tY29kZSBjb25maWc6IGZhaWx1cmVzIHJldHJpZWQgb24gdGhlIHNob3J0IGludGVydmFsIC0gYVxuICogc3RvcmUgd2l0aG91dCB0aGUgY29uZmlnIHJlamVjdHMgZXZlcnkgd3JpdGUgYWltZWQgYXQgaXQsIHNvIHRoaXMgbm90IGxhbmRpbmcgaXMgYSBiaWcgZGVhbCxcbiAqIGxvZ2dlZCBvbiBldmVyeSBhdHRlbXB0IC0gYW5kIGV2ZW4gc3VjY2VzcyByZXBlYXRlZCBob3VybHksIGluIGNhc2UgYSBzdG9yZSBsb3N0IGl0LiBUaGUgZmFpbHVyZVxuICogdGhpcyBleGlzdHMgZm9yOiBhIHNlcnZlciB3aG9zZSB0cnVzdCB3YXMgb25seSBncmFudGVkIEFGVEVSIHN0YXJ0dXAsIHNvIHRoZSBzdGFydHVwIHdyaXRlIHdhc1xuICogcmVqZWN0ZWQgYW5kIG5vdGhpbmcgZWxzZSB3b3VsZCBldmVyIHJldHJ5IGl0LlxuICovXG5leHBvcnQgY2xhc3MgUm91dGluZ1Jld3JpdGVMb29wIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzoge1xuICAgICAgICBjb25maWd1cmVkOiBSZW1vdGVDb25maWc7XG4gICAgICAgIGRlYnVnTmFtZTogKCkgPT4gc3RyaW5nO1xuICAgICAgICAvKiogVGhlIGNoYWluJ3MgbmV3ZXN0IGFkb3B0ZWQgc3RhdGU6IHdoYXQgZGVjaWRlcyB3aGV0aGVyIG91cnMgaXMgc3RpbGwgdGhlIGNvbmZpZyB0byB3cml0ZSwgYW5kIHRoZSBzb3VyY2VzIGl0IGlzIHdyaXR0ZW4gdGhyb3VnaC4gVW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBpbml0IGZpbmlzaGVzLiAqL1xuICAgICAgICBsYXRlc3Q6ICgpID0+IHsgY29uZmlnOiBSZW1vdGVDb25maWc7IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSB9IHwgdW5kZWZpbmVkO1xuICAgIH0pIHsgfVxuXG4gICAgcHJpdmF0ZSB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gICAgLyoqIChSZSlhcm1zIHRoZSBsb29wIC0gY2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgaW5pdCwgd2l0aCB3aGV0aGVyIHRoYXQgaW5pdCdzIHdyaXRlIGZhaWxlZCAod2hpY2ggcGlja3MgdGhlIHNob3J0IHJldHJ5IGludGVydmFsKS4gKi9cbiAgICBwdWJsaWMgc3RhcnQoZmFpbGVkQXRTdGFydHVwOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGUoZmFpbGVkQXRTdGFydHVwICYmIENPTkZJR19XUklURV9SRVRSWV9JTlRFUlZBTCB8fCBDT05GSUdfV1JJVEVfUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY2hlZHVsZShkZWxheTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5yZXdyaXRlKCkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmV3cml0aW5nIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoQ09ORklHX1dSSVRFX1JFVFJZX0lOVEVSVkFMKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgICh0aGlzLnRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJld3JpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGxldCBjb25maWd1cmVkID0gdGhpcy5jb25maWcuY29uZmlndXJlZDtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5jb25maWcubGF0ZXN0KCk7XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoQ09ORklHX1dSSVRFX1JFVFJZX0lOVEVSVkFMKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVja2V0IGFkb3B0ZWQgYSBORVdFUiBjb25maWcgdGhhbiBvdXIgaW4tY29kZSBvbmUsIHNvIG91cnMgaXMgc3RhbGUgYW5kIGV2ZXJ5IHN0b3JlIHdvdWxkIChyaWdodGx5KSByZWZ1c2UgaXRcbiAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oc3RhdGUuY29uZmlnKSA+IGdldENvbmZpZ1ZlcnNpb24oY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoQ09ORklHX1dSSVRFX1JFRlJFU0hfSU5URVJWQUwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNhbWUgdmVyc2lvbiBidXQgZGlmZmVyZW50IGNvbnRlbnQ6IHN0YXJ0dXAgYWxyZWFkeSBkZWNpZGVkIHRoZSBzdG9yZWQgb25lIHdpbnMgdW50aWwgdGhlIHZlcnNpb24gaXMgYnVtcGVkIChzZWUgY2hvb3NlU3RhcnR1cENvbmZpZyksIGFuZCByZS13cml0aW5nIG91cnMgd291bGQgZmxpcCB0aGUgYnVja2V0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3b1xuICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpID09PSBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpICYmIEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKENPTkZJR19XUklURV9SRUZSRVNIX0lOVEVSVkFMKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBmYWlsdXJlcywgdG90YWwgfSA9IGF3YWl0IHdyaXRlUm91dGluZ1RvQWxsU3RvcmVzKHsgY29uZmlndXJlZCwgc291cmNlczogc3RhdGUuc291cmNlcywgZGVidWdOYW1lOiB0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKSB9KTtcbiAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVGhlIHBlcmlvZGljIHJvdXRpbmcgY29uZmlnIHdyaXRlIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oY29uZmlndXJlZCl9KSBmYWlsZWQgb24gJHtmYWlsdXJlcy5sZW5ndGh9IG9mICR7dG90YWx9IHN0b3JlcyAtIHJldHJ5aW5nIGluICR7Q09ORklHX1dSSVRFX1JFVFJZX0lOVEVSVkFMIC8gMTAwMH1zOiAke2ZhaWx1cmVzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKENPTkZJR19XUklURV9SRVRSWV9JTlRFUlZBTCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZShDT05GSUdfV1JJVEVfUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgfVxufVxuIl19
|
|
466
|
-
/* _JS_SOURCE_HASH = "
|
|
468
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5TdGFydHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2hhaW5TdGFydHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFrRDtBQUVsRCxpREFBK0g7QUFDL0gsbURBQWtHO0FBQ2xHLCtEQUFtRTtBQUNuRSx1RUFBcUY7QUFFckYsNGRBQTRkO0FBRTVkLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQy9DLHNOQUFzTjtBQUN6TSxRQUFBLDJCQUEyQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pELGdIQUFnSDtBQUNuRyxRQUFBLDZCQUE2QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBTzVELG1PQUFtTztBQUNuTyxNQUFhLGlCQUFpQjtJQWMxQixZQUFvQixNQUtuQjtRQUxtQixXQUFNLEdBQU4sTUFBTSxDQUt6QjtRQVpPLG1CQUFjLEdBQUcsaUNBQWlCLENBQUM7UUFHbkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQXNOakIsNEJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBNU1oQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQztZQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBQSxnREFBc0IsRUFBQyxHQUFHLEVBQUU7WUFDdEQsS0FBSyxJ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QTZCLENBQUMsQ0FBQztZQUM3QyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEksSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsYUFBYSxJQUFBLCtCQUFnQixFQUFDLFVBQVUsQ0FBQyxlQUFlLFFBQVEsQ0FBQyxNQUFNLE9BQU8sS0FBSyx5QkFBeUIsbUNBQTJCLEdBQUcsSUFBSSxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFQLElBQUksQ0FBQyxRQUFRLENBQUMsbUNBQTJCLENBQUMsQ0FBQztZQUMzQyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMscUNBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0o7QUFoRUQsZ0RBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldENvbmZpZ1ZlcnNpb24sIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IFNvdXJjZVdyYXBwZXIsIFJFVFJZX1NUQVJUX0RFTEFZLCBSRVRSWV9NQVhfREVMQVksIFJFVFJZX0dST1dUSCB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlU291cmNlc1wiO1xuaW1wb3J0IHsgb25TZXJ2ZXJSb3V0aW5nQ2hhbmdlZCwgdHJhY2tDaGFpbkNvbmZpZyB9IGZyb20gXCIuL3N0b3JhZ2VDbGllbnRDb250cm9sbGVyXCI7XG5cbi8vIFRoZSBMSUZFQ1lDTEUgb2YgYW4gQXJjaGl2ZXNDaGFpbidzIHN0YXRlLCBhbmQgbm90aGluZyBlbHNlOiBpbml0aWFsaXppbmcgaXQgKHByb2JpbmcgZXZlcnkgY29uZmlndXJlZCBzb3VyY2UsIGRlY2lkaW5nIHdoaWNoIHJvdXRpbmcgY29uZmlnIHRvIHJ1biwgd3JpdGluZyBvdXJzIG91dCB3aGVuIGl0IGlzIHRoZSBuZXdlc3QpLCB0aGUgcmV0cnkgd2hlbiBpbml0aWFsaXphdGlvbiBmYWlscywgdGhlIHBvbGwgdGhhdCBhZG9wdHMgbmV3ZXIgY29uZmlncywgdGhlIGF2YWlsYWJpbGl0eSByZWNoZWNrLCBhbmQgdGhlIGxvb3AgdGhhdCBrZWVwcyByZS13cml0aW5nIG91ciBjb25maWcuIE5vbmUgb2YgdGhpcyBpcyByZXF1ZXN0IGRpc3BhdGNoIC0gdGhlIGNoYWluIChjcmVhdGVBcmNoaXZlcy50cykgYXNrcyB0aGUgQ2hhaW5TdGF0ZU1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBkaXNwYXRjaGVzIG92ZXIgaXQuXG5cbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IEFWQUlMQUJJTElUWV9SRUNIRUNLX1RIUk9UVExFID0gNSAqIDEwMDA7XG4vLyBUaGUgcm91dGluZyBjb25maWcgd3JpdGUgaXMgcmV0cmllZCBvbiB0aGlzIGNhZGVuY2Ugd2hpbGUgaXQgaXMgZmFpbGluZy4gQSBzdG9yZSB0aGF0IG5ldmVyIHJlY2VpdmVkIHRoZSBjb25maWcgcmVqZWN0cyBldmVyeSB3cml0ZSBhaW1lZCBhdCBpdCwgc28gdGhpcyBub3QgbGFuZGluZyBpcyBhIGJpZyBkZWFsIC0gZWFjaCBmYWlsZWQgYXR0ZW1wdCBpcyBsb2dnZWQuXG5leHBvcnQgY29uc3QgQ09ORklHX1dSSVRFX1JFVFJZX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbi8vIC4uLmFuZCBldmVuIGFmdGVyIHN1Y2Nlc3MgaXQgaXMgcmUtd3JpdHRlbiBvbiB0aGlzIGNhZGVuY2UsIGluIGNhc2UgYSBzdG9yZSBsb3N0IGl0IG9yIGEgc2VydmVyIGFwcGVhcmVkIGxhdGVcbmV4cG9ydCBjb25zdCBDT05GSUdfV1JJVEVfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogNjAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBDaGFpblN0YXRlID0ge1xuICAgIGNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXTtcbn07XG5cbi8qKiBUaGUgY2hhaW4ncyBzdGF0ZSBhbmQgZXZlcnl0aGluZyBhYm91dCBIQVZJTkcgb25lOiBpbml0ICh3aXRoIGl0cyByZXRyeSksIHRoZSBjb25maWcgcG9sbCwgYXZhaWxhYmlsaXR5IHJlY2hlY2tzLCBhbmQgdGhlIHJvdXRpbmcgcmV3cml0ZSBsb29wLiBUaGUgY2hhaW4gY29uc3RydWN0cyBvbmUsIGFza3MgaXQgZ2V0U3RhdGUoKSBvbiBldmVyeSBjYWxsLCBhbmQgZGlzcG9zZXMgaXQuICovXG5leHBvcnQgY2xhc3MgQ2hhaW5TdGF0ZU1hbmFnZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBjb25maWd1cmVkOiBSZW1vdGVDb25maWc7XG4gICAgLyoqIFRoZSBuZXdlc3QgYWRvcHRlZCBjb25maWcgLSB3aGF0IGdldERlYnVnTmFtZSBhbmQgZGlzcGF0Y2ggZGVjaXNpb25zIHJlYWQuIFN0YXJ0cyBhcyB0aGUgY29uZmlndXJlZCBvbmUgYW5kIG1vdmVzIHdpdGggZXZlcnkgYWRvcHRpb24uICovXG4gICAgcHVibGljIGFjdGl2ZUNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHByaXZhdGUgc3RhdGVQcm9taXNlOiBQcm9taXNlPENoYWluU3RhdGU+IHwgdW5kZWZpbmVkO1xuICAgIC8vIFRoZSByZXNvbHZlZCBzdGF0ZSwgZm9yIHN5bmNocm9ub3VzIGFjY2VzcyAoZ2V0R2V0VVJMcykgLSBhbHdheXMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgd2hlcmUgc3RhdGVQcm9taXNlIG1heSBicmllZmx5IGxhZyBkdXJpbmcgYSByZWJ1aWxkXG4gICAgcHJpdmF0ZSBsYXRlc3RTdGF0ZTogQ2hhaW5TdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgcHJpdmF0ZSBpbml0UmV0cnlUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZVJvdXRpbmdQdXNoOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByb3V0aW5nUmV3cml0ZXI6IFJvdXRpbmdSZXdyaXRlTG9vcDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiB7XG4gICAgICAgIGNvbmZpZ3VyZWQ6IFJlbW90ZUNvbmZpZztcbiAgICAgICAgZGVidWdOYW1lOiAoKSA9PiBzdHJpbmc7XG4gICAgICAgIC8qKiBTZWUgQXJjaGl2ZXNDaGFpbk9wdGlvbnMuZGlyZWN0Q29ubmVjdC4gKi9cbiAgICAgICAgZGlyZWN0Q29ubmVjdD86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZWQgPSBjb25maWcuY29uZmlndXJlZDtcbiAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSBjb25maWcuY29uZmlndXJlZDtcbiAgICAgICAgdGhpcy5yb3V0aW5nUmV3cml0ZXIgPSBuZXcgUm91dGluZ1Jld3JpdGVMb29wKHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IGNvbmZpZy5jb25maWd1cmVkLFxuICAgICAgICAgICAgZGVidWdOYW1lOiBjb25maWcuZGVidWdOYW1lLFxuICAgICAgICAgICAgbGF0ZXN0OiAoKSA9PiB0aGlzLmxhdGVzdFN0YXRlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVJvdXRpbmdQdXNoID0gb25TZXJ2ZXJSb3V0aW5nQ2hhbmdlZCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQ29uZmlnIHJlZnJlc2ggZmFpbGVkIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfTogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gU28gYSBzZXJ2ZXIgY2FuIGFzayB3aGF0IGNvbmZpZyB3ZSBpbnRlbmRlZCBmb3IgYSBzdG9yZSBuYW1lIChzZWUgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIuZ2V0Um91dGluZ0NvbmZpZ0Zvck5hbWUpXG4gICAgICAgIHRoaXMudW50cmFja0NvbmZpZyA9IHRyYWNrQ2hhaW5Db25maWcoeyBjb25maWd1cmVkOiBjb25maWcuY29uZmlndXJlZCwgYWN0aXZlOiAoKSA9PiB0aGlzLmFjdGl2ZUNvbmZpZyB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVudHJhY2tDb25maWc6ICgpID0+IHZvaWQ7XG5cbiAgICAvKiogVGhlIG5ld2VzdCBhZG9wdGVkIHN0YXRlLCBzeW5jaHJvbm91c2x5IC0gdW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBpbml0IGZpbmlzaGVzLiAqL1xuICAgIHB1YmxpYyBsYXRlc3QoKTogQ2hhaW5TdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhdGVzdFN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0ZSgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEFyY2hpdmVzQ2hhaW4gJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gaGFzIGJlZW4gZGlzcG9zZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IFJFVFJZX1NUQVJUX0RFTEFZO1xuICAgICAgICAgICAgfSwgKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQgfHwgdGhpcy5pbml0UmV0cnlUaW1lcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFN0b3JhZ2UgaW5pdCBmYWlsZWQgZm9yICR7dGhpcy5jb25maWcuZGVidWdOYW1lKCl9LCByZXRyeWluZyBpbiAke01hdGgucm91bmQodGhpcy5pbml0UmV0cnlEZWxheSAvIDEwMDApfXMuICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVQcm9taXNlID09PSBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRlKCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLmluaXRSZXRyeURlbGF5KTtcbiAgICAgICAgICAgICAgICAodGhpcy5pbml0UmV0cnlUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgdGhpcy5pbml0UmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8Q2hhaW5TdGF0ZT4ge1xuICAgICAgICBsZXQgY29uZmlncyA9IHRoaXMuY29uZmlndXJlZC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkodGhpcy5jb25maWd1cmVkKTtcbiAgICAgICAgbGV0IHByb2JlcyA9IGF3YWl0IHByb2JlU291cmNlcyhjb25maWdzLCByZWFkT25seSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBhY3RpdmUsIG5lZWRzV3JpdGUsIGV4aXN0aW5nIH0gPSBjaG9vc2VTdGFydHVwQ29uZmlnKHsgY29uZmlndXJlZDogdGhpcy5jb25maWd1cmVkLCBwcm9iZXMsIGRlYnVnTmFtZTogdGhpcy5jb25maWcuZGVidWdOYW1lKCkgfSk7XG4gICAgICAgICAgICBsZXQgc291cmNlcyA9IGF3YWl0IHRoaXMuYnVpbGRTb3VyY2VzKGFjdGl2ZSk7XG4gICAgICAgICAgICBsZXQgY29uZmlnV3JpdGVGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5jb25maWcuZGVidWdOYW1lKCl9IGlzIG91dCBvZiBkYXRlIChzdG9yZWQgdmVyc2lvbiAke2V4aXN0aW5nICYmIGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpIHx8IFwibm9uZVwifSwgb3VycyAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IHsgZmFpbHVyZXMsIHRvdGFsIH0gPSBhd2FpdCB3cml0ZVJvdXRpbmdUb0FsbFN0b3Jlcyh7IGNvbmZpZ3VyZWQ6IHRoaXMuY29uZmlndXJlZCwgc291cmNlcywgZGVidWdOYW1lOiB0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKSB9KTtcbiAgICAgICAgICAgICAgICBjb25maWdXcml0ZUZhaWxlZCA9IGZhaWx1cmVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCAmJiBmYWlsdXJlcy5sZW5ndGggPT09IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vYm9keSBoYXMgb3VyIGNvbmZpZywgc28gcnVubmluZyBvbiBpdCB3b3VsZCBqdXN0IGRpc2FncmVlIHdpdGggZXZlcnkgc2VydmVyLiBUaGUgc3RvcmVkIG9uZSAod2hlbiB0aGVyZSBpcyBvbmUpIGlzIHdoYXQgdGhlIHNlcnZlcnMgYWN0dWFsbHkgcnVuLlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byBBTlkgb2YgdGhlICR7dG90YWx9IHN0b3Jlcy4gJHtleGlzdGluZyAmJiBgUnVubmluZyBvbiB0aGUgc3RvcmVkIGNvbmZpZyAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpfSkgdW50aWwgYSB3cml0ZSBzdWNjZWVkcy5gIHx8IGBObyBzdG9yZWQgY29uZmlnIGV4aXN0cyBlaXRoZXIsIHNvIHNlcnZlcnMgd2lsbCByZWplY3Qgd3JpdGVzIHVudGlsIHRoaXMgc3VjY2VlZHMuYH0gUmV0cnlpbmcgaW4gJHtDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwgLyAxMDAwfXMuIEZhaWx1cmVzOiAke2ZhaWx1cmVzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbHVyZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0pIHdhcyB3cml0dGVuIHRvICR7dG90YWwgLSBmYWlsdXJlcy5sZW5ndGh9IG9mICR7dG90YWx9IHN0b3Jlcy4gUmV0cnlpbmcgdGhlIHJlc3QgaW4gJHtDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwgLyAxMDAwfXMgKHRoZXkgYWxzbyBwdWxsIGl0IGZyb20gdGhlIHN0b3JlcyB0aGF0IGhhdmUgaXQpLiBGYWlsdXJlczogJHtmYWlsdXJlcy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb2JlID0gcHJvYmVzLmZpbmQoeCA9PiB4LnJlc3BvbmRlZCAmJiB4LnNvdXJjZUNvbmZpZy51cmwgPT09IHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNlZWRMYXRlbmN5KHByb2JlLmxhdGVuY3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbmZpZ1BvbGwoKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZTogQ2hhaW5TdGF0ZSA9IHsgY29uZmlnOiBhY3RpdmUsIHNvdXJjZXMgfTtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ1Jld3JpdGVyLnN0YXJ0KGNvbmZpZ1dyaXRlRmFpbGVkKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRpc3Bvc2VQcm9iZXMocHJvYmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDbGllbnRzaWRlLCBhIGNvbmZpZyB3aXRoIHB1YmxpYyBzb3VyY2VzIGlzIHNlcnZlZCBlbnRpcmVseSBvdmVyIHBsYWluIFVSTCBkb3dubG9hZHMgLSBubyBBUEkgY29ubmVjdGlvbiwgbm8gYWNjZXNzIGdyYW50LCBhbmQgbm8gd3JpdGluZy4gZGlyZWN0Q29ubmVjdCBvcHRzIG91dCBvZiB0aGF0LiAqL1xuICAgIHByaXZhdGUgaXNSZWFkT25seShjb25maWc6IFJlbW90ZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlyZWN0Q29ubmVjdCB8fCBpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkuc29tZSh4ID0+IHgucHVibGljKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnLCByZWFkT25seTogYm9vbGVhbik6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgc291cmNlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IHJlYWRPbmx5IH0pO1xuICAgICAgICBzb3VyY2Uuc3RhcnRQaW5naW5nKCk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXJbXT4ge1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkoY29uZmlnKTtcbiAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2VDb25maWcgb2YgY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZywgcmVhZE9ubHkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0Q29uZmlnUG9sbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nIGZvciBhIG5ldyBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZhaWxlZCBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIENPTkZJR19QT0xMX0lOVEVSVkFMKTtcbiAgICAgICAgKHRoaXMucG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZXMgY29uY3VycmVudCByZWZyZXNoZXMgKHRoZSBwb2xsIHRpbWVyIGFuZCB3cm9uZy10YXJnZXQgd3JpdGUgcmV0cmllcyBzaGFyZSB0aGlzKVxuICAgIHByaXZhdGUgY29uZmlnUmVmcmVzaEluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyByZWZyZXNoQWN0aXZlQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnUmVmcmVzaEluRmxpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHRoaXMuY2hlY2tGb3JOZXdDb25maWcoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhdGVzdCA9IGF3YWl0IHNvdXJjZS5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIGlmIChsYXRlc3QpIHJldHVybiBub3JtYWxpemVSZW1vdGVDb25maWcobGF0ZXN0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IHN0YXRlLnNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN0b3JhZ2Ugc291cmNlIGNvdWxkIGdpdmUgdXMgdGhlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuY29uZmlnLmRlYnVnTmFtZSgpfTogJHtlcnJvcnMuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tGb3JOZXdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkIHx8ICF0aGlzLnN0YXRlUHJvbWlzZSkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhdGU6IENoYWluU3RhdGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGVQcm9taXNlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGF0ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaExhdGVzdENvbmZpZyhzdGF0ZSk7XG4gICAgICAgIGlmICghbGF0ZXN0KSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuYWRvcHROZXdDb25maWcoc3RhdGUsIGxhdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZG9wdE5ld0NvbmZpZyhzdGF0ZTogQ2hhaW5TdGF0ZSwgbGF0ZXN0OiBSZW1vdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGxhdGVzdCkgPT09IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbmZpZykpIHJldHVybjtcbiAgICAgICAgbGV0IHJlY2VpdmVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICBsZXQgb25seUludGVybWVkaWF0ZXNDaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkocmVzb2x2ZUludGVybWVkaWF0ZVNvdXJjZXMobGF0ZXN0KSkgPT09IEpTT04uc3RyaW5naWZ5KHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzKHN0YXRlLmNvbmZpZykpO1xuICAgICAgICBpZiAob25seUludGVybWVkaWF0ZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIHN3aXRjaG92ZXIgd2luZG93cyBjaGFuZ2VkICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpfSAtPiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0pLCByZWNlaXZlZCAke3JlY2VpdmVkfSwgcmVidWlsZGluZyBzb3VyY2VzLiBOZXcgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdCl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIGNvbmZpZyBjaGFuZ2VkICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpfSAtPiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0pLCByZWNlaXZlZCAke3JlY2VpdmVkfSwgcmVidWlsZGluZyBzb3VyY2VzLiBOZXcgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0cmlwcGVkS2V5ID0gKGNvbmZpZzogU291cmNlQ29uZmlnKSA9PiBKU09OLnN0cmluZ2lmeSh7IC4uLmNvbmZpZywgdmFsaWRXaW5kb3c6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IG9sZEJ5Q29uZmlnID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVdyYXBwZXJbXT4oKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBzdHJpcHBlZEtleShzb3VyY2UuY29uZmlnKTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gb2xkQnlDb25maWcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgb2xkQnlDb25maWcuc2V0KGtleSwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0LnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkobGF0ZXN0KTtcbiAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2VDb25maWcgb2YgbGF0ZXN0LnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkpIHtcbiAgICAgICAgICAgIGxldCBvbGQgPSBvbGRCeUNvbmZpZy5nZXQoc3RyaXBwZWRLZXkoc291cmNlQ29uZmlnKSk/LnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAob2xkKSB7XG4gICAgICAgICAgICAgICAgb2xkLnVwZGF0ZVZhbGlkV2luZG93KHNvdXJjZUNvbmZpZy52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKG9sZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZywgcmVhZE9ubHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBsZWZ0b3ZlcnMgb2Ygb2xkQnlDb25maWcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxlZnRvdmVyIG9mIGxlZnRvdmVycykge1xuICAgICAgICAgICAgICAgIGxlZnRvdmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IGxhdGVzdDtcbiAgICAgICAgbGV0IG5ld1N0YXRlOiBDaGFpblN0YXRlID0geyBjb25maWc6IGxhdGVzdCwgc291cmNlcyB9O1xuICAgICAgICB0aGlzLmxhdGVzdFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrID0gMDtcbiAgICBwcml2YXRlIGF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICAvKiogRXZlcnkgc291cmNlIGZhaWxlZDogcmUtY29udGFjdCBhbGwgb2YgdGhlbSAocm91dGluZyByZS1yZWFkICsgY29ubmVjdGlvbiByZS1hdHRlbXB0KSBhbmQgYWRvcHQgd2hhdGV2ZXIgY29uZmlnIGNvbWVzIGJhY2suIFRocm90dGxlZCwgYW5kIGRlZHVwbGljYXRlZCBhY3Jvc3MgY29uY3VycmVudCBjYWxsZXJzLiAqL1xuICAgIHB1YmxpYyByZWNoZWNrQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQpIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrIDwgQVZBSUxBQklMSVRZX1JFQ0hFQ0tfVEhST1RUTEUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5sYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0ID0gdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyByZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYEV2ZXJ5IHN0b3JhZ2Ugc291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX07IHJlLWNvbnRhY3RpbmcgYWxsICR7c3RhdGUuc291cmNlcy5sZW5ndGh9IHNvdXJjZXMgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb24gcmUtYXR0ZW1wdClgKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChzdGF0ZS5zb3VyY2VzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgc291cmNlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBsYXRlc3QgPSByZXN1bHRzLmZpbmQoeCA9PiB4KTtcbiAgICAgICAgaWYgKCFsYXRlc3QpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5hZG9wdE5ld0NvbmZpZyhzdGF0ZSwgbGF0ZXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudW50cmFja0NvbmZpZygpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlUm91dGluZ1B1c2g/LigpO1xuICAgICAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluaXRSZXRyeVRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbml0UmV0cnlUaW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0aW5nUmV3cml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICBsZXQgc3RhdGVQcm9taXNlID0gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgICAgIGlmIChzdGF0ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgc3RhdGVQcm9taXNlLnRoZW4oc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU291cmNlUHJvYmUgPSB7XG4gICAgcHJvYmU6IFNvdXJjZVdyYXBwZXI7XG4gICAgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7XG4gICAgcmVzcG9uZGVkOiBib29sZWFuO1xuICAgIGxhdGVuY3k6IG51bWJlcjtcbiAgICBleGlzdGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGVycm9yOiBzdHJpbmc7XG59O1xuXG4vKiogT25lIHRocm93YXdheSBTb3VyY2VXcmFwcGVyIHBlciBjb25maWd1cmVkIHNvdXJjZSwgZWFjaCBhc2tlZCBmb3IgaXRzIHN0b3JlZCByb3V0aW5nIGNvbmZpZyAtIHdoaWNoIGFsc28gbWVhc3VyZXMgZmlyc3QtY29udGFjdCBsYXRlbmN5LCBzZWVkZWQgaW50byB0aGUgcmVhbCBzb3VyY2VzIGFmdGVyd2FyZHMuIFRoZSBwcm9iZXMgTVVTVCBiZSBkaXNwb3NlZCAoZGlzcG9zZVByb2Jlcykgb25jZSB0aGUgY2FsbGVyIGlzIGRvbmUgd2l0aCB0aGVtLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2JlU291cmNlcyhjb25maWdzOiBTb3VyY2VDb25maWdbXSwgcmVhZE9ubHk6IGJvb2xlYW4pOiBQcm9taXNlPFNvdXJjZVByb2JlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoY29uZmlncy5tYXAoYXN5bmMgc291cmNlQ29uZmlnID0+IHtcbiAgICAgICAgbGV0IHByb2JlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IGJhY2tncm91bmQ6IGZhbHNlLCByZWFkT25seSB9KTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHByb2JlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICByZXR1cm4geyBwcm9iZSwgc291cmNlQ29uZmlnLCByZXNwb25kZWQ6IHRydWUsIGxhdGVuY3k6IERhdGUubm93KCkgLSBzdGFydCwgZXhpc3RpbmcsIGVycm9yOiBcIlwiIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHByb2JlLCBzb3VyY2VDb25maWcsIHJlc3BvbmRlZDogZmFsc2UsIGxhdGVuY3k6IDAsIGV4aXN0aW5nOiB1bmRlZmluZWQsIGVycm9yOiBgJHtzb3VyY2VDb25maWcudXJsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gIH07XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlUHJvYmVzKHByb2JlczogU291cmNlUHJvYmVbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IHByb2JlIG9mIHByb2Jlcykge1xuICAgICAgICBwcm9iZS5wcm9iZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdoaWNoIHJvdXRpbmcgY29uZmlnIHRoZSBjaGFpbiBzaG91bGQgUlVOOiB0aGUgbmV3ZXN0IG9mIG91cnMgYW5kIGV2ZXJ5IHN0b3JlZCBvbmUuIG5lZWRzV3JpdGVcbiAqIHdoZW4gb3VycyBpcyBzdHJpY3RseSB0aGUgbmV3ZXN0LCBtZWFuaW5nIHRoZSBzdG9yZXMgaGF2ZSB0byBiZSB0b2xkIGFib3V0IGl0LiBBIHN0b3JlZCBjb25maWdcbiAqIHdpdGggb3VyIGV4YWN0IHZlcnNpb24gYnV0IERJRkZFUkVOVCBjb250ZW50IHdpbnMgd2l0aG91dCBhIHdyaXRlLCBsb3VkbHk6IGNvbmZpZyB1cGRhdGVzIG11c3RcbiAqIGJ1bXAgdGhlIHZlcnNpb24sIG9yIHRoZXkgYXJlIGlnbm9yZWQgLSBzaWxlbnRseSB0YWtpbmcgdGhlIGNoYW5nZWQgb25lIHdvdWxkIG1ha2UgXCJ3aGF0IGlzIHRoZVxuICogYnVja2V0IHJ1bm5pbmdcIiBkZXBlbmQgb24gd2hpY2ggcHJvY2VzcyBzdGFydGVkIGxhc3QuXG4gKlxuICogVGhyb3dzIHdoZW4gbm8gc291cmNlIGFuc3dlcmVkIGF0IGFsbDogd2l0aCBub3RoaW5nIHN0b3JlZCBhbmQgbm9ib2R5IHRvIHdyaXRlIHRvLCB0aGVyZSBpcyBub1xuICogY29uZmlnIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNob29zZVN0YXJ0dXBDb25maWcoY29uZmlnOiB7IGNvbmZpZ3VyZWQ6IFJlbW90ZUNvbmZpZzsgcHJvYmVzOiBTb3VyY2VQcm9iZVtdOyBkZWJ1Z05hbWU6IHN0cmluZyB9KTogeyBhY3RpdmU6IFJlbW90ZUNvbmZpZzsgbmVlZHNXcml0ZTogYm9vbGVhbjsgZXhpc3Rpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZCB9IHtcbiAgICBsZXQgeyBjb25maWd1cmVkLCBwcm9iZXMsIGRlYnVnTmFtZSB9ID0gY29uZmlnO1xuICAgIGxldCBmb3VuZCA9IHByb2Jlcy5maW5kKHggPT4geC5yZXNwb25kZWQpO1xuICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5pdGlhbGl6ZSBzdG9yYWdlIGZvciAke2RlYnVnTmFtZX06IG5vIHNvdXJjZSBhbnN3ZXJlZC4gJHtwcm9iZXMubWFwKHggPT4geC5lcnJvcikuam9pbihcIiB8IFwiKX1gKTtcbiAgICB9XG4gICAgbGV0IGV4aXN0aW5nID0gZm91bmQuZXhpc3Rpbmc7XG4gICAgbGV0IGFjdGl2ZSA9IGNvbmZpZ3VyZWQ7XG4gICAgbGV0IG5lZWRzV3JpdGUgPSB0cnVlO1xuICAgIGlmIChleGlzdGluZyAmJiBnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSA+PSBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgIGlmIChnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSA9PT0gZ2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShleGlzdGluZykgIT09IEpTT04uc3RyaW5naWZ5KGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBcmNoaXZlcyBjb25maWd1cmF0aW9uIHVwZGF0ZWQgd2l0aG91dCB1cGRhdGluZyB0aGUgdmVyc2lvbiwgZm9yICR7Zm91bmQuc291cmNlQ29uZmlnLnVybH0uIFVwZGF0ZXMgd2lsbCBiZSBpZ25vcmVkIHVudGlsIHlvdSBpbmNyZWFzZSB0aGUgdmVyc2lvbi4gVXNpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpfSwgaWdub3Jpbmc6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlndXJlZCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5lZWRzV3JpdGUpIHtcbiAgICAgICAgbGV0IGJlc3Q6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNvbmZsaWN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IHByb2JlIG9mIHByb2Jlcykge1xuICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHByb2JlLmV4aXN0aW5nO1xuICAgICAgICAgICAgaWYgKCFzdG9yZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFiZXN0IHx8IGdldENvbmZpZ1ZlcnNpb24oc3RvcmVkKSA+IGdldENvbmZpZ1ZlcnNpb24oYmVzdCkpIHtcbiAgICAgICAgICAgICAgICBiZXN0ID0gc3RvcmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oc3RvcmVkKSA9PT0gZ2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShzdG9yZWQpICE9PSBKU09OLnN0cmluZ2lmeShjb25maWd1cmVkKSkge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0VXJsID0gcHJvYmUuc291cmNlQ29uZmlnLnVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdCAmJiBnZXRDb25maWdWZXJzaW9uKGJlc3QpID49IGdldENvbmZpZ1ZlcnNpb24oY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgIGlmIChjb25mbGljdFVybCAmJiBnZXRDb25maWdWZXJzaW9uKGJlc3QpID09PSBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2NvbmZsaWN0VXJsfS4gVXBkYXRlcyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgeW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uLiBVc2luZzogJHtKU09OLnN0cmluZ2lmeShiZXN0KX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ3VyZWQpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWN0aXZlID0gYmVzdDtcbiAgICAgICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhY3RpdmUsIG5lZWRzV3JpdGUsIGV4aXN0aW5nIH07XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBnaXZlbiByb3V0aW5nIGNvbmZpZyB0byBldmVyeSBjb25maWd1cmVkIHN0b3JlLCBvbmUgd3JpdGUgcGVyIHVybCtuYW1lOiB0aGUgd3JpdGVcbiAqIGxhbmRzIGluIHRoZSBzdG9yZSB0aGUgZW50cnkgTkFNRVMsIHNvIHR3byBlbnRyaWVzIHNoYXJpbmcgYSBVUkwgYnV0IG5hbWluZyBkaWZmZXJlbnQgc3RvcmVzIGFyZVxuICogdHdvIHNlcGFyYXRlIGRlbGl2ZXJpZXMgLSBkZWR1cGluZyBieSBVUkwgYWxvbmUgbGVhdmVzIHRoZSBzZWNvbmQgc3RvcmUgdW5jb25maWd1cmVkIGZvcmV2ZXIuIEFsbFxuICogaW4gcGFyYWxsZWwsIGV2ZXJ5IGZhaWx1cmUgdG9sZXJhdGVkIChuby13cml0ZS1hY2Nlc3MgaW5jbHVkZWQgLSB0aGUgYXR0ZW1wdCBjbGFzc2lmaWVzIGl0LFxuICogbm90aGluZyBwcmUtY2hlY2tzIGl0KTogYSBkb3duIG5vZGUgbXVzdCBub3Qgc3RvcCB0aGUgb3RoZXJzIGZyb20gZ2V0dGluZyB0aGUgY29uZmlnIC0gdGhleSB3b3VsZFxuICogdGhlbiByZWplY3Qgd3JpdGVzIGFzIHVuY29uZmlndXJlZCBwcmVjaXNlbHkgQkVDQVVTRSBpdCBuZXZlciBhcnJpdmVkIC0gYW5kIGl0IG11c3QgbmV2ZXIgc3RvcFxuICogdGhlIGNoYWluIGZyb20gc3RhcnRpbmcuIEEgc3RvcmUgdGhhdCBtaXNzZWQgaXQgcHVsbHMgaXQgb2ZmIGl0cyBwZWVycywgYW5kIHRoZSByZXdyaXRlIGxvb3BcbiAqIHRyaWVzIGFnYWluIChzZWUgUm91dGluZ1Jld3JpdGVMb29wKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlUm91dGluZ1RvQWxsU3RvcmVzKGNvbmZpZzogeyBjb25maWd1cmVkOiBSZW1vdGVDb25maWc7IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXTsgZGVidWdOYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBmYWlsdXJlczogc3RyaW5nW107IHRvdGFsOiBudW1iZXIgfT4ge1xuICAgIGxldCB7IGNvbmZpZ3VyZWQsIHNvdXJjZXMsIGRlYnVnTmFtZSB9ID0gY29uZmlnO1xuICAgIGxldCByb3V0aW5nRGF0YSA9IHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhjb25maWd1cmVkKTtcbiAgICBsZXQgcm91dGluZ1dyaXRlVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHRhcmdldHM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke3NvdXJjZS5jb25maWcudXJsfXwke3NvdXJjZS5jb25maWcubmFtZX1gO1xuICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIHRhcmdldHMucHVzaChzb3VyY2UpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgV3JpdGluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKX0gZm9yICR7ZGVidWdOYW1lfSB0byBhbGwgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzICh3cml0ZSB0aW1lICR7bmV3IERhdGUocm91dGluZ1dyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pOiAke3RhcmdldHMubWFwKHggPT4gYCR7eC5jb25maWcudXJsfSAoc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh4LmNvbmZpZy5uYW1lKX0pYCkuam9pbihcIiwgXCIpfWApO1xuICAgIGxldCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIHJvdXRpbmdEYXRhLCB7IGxhc3RNb2RpZmllZDogcm91dGluZ1dyaXRlVGltZSB9KSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgV3JvdGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKX0gdG8gJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pYCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goYCR7c291cmNlLmNvbmZpZy51cmx9IChzdG9yZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcubmFtZSl9KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICByZXR1cm4geyBmYWlsdXJlcywgdG90YWw6IHRhcmdldHMubGVuZ3RoIH07XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZGljIHJlLXdyaXRlIG9mIHRoZSBjaGFpbidzIGluLWNvZGUgY29uZmlnOiBmYWlsdXJlcyByZXRyaWVkIG9uIHRoZSBzaG9ydCBpbnRlcnZhbCAtIGFcbiAqIHN0b3JlIHdpdGhvdXQgdGhlIGNvbmZpZyByZWplY3RzIGV2ZXJ5IHdyaXRlIGFpbWVkIGF0IGl0LCBzbyB0aGlzIG5vdCBsYW5kaW5nIGlzIGEgYmlnIGRlYWwsXG4gKiBsb2dnZWQgb24gZXZlcnkgYXR0ZW1wdCAtIGFuZCBldmVuIHN1Y2Nlc3MgcmVwZWF0ZWQgaG91cmx5LCBpbiBjYXNlIGEgc3RvcmUgbG9zdCBpdC4gVGhlIGZhaWx1cmVcbiAqIHRoaXMgZXhpc3RzIGZvcjogYSBzZXJ2ZXIgd2hvc2UgdHJ1c3Qgd2FzIG9ubHkgZ3JhbnRlZCBBRlRFUiBzdGFydHVwLCBzbyB0aGUgc3RhcnR1cCB3cml0ZSB3YXNcbiAqIHJlamVjdGVkIGFuZCBub3RoaW5nIGVsc2Ugd291bGQgZXZlciByZXRyeSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRpbmdSZXdyaXRlTG9vcCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgY29uZmlndXJlZDogUmVtb3RlQ29uZmlnO1xuICAgICAgICBkZWJ1Z05hbWU6ICgpID0+IHN0cmluZztcbiAgICAgICAgLyoqIFRoZSBjaGFpbidzIG5ld2VzdCBhZG9wdGVkIHN0YXRlOiB3aGF0IGRlY2lkZXMgd2hldGhlciBvdXJzIGlzIHN0aWxsIHRoZSBjb25maWcgdG8gd3JpdGUsIGFuZCB0aGUgc291cmNlcyBpdCBpcyB3cml0dGVuIHRocm91Z2guIFVuZGVmaW5lZCB1bnRpbCB0aGUgZmlyc3QgaW5pdCBmaW5pc2hlcy4gKi9cbiAgICAgICAgbGF0ZXN0OiAoKSA9PiB7IGNvbmZpZzogUmVtb3RlQ29uZmlnOyBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10gfSB8IHVuZGVmaW5lZDtcbiAgICB9KSB7IH1cblxuICAgIHByaXZhdGUgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblxuICAgIC8qKiAoUmUpYXJtcyB0aGUgbG9vcCAtIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGluaXQsIHdpdGggd2hldGhlciB0aGF0IGluaXQncyB3cml0ZSBmYWlsZWQgKHdoaWNoIHBpY2tzIHRoZSBzaG9ydCByZXRyeSBpbnRlcnZhbCkuICovXG4gICAgcHVibGljIHN0YXJ0KGZhaWxlZEF0U3RhcnR1cDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKGZhaWxlZEF0U3RhcnR1cCAmJiBDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwgfHwgQ09ORklHX1dSSVRFX1JFRlJFU0hfSU5URVJWQUwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGUoZGVsYXk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmV3cml0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJld3JpdGluZyB0aGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlKENPTkZJR19XUklURV9SRVRSWV9JTlRFUlZBTCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAodGhpcy50aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXdyaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgY29uZmlndXJlZCA9IHRoaXMuY29uZmlnLmNvbmZpZ3VyZWQ7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuY29uZmlnLmxhdGVzdCgpO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKENPTkZJR19XUklURV9SRVRSWV9JTlRFUlZBTCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJ1Y2tldCBhZG9wdGVkIGEgTkVXRVIgY29uZmlnIHRoYW4gb3VyIGluLWNvZGUgb25lLCBzbyBvdXJzIGlzIHN0YWxlIGFuZCBldmVyeSBzdG9yZSB3b3VsZCAocmlnaHRseSkgcmVmdXNlIGl0XG4gICAgICAgIGlmIChnZXRDb25maWdWZXJzaW9uKHN0YXRlLmNvbmZpZykgPiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKENPTkZJR19XUklURV9SRUZSRVNIX0lOVEVSVkFMKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTYW1lIHZlcnNpb24gYnV0IGRpZmZlcmVudCBjb250ZW50OiBzdGFydHVwIGFscmVhZHkgZGVjaWRlZCB0aGUgc3RvcmVkIG9uZSB3aW5zIHVudGlsIHRoZSB2ZXJzaW9uIGlzIGJ1bXBlZCAoc2VlIGNob29zZVN0YXJ0dXBDb25maWcpLCBhbmQgcmUtd3JpdGluZyBvdXJzIHdvdWxkIGZsaXAgdGhlIGJ1Y2tldCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSB0d29cbiAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oc3RhdGUuY29uZmlnKSA9PT0gZ2V0Q29uZmlnVmVyc2lvbihjb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb25maWcpICE9PSBKU09OLnN0cmluZ2lmeShjb25maWd1cmVkKSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZShDT05GSUdfV1JJVEVfUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZmFpbHVyZXMsIHRvdGFsIH0gPSBhd2FpdCB3cml0ZVJvdXRpbmdUb0FsbFN0b3Jlcyh7IGNvbmZpZ3VyZWQsIHNvdXJjZXM6IHN0YXRlLnNvdXJjZXMsIGRlYnVnTmFtZTogdGhpcy5jb25maWcuZGVidWdOYW1lKCkgfSk7XG4gICAgICAgIGlmIChmYWlsdXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBwZXJpb2RpYyByb3V0aW5nIGNvbmZpZyB3cml0ZSBmb3IgJHt0aGlzLmNvbmZpZy5kZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGNvbmZpZ3VyZWQpfSkgZmFpbGVkIG9uICR7ZmFpbHVyZXMubGVuZ3RofSBvZiAke3RvdGFsfSBzdG9yZXMgLSByZXRyeWluZyBpbiAke0NPTkZJR19XUklURV9SRVRSWV9JTlRFUlZBTCAvIDEwMDB9czogJHtmYWlsdXJlcy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZShDT05GSUdfV1JJVEVfUkVUUllfSU5URVJWQUwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGUoQ09ORklHX1dSSVRFX1JFRlJFU0hfSU5URVJWQUwpO1xuICAgIH1cbn1cbiJdfQ==
|
|
469
|
+
/* _JS_SOURCE_HASH = "345513ed712441e3375ce3ca46cdcecc33d5dca1ad899285ab99c7e5df90275c"; */
|