sliftutils 1.7.117 → 1.7.119

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.
@@ -269,8 +269,23 @@ class SourceWrapper {
269
269
  }
270
270
  return median;
271
271
  }
272
+ /** writeBlocked from missing backblaze credentials is re-checked on every write attempt: the secret load can fail TRANSIENTLY (early startup, a file-read hiccup), and one failed load must never permanently stop this process from writing to the bucket. The other writeBlocked reasons (read-only mode, browsers) are static properties of the process, so there is nothing to re-check. */
273
+ async recheckWriteBlocked() {
274
+ if (!this.writeBlocked || this.api || this.disposed)
275
+ return;
276
+ if (this.config.type !== "backblaze")
277
+ return;
278
+ if (!await hasBackblazeCreds())
279
+ return;
280
+ this.api = new backblaze_1.ArchivesBackblaze({ bucketName: (0, remoteConfig_1.parseBackblazeUrl)(this.config.url).bucketName, public: this.config.public, immutable: this.config.immutable, allowedOrigins: this.config.allowedOrigins });
281
+ console.log(`Backblaze credentials are now available for ${this.getDebugName()}, unblocking writes (was blocked: ${this.writeBlocked})`);
282
+ this.writeBlocked = undefined;
283
+ }
272
284
  /** Writes always go through the API, so a permission error throws to the caller on every write (and access granted in the meantime is picked up automatically). */
273
285
  async write(run) {
286
+ if (this.writeBlocked) {
287
+ await this.recheckWriteBlocked();
288
+ }
274
289
  if (this.writeBlocked) {
275
290
  throw new Error(`Writes are blocked on this source: ${this.writeBlocked}`);
276
291
  }
@@ -290,5 +305,5 @@ class SourceWrapper {
290
305
  }
291
306
  }
292
307
  exports.SourceWrapper = SourceWrapper;
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXdEO0FBQ3hELGtFQUErRTtBQUMvRSwyREFBcUQ7QUFDckQsb0RBQWlEO0FBRWpELGlEQUFxSDtBQUNySCxxREFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLDRDQUFpRDtBQUNqRCxxREFBc0Q7QUFFekMsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQUEsWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQywrSEFBK0g7QUFDL0gsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBRXhCLEtBQUssVUFBVSxpQkFBaUI7SUFDNUIsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNuRCxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxXQUFNLENBQUM7UUFDTCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0FBQ0wsQ0FBQztBQUVELHNqQkFBc2pCO0FBQ3RqQixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFvQjtJQUMzQixvRkFB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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUsIHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBmb3JtYXREYXRlVGltZURldGFpbGVkIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi8uLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBTb3VyY2VDb25maWcsIFJlbW90ZUNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0QnVja2V0QmFzZVVybCwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsLCBwYXJzZVJvdXRpbmdEYXRhIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IHNob3dDZXJ0VHJ1c3RNb2RhbCB9IGZyb20gXCIuL2NlcnRUcnVzdE1vZGFsXCI7XG5cbmV4cG9ydCBjb25zdCBSRVRSWV9TVEFSVF9ERUxBWSA9IDIgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IFJFVFJZX01BWF9ERUxBWSA9IDUgKiA2MCAqIDEwMDA7XG5leHBvcnQgY29uc3QgUkVUUllfR1JPV1RIID0gMS41O1xuY29uc3QgQUNDRVNTX1JFQ0hFQ0tfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5jb25zdCBTT1VSQ0VfRkFJTFVSRV9DT09MRE9XTiA9IDMwICogNjAgKiAxMDAwO1xuLy8gQWRkZWQgdG8gYSBkaXNjb25uZWN0ZWQgc291cmNlJ3MgbGF0ZW5jeTogaXQgc3RpbGwgc29ydHMgYW5kIGNhbiBzdGlsbCBiZSBwaWNrZWQsIGl0IGp1c3QgbGFuZHMgYWZ0ZXIgZXZlcnkgY29ubmVjdGVkIHNvdXJjZVxuY29uc3QgRElTQ09OTkVDVEVEX0xBVEVOQ1lfUEVOQUxUWSA9IDEwICogMTAwMDtcbmNvbnN0IFBJTkdfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5jb25zdCBQSU5HX0hJU1RPUlkgPSAxMDtcblxuYXN5bmMgZnVuY3Rpb24gaGFzQmFja2JsYXplQ3JlZHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgICAgIGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gT25lIHNvdXJjZSBvZiBhIFJlbW90ZUNvbmZpZywgYXMgYSB1c2FibGUgSUFyY2hpdmVzLiBSZWFkcyBmYWxsIGJhY2sgdG8gdGhlIHB1YmxpYy1VUkwgZm9ybSB3aGVuIHdlIGRvbid0IGhhdmUgQVBJIGFjY2Vzczsgd3JpdGVzIGFsd2F5cyBhdHRlbXB0IHRoZSBBUEkgKHNvIGFjY2VzcyBncmFudGVkIGxhdGVyIGlzIHBpY2tlZCB1cCBvbiB0aGUgbmV4dCB3cml0ZSkuIFdoZW4gYSBjYWxsIGZhaWxzIHdoaWxlIHRoZSBXZWJTb2NrZXQgaXMgZG93biwgbm90ZUZhaWx1cmUgc3RhcnRzIGEgYmFja2dyb3VuZCByZWNvbm5lY3QgbG9vcCB3aXRoIGEgcmFtcGluZyBkZWxheSAtIGl0IG5ldmVyIGJsb2NrcyBjYWxsZXJzLCBpdCBqdXN0IGtlZXBzIHRyeWluZyBzbyB0aGUgY29ubmVjdGlvbiBldmVudHVhbGx5IGNvbWVzIGJhY2suIFNvdXJjZXMgd2l0aG91dCBhIFdlYlNvY2tldCAoYmFja2JsYXplLCBVUkwtZm9ybSwgb3VyIG93biBsb2NhbCBzZXJ2ZXIpIHJlcG9ydCBhbHdheXMtY29ubmVjdGVkOiB0aGV5J3JlIGxhc3QtcmVzb3J0IHNvdXJjZXMgd2hlcmUgdGhyb3dpbmcgaXMgZmluZS5cbmV4cG9ydCBjbGFzcyBTb3VyY2VXcmFwcGVyIHtcbiAgICBwdWJsaWMgYXBpPzogSUFyY2hpdmVzO1xuICAgIHB1YmxpYyB1cmw/OiBBcmNoaXZlc1VybDtcbiAgICBwdWJsaWMgd3JpdGVCbG9ja2VkPzogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVtb3RlPzogQXJjaGl2ZXNSZW1vdGU7XG4gICAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVjb25uZWN0UnVubmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWNjZXNzQ2FjaGU/OiB7IGhhc0FjY2VzczogYm9vbGVhbjsgdGltZTogbnVtYmVyIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29uZmlnOiBTb3VyY2VDb25maWcsXG4gICAgICAgIC8vIGZhbHNlIGZvciBzaG9ydC1saXZlZCBwcm9iZSBpbnN0YW5jZXMsIHdoaWNoIG11c3QgbmV2ZXIgbGVhdmUgYSByZXRyeSBsb29wIGJlaGluZFxuICAgICAgICBwcml2YXRlIGJhY2tncm91bmQ6IGJvb2xlYW4sXG4gICAgKSB7IH1cblxuICAgIC8qKiBDb25maWcgdXBkYXRlcyByb3V0aW5lbHkganVzdCBtb3ZlIGEgc291cmNlJ3MgdmFsaWQgd2luZG93ICh0aGUgbGFzdCB3aW5kb3cgZXh0ZW5kcyBmb3JldmVyLCB0aGVuIGdldHMgcmVkdWNlZCB3aGVuIGEgbmV3IGVudHJ5IGlzIGFwcGVuZGVkKS4gVGhlIHdyYXBwZXIgc3Vydml2ZXMgdGhhdDogb25seSB0aGUgd2luZG93IGNoYW5nZXMsIGtlZXBpbmcgdGhlIGNvbm5lY3Rpb24sIHBpbmdzLCBhbmQgbGF0ZW5jeSBoaXN0b3J5LiAqL1xuICAgIHB1YmxpYyB1cGRhdGVWYWxpZFdpbmRvdyh2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICBsZXQgb2xkID0gdGhpcy5jb25maWcudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmIChvbGRbMF0gPT09IHZhbGlkV2luZG93WzBdICYmIG9sZFsxXSA9PT0gdmFsaWRXaW5kb3dbMV0pIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coYFZhbGlkIHdpbmRvdyBjaGFuZ2VkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBbJHtvbGQuam9pbihcIiwgXCIpfV0gLT4gWyR7dmFsaWRXaW5kb3cuam9pbihcIiwgXCIpfV1gKTtcbiAgICAgICAgdGhpcy5jb25maWcudmFsaWRXaW5kb3cgPSB2YWxpZFdpbmRvdztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShjb25maWc6IFNvdXJjZUNvbmZpZywgb3B0aW9ucz86IHsgYmFja2dyb3VuZD86IGJvb2xlYW47IHJlYWRPbmx5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxTb3VyY2VXcmFwcGVyPiB7XG4gICAgICAgIGxldCB3cmFwcGVyID0gbmV3IFNvdXJjZVdyYXBwZXIoY29uZmlnLCBvcHRpb25zPy5iYWNrZ3JvdW5kICE9PSBmYWxzZSk7XG4gICAgICAgIC8vIEEgcHVibGljIGJ1Y2tldCBzZXJ2ZXMgZXZlcnl0aGluZyB3ZSBjYW4gcmVhZCBvdmVyIHBsYWluIEhUVFBTIEdFVHMsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBvcGVuIGFuIEFQSSBjb25uZWN0aW9uICh3aGljaCBjb3N0cyBhIFdlYlNvY2tldCwgYW5kIGFuIGFjY2VzcyBncmFudCB3ZSBsaWtlbHkgZG9uJ3QgaGF2ZSkganVzdCB0byByZWFkIGl0XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWFkT25seSAmJiBjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgd3JhcHBlci51cmwgPSBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybChjb25maWcudXJsKSk7XG4gICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGAke2NvbmZpZy51cmx9IGlzIGJlaW5nIHJlYWQgaW4gcmVhZC1vbmx5IG1vZGUgKHB1YmxpYyBidWNrZXQsIGFuZCB3ZSBhcmUgbm90IGluIG5vZGUpLCBzbyBpdCBpcyBkb3dubG9hZGVkIG92ZXIgcGxhaW4gVVJMcyBhbmQgY2Fubm90IGJlIHdyaXR0ZW4uIFBhc3MgZGlyZWN0Q29ubmVjdCB0byBjcmVhdGVBcmNoaXZlcyB0byB1c2UgdGhlIEFQSSBpbnN0ZWFkLmA7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBoYXNCYWNrYmxhemVDcmVkcygpKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcGkgPSBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBwYXJzZUJhY2tibGF6ZVVybChjb25maWcudXJsKS5idWNrZXROYW1lLCBwdWJsaWM6IGNvbmZpZy5wdWJsaWMsIGltbXV0YWJsZTogY29uZmlnLmltbXV0YWJsZSwgYWxsb3dlZE9yaWdpbnM6IGNvbmZpZy5hbGxvd2VkT3JpZ2lucyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBObyBiYWNrYmxhemUgY3JlZGVudGlhbHMgZm9yICR7Y29uZmlnLnVybH0uIFByb3ZpZGUgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZCBhbmQgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXkgdmlhIGdldFNlY3JldCB0byBlbmFibGUgQVBJIGFjY2Vzcy5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBCcm93c2VycyBjYW5ub3Qgd3JpdGUgdG8gYmFja2JsYXplIChidWNrZXQgJHtjb25maWcudXJsfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3cmFwcGVyLmFwaSAmJiBjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIudXJsID0gbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwoY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBidWNrZXQgaG9zdGVkIGJ5IG91ciBvd24gcHJvY2VzcyBpcyByZWFjaGVkIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXI6IG92ZXIgdGhlIEFQSSwgdG8gb3VyIG93biBwb3J0XG4gICAgICAgIHdyYXBwZXIucmVtb3RlID0gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBjb25maWcudXJsLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSwgc291cmNlQ29uZmlnOiBjb25maWcgfSk7XG4gICAgICAgIHdyYXBwZXIuYXBpID0gd3JhcHBlci5yZW1vdGU7XG4gICAgICAgIGlmIChjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgd3JhcHBlci51cmwgPSBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybChjb25maWcudXJsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBUaGUgc2FtZSBVUkwgY2FuIGFwcGVhciBhcyBtdWx0aXBsZSBzb3VyY2VzIChkaWZmZXJlbnQgcm91dGVzIC8gdmFsaWQgd2luZG93cyksIHNvIHRoZSBkaXN0aW5ndWlzaGluZyBzbGljZSBpcyBwYXJ0IG9mIHRoZSBuYW1lXG4gICAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHJvdXRlID0gdGhpcy5jb25maWcucm91dGU7XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChgcm91dGUgWyR7cm91dGVbMF19LCAke3JvdXRlWzFdfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGhpcy5jb25maWcudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmIChzdGFydCAhPT0gMCB8fCBlbmQgIT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUZXh0ID0gc3RhcnQgPT09IDAgJiYgXCIwXCIgfHwgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChzdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kVGV4dCA9IGVuZCA9PT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgXCJmb3JldmVyXCIgfHwgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChlbmQpO1xuICAgICAgICAgICAgcGFydHMucHVzaChgdmFsaWRXaW5kb3cgWyR7c3RhcnRUZXh0fSwgJHtlbmRUZXh0fV1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYHNvdXJjZSAke3RoaXMuY29uZmlnLnVybH0ke3BhcnRzLmxlbmd0aCAmJiBgICgke3BhcnRzLmpvaW4oXCIsIFwiKX0pYCB8fCBcIlwifWA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMucmVtb3RlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlLmlzQ29ubmVjdGVkKCk7XG4gICAgfVxuXG4gICAgLyoqIEEgc291cmNlIHdob3NlIHdpbmRvdyBoYXMgcGFzc2VkIGlzIG5ldmVyIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIChzZWUgdGhlIHdpbmRvdyBjaGVja3MgaW4gQXJjaGl2ZXNDaGFpbiksIGFuZCBhbiBpbnRlcm1lZGlhdGUgb25seSBleGlzdHMgZm9yIHRoZSBtaW51dGVzIG9mIGEgZGVwbG95IHN3aXRjaG92ZXIgLSBvbiBlaXRoZXIsIGJlaW5nIHVucmVhY2hhYmxlIGlzIGV4cGVjdGVkLCBub3QgYSBwcm9ibGVtIHRvIHJlcG9ydC4gKi9cbiAgICBwcml2YXRlIGlzQ29ubmVjdGlvblByb2JsZW1Xb3J0aFJlcG9ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmludGVybWVkaWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcudmFsaWRXaW5kb3dbMV0gPiBEYXRlLm5vdygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29vbGRvd25VbnRpbCA9IDA7XG4gICAgLyoqIEEgc291cmNlIHRoYXQgZmFpbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZCBpcyBza2lwcGVkIGJ5IGNhbGxlcnMgZm9yIFNPVVJDRV9GQUlMVVJFX0NPT0xET1dOIC0gYnV0IG9ubHkgd2hpbGUgc29tZSBvdGhlciBzb3VyY2UgY2FuIHNlcnZlIHRoZSByZXF1ZXN0LiBXaGVuIG5vdGhpbmcgZWxzZSBpcyB1c2FibGUsIGNhbGxlcnMgaWdub3JlIHRoaXMgYW5kIHRyeSBpdCBhbnl3YXksIHNvIGEgdG90YWwgb3V0YWdlIHN0aWxsIHJldHJpZXMgZXZlcnkgdGltZS4gKi9cbiAgICBwdWJsaWMgaXNPbkNvb2xkb3duKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA8IHRoaXMuY29vbGRvd25VbnRpbDtcbiAgICB9XG5cbiAgICAvKiogQ2FsbCBhZnRlciBhIHJlcXVlc3QgZmFpbGVkIHdoaWxlIGlzQ29ubmVjdGVkKCkgd2FzIGZhbHNlOiBwdXRzIHRoZSBzb3VyY2Ugb24gY29vbGRvd24gYW5kIHN0YXJ0cyAoaWYgbm90IGFscmVhZHkgcnVubmluZykgdGhlIGJhY2tncm91bmQgcmVjb25uZWN0IGxvb3AuIE5ldmVyIGJsb2NrcyAtIHRoZSBmYWlsZWQgcmVxdWVzdCBzdGlsbCB0aHJvd3MuICovXG4gICAgcHVibGljIG5vdGVGYWlsdXJlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCB0aGlzLmlzQ29ubmVjdGVkKCkpIHJldHVybjtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgPj0gdGhpcy5jb29sZG93blVudGlsICYmIHRoaXMuaXNDb25uZWN0aW9uUHJvYmxlbVdvcnRoUmVwb3J0aW5nKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfTsgc2tpcHBpbmcgaXQgdW50aWwgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKG5vdyArIFNPVVJDRV9GQUlMVVJFX0NPT0xET1dOKX0gKG5vdyAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQobm93KX0pIHVubGVzcyBubyBvdGhlciBzb3VyY2UgY2FuIHNlcnZlIHRoZSByZXF1ZXN0YCk7XG4gICAgICAgICAgICAvLyBJbiBhIGJyb3dzZXIgdGhpcyBpcyBvZnRlbiBhbiB1bnRydXN0ZWQgKHNlbGYtc2lnbmVkKSBjZXJ0aWZpY2F0ZSB0aGUgdXNlciBoYXNuJ3QgYWNjZXB0ZWQgeWV0IC0gb2ZmZXIgdGhlbSB0aGUgdHJ1c3QgZmxvdyAoYSBuby1vcCBpbiBOb2RlLCBhbmQgc2hvd24gYXQgbW9zdCBvbmNlIHBlciBzZXJ2ZXIpXG4gICAgICAgICAgICBzaG93Q2VydFRydXN0TW9kYWwodGhpcy5jb25maWcudXJsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvb2xkb3duVW50aWwgPSBub3cgKyBTT1VSQ0VfRkFJTFVSRV9DT09MRE9XTjtcbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQgfHwgdGhpcy5yZWNvbm5lY3RSdW5uaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVjb25uZWN0UnVubmluZyA9IHRydWU7XG4gICAgICAgIHZvaWQgdGhpcy5yZWNvbm5lY3RMb29wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3RMb29wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmV0cnlEZWxheSA9IFJFVFJZX1NUQVJUX0RFTEFZO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkocmV0cnlEZWxheSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0UnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIGJyZWFrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBBbnkgY2FsbCByZS1lc3RhYmxpc2hlcyB0aGUgV2ViU29ja2V0OyB0aGUgcmVzdWx0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdGU/LmdldEluZm8oUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBFdmVuIGEgZmFpbGluZyBjYWxsIChlLmcuIGFjY2VzcyBkZW5pZWQpIHByb3ZlcyB0aGUgY29ubmVjdGlvbiBpcyBiYWNrXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0aW9uUHJvYmxlbVdvcnRoUmVwb3J0aW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSW4gdGhpcyBjYXNlLCBJJ20ganVzdCBzaG93aW5nIHRoZSBtZXNzYWdlIGJlY2F1c2UgdGhlIGNhbGwgc3RhY2sgaXMgYWxtb3N0IGFsd2F5cyBjb21wbGV0ZWx5IHVuaW50ZXJlc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHJldHJ5RGVsYXkgLyAxMDAwKX1zLiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgcmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29vbGRvd25VbnRpbCA9IDA7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGNsZWFyaW5nIGl0cyBjb29sZG93bmApO1xuICAgIH1cblxuICAgIC8vIEZvciBob3N0ZWQgc291cmNlczogY2FjaGVkIGFjY2VzcyBjaGVjaywgc28gcmVhZHMga25vdyB3aGV0aGVyIHRvIHVzZSB0aGUgQVBJIG9yIHRoZSBwdWJsaWMgVVJMIGZvcm0uIEFjY2Vzcywgb25jZSBzZWVuLCBpcyBhc3N1bWVkIHRvIHN0aWNrOyBuby1hY2Nlc3MgaXMgcmUtY2hlY2tlZCBwZXJpb2RpY2FsbHkgKHRoZSBjaGVjayBhbHNvIHJlZ2lzdGVycyBvdXIgYWNjZXNzIHJlcXVlc3Qgc2VydmVyLXNpZGUsIHdoaWNoIGxvZ3MgdGhlIGdyYW50IGxpbmspLlxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCByZW1vdGUgPSB0aGlzLnJlbW90ZTtcbiAgICAgICAgaWYgKCFyZW1vdGUpIHJldHVybiAhIXRoaXMuYXBpO1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5hY2Nlc3NDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlZCAmJiAoY2FjaGVkLmhhc0FjY2VzcyB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRpbWUgPCBBQ0NFU1NfUkVDSEVDS19JTlRFUlZBTCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQuaGFzQWNjZXNzO1xuICAgICAgICB9XG4gICAgICAgIGxldCB3YWl0aW5nID0gYXdhaXQgcmVtb3RlLndhaXRpbmdGb3JBY2Nlc3MoKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NDYWNoZSA9IHsgaGFzQWNjZXNzOiAhd2FpdGluZywgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICBpZiAod2FpdGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBObyBhY2Nlc3MgdG8gc3RvcmFnZSBhY2NvdW50IGZvciAke3RoaXMuY29uZmlnLnVybH0gKG91ciBtYWNoaW5lICR7d2FpdGluZy5tYWNoaW5lSWR9LCBpcCAke3dhaXRpbmcuaXB9KS4gUmVhZGluZyB2aWEgdGhlIHB1YmxpYyBVUkwgZm9ybSB3aGVyZSBwb3NzaWJsZS4gR3JhbnQgYWNjZXNzIGF0ICR7d2FpdGluZy5saW5rfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhd2FpdGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZDxUPihydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICh0aGlzLmFwaSAmJiBhd2FpdCB0aGlzLmNoZWNrQWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy5hcGkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLnVybCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXBpKSB7XG4gICAgICAgICAgICAvLyBObyBwdWJsaWMgVVJMIGZvcm0gLSBsZXQgdGhlIEFQSSBjYWxsIHRocm93IGl0cyBvd24gZXJyb3IgKHdoaWNoIGluY2x1ZGVzIHRoZSBhY2Nlc3MgaW5zdHJ1Y3Rpb25zIGZvciBob3N0ZWQgc291cmNlcylcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy5hcGkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIGhhcyBubyBBUEkgYWNjZXNzIGFuZCBubyBwdWJsaWMgVVJMIGZvcm0gKHB1YmxpYzogZmFsc2UpOiAke3RoaXMuY29uZmlnLnVybH1gKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLnJlYWQoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0KFJPVVRJTkdfRklMRSkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLndyaXRlQmxvY2tlZCB8fCAhdGhpcy5hcGkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpLmhhc1dyaXRlQWNjZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwaW5nczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHBpbmdUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgbG9nZ2VkQ29ubmVjdGVkID0gZmFsc2U7XG5cbiAgICAvKiogU3RhcnRzIG1lYXN1cmluZyB0aGlzIHNvdXJjZSdzIGxhdGVuY3ksIHdoaWNoIGRlY2lkZXMgd2hpY2ggaG9zdHMgcmVhZHMgYW5kIHZhcmlhYmxlLXNoYXJkIHdyaXRlcyBwcmVmZXIuIEhvc3RlZCByZW1vdGVzIHBpbmcgb3ZlciB0aGVpciBBUEkgY29ubmVjdGlvbjsgVVJMLW9ubHkgc291cmNlcyAocmVhZC1vbmx5IG1vZGUsIGJhY2tibGF6ZSB3aXRob3V0IGNyZWRlbnRpYWxzKSBwcm9iZSBvdmVyIHBsYWluIEhUVFBTIGluc3RlYWQgLSB0aGUgY2xpZW50IE5FRURTIHRoZWlyIGxhdGVuY3kgdG9vLCBvciBpdCBjYW5ub3QgcmFuayB0aGUgaG9zdHMgaXQgcmVhZHMgZnJvbS4gT3VyIG93biBsb2NhbCBzZXJ2ZXIgY291bnRzIGFzIDA7IG9ubHkgc291cmNlcyB3aXRoIG5laXRoZXIgZm9ybSBzdGF5IEluZmluaXR5LiAqL1xuICAgIHB1YmxpYyBzdGFydFBpbmdpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBpbmdUaW1lciB8fCB0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIC8vIEEgc291cmNlIHdob3NlIHdpbmRvdyBoYXMgcGFzc2VkIG5ldmVyIHJlY2VpdmVzIHJlYWRzIG9yIHdyaXRlcyAtIG1lYXN1cmluZyBpdCBpcyBwb2ludGxlc3MgdHJhZmZpY1xuICAgICAgICBpZiAodGhpcy5jb25maWcudmFsaWRXaW5kb3dbMV0gPD0gRGF0ZS5ub3coKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCByZW1vdGUgPSB0aGlzLnJlbW90ZTtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy51cmw7XG4gICAgICAgIGxldCBwcm9iZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgaWYgKHJlbW90ZSkge1xuICAgICAgICAgICAgcHJvYmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3RlLnBpbmcoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodXJsKSB7XG4gICAgICAgICAgICAvLyBBIDEtYnl0ZSByYW5nZWQgcmVhZCBvZiB0aGUgcm91dGluZyBmaWxlIHRyYW5zZmVycyBlc3NlbnRpYWxseSBub3RoaW5nLCBhbmQgdW5saWtlIGFuIGV4cGxpY2l0IE9QVElPTlMgcmVxdWVzdCBpdCBuZWVkcyBubyBDT1JTIHByZWZsaWdodCAoYmFja2JsYXplJ3MgQ09SUyBydWxlcyBvbmx5IGFsbG93IGRvd25sb2FkIG9wZXJhdGlvbnMpIC0gc28gaXQgd29ya3MgZnJvbSB0aGUgYnJvd3Nlciwgd2hpY2ggaXMgZXhhY3RseSB3aGVyZSBVUkwtb25seSBtb2RlIHJ1bnNcbiAgICAgICAgICAgIHByb2JlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHVybC5nZXRJbmZvKFJPVVRJTkdfRklMRSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtZWFzdXJlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcHJvYmUoKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHBpbmcgaXMgYWxzbyBvdXIgZWFybGllc3QgZG93bi1kZXRlY3Rpb25cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ2dlZENvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VkQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGVkIHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSAoJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBpbmdzLnB1c2goRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBpbmdzLmxlbmd0aCA+IFBJTkdfSElTVE9SWSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGluZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIHRoaXMucGluZ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIH0sIFBJTkdfSU5URVJWQUwpO1xuICAgICAgICAodGhpcy5waW5nVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cblxuICAgIC8qKiBTZWVkcyB0aGUgbGF0ZW5jeSBlc3RpbWF0ZSBiZWZvcmUgdGhlIGZpcnN0IHBpbmcgbGFuZHMgKGUuZy4gZnJvbSB0aGUgaW5pdGlhbCByb3V0aW5nIGZldGNoKSwgc28gdmFyaWFibGUtc2hhcmQgcGlja2luZyBoYXMgc29tZXRoaW5nIGltbWVkaWF0ZWx5LiBSZWFsIHBpbmdzIHRha2Ugb3ZlciBmcm9tIHRoZSBmaXJzdCBtZWFzdXJlbWVudCBvbi4gKi9cbiAgICBwdWJsaWMgc2VlZExhdGVuY3kobXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5waW5ncy5wdXNoKG1zKTtcbiAgICB9XG5cbiAgICAvKiogTWVkaWFuIG9mIHRoZSByZWNlbnQgcGluZ3MgKEFQSSBvciBVUkwtZm9ybSwgd2hpY2hldmVyIHRoaXMgc291cmNlIG1lYXN1cmVzKSwgcGx1cyBESVNDT05ORUNURURfTEFURU5DWV9QRU5BTFRZIHdoaWxlIHRoZSBzb3VyY2UgaXMgZGlzY29ubmVjdGVkIC0gc28gYSBkb3duIHNvdXJjZSBzdGlsbCBzb3J0cyBhbmQgY2FuIHN0aWxsIGJlIHBpY2tlZCwganVzdCBhZnRlciBldmVyeSBjb25uZWN0ZWQgb25lLiBTb3VyY2VzIHdpdGggbm8gbWVhc3VyZW1lbnRzIHlldCBzb3J0IGxhc3QgKEluZmluaXR5KSwgZXhjZXB0IG91ciBvd24gaW4tcHJvY2VzcyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBiZXN0IHBvc3NpYmxlIHRhcmdldCAoMCkuICovXG4gICAgcHVibGljIGdldExhdGVuY3koKTogbnVtYmVyIHtcbiAgICAgICAgLy8gT3VyIG93biBpbi1wcm9jZXNzIHNlcnZlcjogaG9zdGVkICh0eXBlIHJlbW90ZSksIGFwaSBwcmVzZW50LCBidXQgbm8gcmVtb3RlIGNvbm5lY3Rpb24gLSBpdCBJUyB1c1xuICAgICAgICBpZiAoIXRoaXMucmVtb3RlICYmIHRoaXMuY29uZmlnLnR5cGUgPT09IFwicmVtb3RlXCIgJiYgdGhpcy5hcGkpIHJldHVybiAwO1xuICAgICAgICBpZiAoIXRoaXMucGluZ3MubGVuZ3RoKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIGxldCBzb3J0ZWQgPSBbLi4udGhpcy5waW5nc107XG4gICAgICAgIHNvcnQoc29ydGVkLCB4ID0+IHgpO1xuICAgICAgICBsZXQgbWVkaWFuID0gc29ydGVkW01hdGguZmxvb3Ioc29ydGVkLmxlbmd0aCAvIDIpXTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtZWRpYW4gKyBESVNDT05ORUNURURfTEFURU5DWV9QRU5BTFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZWRpYW47XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBhbHdheXMgZ28gdGhyb3VnaCB0aGUgQVBJLCBzbyBhIHBlcm1pc3Npb24gZXJyb3IgdGhyb3dzIHRvIHRoZSBjYWxsZXIgb24gZXZlcnkgd3JpdGUgKGFuZCBhY2Nlc3MgZ3JhbnRlZCBpbiB0aGUgbWVhbnRpbWUgaXMgcGlja2VkIHVwIGF1dG9tYXRpY2FsbHkpLiAqL1xuICAgIHB1YmxpYyBhc3luYyB3cml0ZTxUPihydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICh0aGlzLndyaXRlQmxvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXcml0ZXMgYXJlIGJsb2NrZWQgb24gdGhpcyBzb3VyY2U6ICR7dGhpcy53cml0ZUJsb2NrZWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFwaSA9IHRoaXMuYXBpO1xuICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgaGFzIG5vIEFQSSBhY2Nlc3MsIHNvIGl0IGNhbm5vdCBhY2NlcHQgd3JpdGVzOiAke3RoaXMuY29uZmlnLnVybH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogdHJ1ZSwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
294
- /* _JS_SOURCE_HASH = "ca5787844c59a871ae9464bfa86bfbacd58762d9ee457fe72043b35a13a1cc22"; */
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXdEO0FBQ3hELGtFQUErRTtBQUMvRSwyREFBcUQ7QUFDckQsb0RBQWlEO0FBRWpELGlEQUFxSDtBQUNySCxxREFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLDRDQUFpRDtBQUNqRCxxREFBc0Q7QUFFekMsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQUEsWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQywrSEFBK0g7QUFDL0gsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBRXhCLEtBQUssVUFBVSxpQkFBaUI7SUFDNUIsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNuRCxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxXQUFNLENBQUM7UUFDTCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0FBQ0wsQ0FBQztBQUVELHNqQkFBc2pCO0FBQ3RqQixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFvQjtJQUMzQixvRkFB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QzFELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBL1FELHNDQStRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTm9kZSwgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uLy4uL21pc2MvZ2V0U2VjcmV0XCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIFNvdXJjZUNvbmZpZywgUmVtb3RlQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRCdWNrZXRCYXNlVXJsLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIHBhcnNlUm91dGluZ0RhdGEgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbmltcG9ydCB7IEFyY2hpdmVzVXJsIH0gZnJvbSBcIi4vQXJjaGl2ZXNVcmxcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgc2hvd0NlcnRUcnVzdE1vZGFsIH0gZnJvbSBcIi4vY2VydFRydXN0TW9kYWxcIjtcblxuZXhwb3J0IGNvbnN0IFJFVFJZX1NUQVJUX0RFTEFZID0gMiAqIDEwMDA7XG5leHBvcnQgY29uc3QgUkVUUllfTUFYX0RFTEFZID0gNSAqIDYwICogMTAwMDtcbmV4cG9ydCBjb25zdCBSRVRSWV9HUk9XVEggPSAxLjU7XG5jb25zdCBBQ0NFU1NfUkVDSEVDS19JTlRFUlZBTCA9IDYwICogMTAwMDtcbmNvbnN0IFNPVVJDRV9GQUlMVVJFX0NPT0xET1dOID0gMzAgKiA2MCAqIDEwMDA7XG4vLyBBZGRlZCB0byBhIGRpc2Nvbm5lY3RlZCBzb3VyY2UncyBsYXRlbmN5OiBpdCBzdGlsbCBzb3J0cyBhbmQgY2FuIHN0aWxsIGJlIHBpY2tlZCwgaXQganVzdCBsYW5kcyBhZnRlciBldmVyeSBjb25uZWN0ZWQgc291cmNlXG5jb25zdCBESVNDT05ORUNURURfTEFURU5DWV9QRU5BTFRZID0gMTAgKiAxMDAwO1xuY29uc3QgUElOR19JTlRFUlZBTCA9IDYwICogMTAwMDtcbmNvbnN0IFBJTkdfSElTVE9SWSA9IDEwO1xuXG5hc3luYyBmdW5jdGlvbiBoYXNCYWNrYmxhemVDcmVkcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBPbmUgc291cmNlIG9mIGEgUmVtb3RlQ29uZmlnLCBhcyBhIHVzYWJsZSBJQXJjaGl2ZXMuIFJlYWRzIGZhbGwgYmFjayB0byB0aGUgcHVibGljLVVSTCBmb3JtIHdoZW4gd2UgZG9uJ3QgaGF2ZSBBUEkgYWNjZXNzOyB3cml0ZXMgYWx3YXlzIGF0dGVtcHQgdGhlIEFQSSAoc28gYWNjZXNzIGdyYW50ZWQgbGF0ZXIgaXMgcGlja2VkIHVwIG9uIHRoZSBuZXh0IHdyaXRlKS4gV2hlbiBhIGNhbGwgZmFpbHMgd2hpbGUgdGhlIFdlYlNvY2tldCBpcyBkb3duLCBub3RlRmFpbHVyZSBzdGFydHMgYSBiYWNrZ3JvdW5kIHJlY29ubmVjdCBsb29wIHdpdGggYSByYW1waW5nIGRlbGF5IC0gaXQgbmV2ZXIgYmxvY2tzIGNhbGxlcnMsIGl0IGp1c3Qga2VlcHMgdHJ5aW5nIHNvIHRoZSBjb25uZWN0aW9uIGV2ZW50dWFsbHkgY29tZXMgYmFjay4gU291cmNlcyB3aXRob3V0IGEgV2ViU29ja2V0IChiYWNrYmxhemUsIFVSTC1mb3JtLCBvdXIgb3duIGxvY2FsIHNlcnZlcikgcmVwb3J0IGFsd2F5cy1jb25uZWN0ZWQ6IHRoZXkncmUgbGFzdC1yZXNvcnQgc291cmNlcyB3aGVyZSB0aHJvd2luZyBpcyBmaW5lLlxuZXhwb3J0IGNsYXNzIFNvdXJjZVdyYXBwZXIge1xuICAgIHB1YmxpYyBhcGk/OiBJQXJjaGl2ZXM7XG4gICAgcHVibGljIHVybD86IEFyY2hpdmVzVXJsO1xuICAgIHB1YmxpYyB3cml0ZUJsb2NrZWQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZW1vdGU/OiBBcmNoaXZlc1JlbW90ZTtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhY2Nlc3NDYWNoZT86IHsgaGFzQWNjZXNzOiBib29sZWFuOyB0aW1lOiBudW1iZXIgfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjb25maWc6IFNvdXJjZUNvbmZpZyxcbiAgICAgICAgLy8gZmFsc2UgZm9yIHNob3J0LWxpdmVkIHByb2JlIGluc3RhbmNlcywgd2hpY2ggbXVzdCBuZXZlciBsZWF2ZSBhIHJldHJ5IGxvb3AgYmVoaW5kXG4gICAgICAgIHByaXZhdGUgYmFja2dyb3VuZDogYm9vbGVhbixcbiAgICApIHsgfVxuXG4gICAgLyoqIENvbmZpZyB1cGRhdGVzIHJvdXRpbmVseSBqdXN0IG1vdmUgYSBzb3VyY2UncyB2YWxpZCB3aW5kb3cgKHRoZSBsYXN0IHdpbmRvdyBleHRlbmRzIGZvcmV2ZXIsIHRoZW4gZ2V0cyByZWR1Y2VkIHdoZW4gYSBuZXcgZW50cnkgaXMgYXBwZW5kZWQpLiBUaGUgd3JhcHBlciBzdXJ2aXZlcyB0aGF0OiBvbmx5IHRoZSB3aW5kb3cgY2hhbmdlcywga2VlcGluZyB0aGUgY29ubmVjdGlvbiwgcGluZ3MsIGFuZCBsYXRlbmN5IGhpc3RvcnkuICovXG4gICAgcHVibGljIHVwZGF0ZVZhbGlkV2luZG93KHZhbGlkV2luZG93OiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGxldCBvbGQgPSB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKG9sZFswXSA9PT0gdmFsaWRXaW5kb3dbMF0gJiYgb2xkWzFdID09PSB2YWxpZFdpbmRvd1sxXSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93IGNoYW5nZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IFske29sZC5qb2luKFwiLCBcIil9XSAtPiBbJHt2YWxpZFdpbmRvdy5qb2luKFwiLCBcIil9XWApO1xuICAgICAgICB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdyA9IHZhbGlkV2luZG93O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlKGNvbmZpZzogU291cmNlQ29uZmlnLCBvcHRpb25zPzogeyBiYWNrZ3JvdW5kPzogYm9vbGVhbjsgcmVhZE9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPFNvdXJjZVdyYXBwZXI+IHtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSBuZXcgU291cmNlV3JhcHBlcihjb25maWcsIG9wdGlvbnM/LmJhY2tncm91bmQgIT09IGZhbHNlKTtcbiAgICAgICAgLy8gQSBwdWJsaWMgYnVja2V0IHNlcnZlcyBldmVyeXRoaW5nIHdlIGNhbiByZWFkIG92ZXIgcGxhaW4gSFRUUFMgR0VUcywgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIG9wZW4gYW4gQVBJIGNvbm5lY3Rpb24gKHdoaWNoIGNvc3RzIGEgV2ViU29ja2V0LCBhbmQgYW4gYWNjZXNzIGdyYW50IHdlIGxpa2VseSBkb24ndCBoYXZlKSBqdXN0IHRvIHJlYWQgaXRcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlYWRPbmx5ICYmIGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3cmFwcGVyLnVybCA9IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKGNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgIHdyYXBwZXIud3JpdGVCbG9ja2VkID0gYCR7Y29uZmlnLnVybH0gaXMgYmVpbmcgcmVhZCBpbiByZWFkLW9ubHkgbW9kZSAocHVibGljIGJ1Y2tldCwgYW5kIHdlIGFyZSBub3QgaW4gbm9kZSksIHNvIGl0IGlzIGRvd25sb2FkZWQgb3ZlciBwbGFpbiBVUkxzIGFuZCBjYW5ub3QgYmUgd3JpdHRlbi4gUGFzcyBkaXJlY3RDb25uZWN0IHRvIGNyZWF0ZUFyY2hpdmVzIHRvIHVzZSB0aGUgQVBJIGluc3RlYWQuYDtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gXCJiYWNrYmxhemVcIikge1xuICAgICAgICAgICAgaWYgKGF3YWl0IGhhc0JhY2tibGF6ZUNyZWRzKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwaSA9IG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKGNvbmZpZy51cmwpLmJ1Y2tldE5hbWUsIHB1YmxpYzogY29uZmlnLnB1YmxpYywgaW1tdXRhYmxlOiBjb25maWcuaW1tdXRhYmxlLCBhbGxvd2VkT3JpZ2luczogY29uZmlnLmFsbG93ZWRPcmlnaW5zIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIud3JpdGVCbG9ja2VkID0gYE5vIGJhY2tibGF6ZSBjcmVkZW50aWFscyBmb3IgJHtjb25maWcudXJsfS4gUHJvdmlkZSBiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleUlkIGFuZCBiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleSB2aWEgZ2V0U2VjcmV0IHRvIGVuYWJsZSBBUEkgYWNjZXNzLmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIud3JpdGVCbG9ja2VkID0gYEJyb3dzZXJzIGNhbm5vdCB3cml0ZSB0byBiYWNrYmxhemUgKGJ1Y2tldCAke2NvbmZpZy51cmx9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXdyYXBwZXIuYXBpICYmIGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci51cmwgPSBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybChjb25maWcudXJsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGJ1Y2tldCBob3N0ZWQgYnkgb3VyIG93biBwcm9jZXNzIGlzIHJlYWNoZWQgdGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlcjogb3ZlciB0aGUgQVBJLCB0byBvdXIgb3duIHBvcnRcbiAgICAgICAgd3JhcHBlci5yZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IGNvbmZpZyB9KTtcbiAgICAgICAgd3JhcHBlci5hcGkgPSB3cmFwcGVyLnJlbW90ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3cmFwcGVyLnVybCA9IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKGNvbmZpZy51cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYXBwZWFyIGFzIG11bHRpcGxlIHNvdXJjZXMgKGRpZmZlcmVudCByb3V0ZXMgLyB2YWxpZCB3aW5kb3dzKSwgc28gdGhlIGRpc3Rpbmd1aXNoaW5nIHNsaWNlIGlzIHBhcnQgb2YgdGhlIG5hbWVcbiAgICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmNvbmZpZy5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGByb3V0ZSBbJHtyb3V0ZVswXX0sICR7cm91dGVbMV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKHN0YXJ0ICE9PSAwIHx8IGVuZCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRleHQgPSBzdGFydCA9PT0gMCAmJiBcIjBcIiB8fCBmb3JtYXREYXRlVGltZURldGFpbGVkKHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRUZXh0ID0gZW5kID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBcImZvcmV2ZXJcIiB8fCBmb3JtYXREYXRlVGltZURldGFpbGVkKGVuZCk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGB2YWxpZFdpbmRvdyBbJHtzdGFydFRleHR9LCAke2VuZFRleHR9XWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgc291cmNlICR7dGhpcy5jb25maWcudXJsfSR7cGFydHMubGVuZ3RoICYmIGAgKCR7cGFydHMuam9pbihcIiwgXCIpfSlgIHx8IFwiXCJ9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGUuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQSBzb3VyY2Ugd2hvc2Ugd2luZG93IGhhcyBwYXNzZWQgaXMgbmV2ZXIgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gKHNlZSB0aGUgd2luZG93IGNoZWNrcyBpbiBBcmNoaXZlc0NoYWluKSwgYW5kIGFuIGludGVybWVkaWF0ZSBvbmx5IGV4aXN0cyBmb3IgdGhlIG1pbnV0ZXMgb2YgYSBkZXBsb3kgc3dpdGNob3ZlciAtIG9uIGVpdGhlciwgYmVpbmcgdW5yZWFjaGFibGUgaXMgZXhwZWN0ZWQsIG5vdCBhIHByb2JsZW0gdG8gcmVwb3J0LiAqL1xuICAgIHByaXZhdGUgaXNDb25uZWN0aW9uUHJvYmxlbVdvcnRoUmVwb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW50ZXJtZWRpYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy52YWxpZFdpbmRvd1sxXSA+IERhdGUubm93KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb29sZG93blVudGlsID0gMDtcbiAgICAvKiogQSBzb3VyY2UgdGhhdCBmYWlsZWQgd2hpbGUgZGlzY29ubmVjdGVkIGlzIHNraXBwZWQgYnkgY2FsbGVycyBmb3IgU09VUkNFX0ZBSUxVUkVfQ09PTERPV04gLSBidXQgb25seSB3aGlsZSBzb21lIG90aGVyIHNvdXJjZSBjYW4gc2VydmUgdGhlIHJlcXVlc3QuIFdoZW4gbm90aGluZyBlbHNlIGlzIHVzYWJsZSwgY2FsbGVycyBpZ25vcmUgdGhpcyBhbmQgdHJ5IGl0IGFueXdheSwgc28gYSB0b3RhbCBvdXRhZ2Ugc3RpbGwgcmV0cmllcyBldmVyeSB0aW1lLiAqL1xuICAgIHB1YmxpYyBpc09uQ29vbGRvd24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDwgdGhpcy5jb29sZG93blVudGlsO1xuICAgIH1cblxuICAgIC8qKiBDYWxsIGFmdGVyIGEgcmVxdWVzdCBmYWlsZWQgd2hpbGUgaXNDb25uZWN0ZWQoKSB3YXMgZmFsc2U6IHB1dHMgdGhlIHNvdXJjZSBvbiBjb29sZG93biBhbmQgc3RhcnRzIChpZiBub3QgYWxyZWFkeSBydW5uaW5nKSB0aGUgYmFja2dyb3VuZCByZWNvbm5lY3QgbG9vcC4gTmV2ZXIgYmxvY2tzIC0gdGhlIGZhaWxlZCByZXF1ZXN0IHN0aWxsIHRocm93cy4gKi9cbiAgICBwdWJsaWMgbm90ZUZhaWx1cmUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkIHx8IHRoaXMuaXNDb25uZWN0ZWQoKSkgcmV0dXJuO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyA+PSB0aGlzLmNvb2xkb3duVW50aWwgJiYgdGhpcy5pc0Nvbm5lY3Rpb25Qcm9ibGVtV29ydGhSZXBvcnRpbmcoKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbm5lY3QgdG8gc3RvcmFnZSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OyBza2lwcGluZyBpdCB1bnRpbCAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQobm93ICsgU09VUkNFX0ZBSUxVUkVfQ09PTERPV04pfSAobm93ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChub3cpfSkgdW5sZXNzIG5vIG90aGVyIHNvdXJjZSBjYW4gc2VydmUgdGhlIHJlcXVlc3RgKTtcbiAgICAgICAgICAgIC8vIEluIGEgYnJvd3NlciB0aGlzIGlzIG9mdGVuIGFuIHVudHJ1c3RlZCAoc2VsZi1zaWduZWQpIGNlcnRpZmljYXRlIHRoZSB1c2VyIGhhc24ndCBhY2NlcHRlZCB5ZXQgLSBvZmZlciB0aGVtIHRoZSB0cnVzdCBmbG93IChhIG5vLW9wIGluIE5vZGUsIGFuZCBzaG93biBhdCBtb3N0IG9uY2UgcGVyIHNlcnZlcilcbiAgICAgICAgICAgIHNob3dDZXJ0VHJ1c3RNb2RhbCh0aGlzLmNvbmZpZy51cmwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29vbGRvd25VbnRpbCA9IG5vdyArIFNPVVJDRV9GQUlMVVJFX0NPT0xET1dOO1xuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZCB8fCB0aGlzLnJlY29ubmVjdFJ1bm5pbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdm9pZCB0aGlzLnJlY29ubmVjdExvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdExvb3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShyZXRyeURlbGF5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgYnJlYWs7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIEFueSBjYWxsIHJlLWVzdGFibGlzaGVzIHRoZSBXZWJTb2NrZXQ7IHRoZSByZXN1bHQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW90ZT8uZ2V0SW5mbyhST1VUSU5HX0ZJTEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV2ZW4gYSBmYWlsaW5nIGNhbGwgKGUuZy4gYWNjZXNzIGRlbmllZCkgcHJvdmVzIHRoZSBjb25uZWN0aW9uIGlzIGJhY2tcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3Rpb25Qcm9ibGVtV29ydGhSZXBvcnRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBJbiB0aGlzIGNhc2UsIEknbSBqdXN0IHNob3dpbmcgdGhlIG1lc3NhZ2UgYmVjYXVzZSB0aGUgY2FsbCBzdGFjayBpcyBhbG1vc3QgYWx3YXlzIGNvbXBsZXRlbHkgdW5pbnRlcmVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbm5lY3QgdG8gc3RvcmFnZSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCByZXRyeWluZyBpbiAke01hdGgucm91bmQocmV0cnlEZWxheSAvIDEwMDApfXMuICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2UgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXRyeURlbGF5ID0gTWF0aC5taW4oUkVUUllfTUFYX0RFTEFZLCByZXRyeURlbGF5ICogUkVUUllfR1JPV1RIKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb29sZG93blVudGlsID0gMDtcbiAgICAgICAgY29uc29sZS5sb2coYFJlY29ubmVjdGVkIHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgY2xlYXJpbmcgaXRzIGNvb2xkb3duYCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGhvc3RlZCBzb3VyY2VzOiBjYWNoZWQgYWNjZXNzIGNoZWNrLCBzbyByZWFkcyBrbm93IHdoZXRoZXIgdG8gdXNlIHRoZSBBUEkgb3IgdGhlIHB1YmxpYyBVUkwgZm9ybS4gQWNjZXNzLCBvbmNlIHNlZW4sIGlzIGFzc3VtZWQgdG8gc3RpY2s7IG5vLWFjY2VzcyBpcyByZS1jaGVja2VkIHBlcmlvZGljYWxseSAodGhlIGNoZWNrIGFsc28gcmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSwgd2hpY2ggbG9ncyB0aGUgZ3JhbnQgbGluaykuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0FjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHJlbW90ZSA9IHRoaXMucmVtb3RlO1xuICAgICAgICBpZiAoIXJlbW90ZSkgcmV0dXJuICEhdGhpcy5hcGk7XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLmFjY2Vzc0NhY2hlO1xuICAgICAgICBpZiAoY2FjaGVkICYmIChjYWNoZWQuaGFzQWNjZXNzIHx8IERhdGUubm93KCkgLSBjYWNoZWQudGltZSA8IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5oYXNBY2Nlc3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCByZW1vdGUud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICB0aGlzLmFjY2Vzc0NhY2hlID0geyBoYXNBY2Nlc3M6ICF3YWl0aW5nLCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgZm9yICR7dGhpcy5jb25maWcudXJsfSAob3VyIG1hY2hpbmUgJHt3YWl0aW5nLm1hY2hpbmVJZH0sIGlwICR7d2FpdGluZy5pcH0pLiBSZWFkaW5nIHZpYSB0aGUgcHVibGljIFVSTCBmb3JtIHdoZXJlIHBvc3NpYmxlLiBHcmFudCBhY2Nlc3MgYXQgJHt3YWl0aW5nLmxpbmt9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF3YWl0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBpICYmIGF3YWl0IHRoaXMuY2hlY2tBY2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRoaXMudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcGkpIHtcbiAgICAgICAgICAgIC8vIE5vIHB1YmxpYyBVUkwgZm9ybSAtIGxldCB0aGUgQVBJIGNhbGwgdGhyb3cgaXRzIG93biBlcnJvciAod2hpY2ggaW5jbHVkZXMgdGhlIGFjY2VzcyBpbnN0cnVjdGlvbnMgZm9yIGhvc3RlZCBzb3VyY2VzKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgaGFzIG5vIEFQSSBhY2Nlc3MgYW5kIG5vIHB1YmxpYyBVUkwgZm9ybSAocHVibGljOiBmYWxzZSk6ICR7dGhpcy5jb25maWcudXJsfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMucmVhZChhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXQoUk9VVElOR19GSUxFKSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmIHBhcnNlUm91dGluZ0RhdGEoZGF0YSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkIHx8ICF0aGlzLmFwaSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGkuaGFzV3JpdGVBY2Nlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgcGluZ1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBsb2dnZWRDb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgIC8qKiBTdGFydHMgbWVhc3VyaW5nIHRoaXMgc291cmNlJ3MgbGF0ZW5jeSwgd2hpY2ggZGVjaWRlcyB3aGljaCBob3N0cyByZWFkcyBhbmQgdmFyaWFibGUtc2hhcmQgd3JpdGVzIHByZWZlci4gSG9zdGVkIHJlbW90ZXMgcGluZyBvdmVyIHRoZWlyIEFQSSBjb25uZWN0aW9uOyBVUkwtb25seSBzb3VyY2VzIChyZWFkLW9ubHkgbW9kZSwgYmFja2JsYXplIHdpdGhvdXQgY3JlZGVudGlhbHMpIHByb2JlIG92ZXIgcGxhaW4gSFRUUFMgaW5zdGVhZCAtIHRoZSBjbGllbnQgTkVFRFMgdGhlaXIgbGF0ZW5jeSB0b28sIG9yIGl0IGNhbm5vdCByYW5rIHRoZSBob3N0cyBpdCByZWFkcyBmcm9tLiBPdXIgb3duIGxvY2FsIHNlcnZlciBjb3VudHMgYXMgMDsgb25seSBzb3VyY2VzIHdpdGggbmVpdGhlciBmb3JtIHN0YXkgSW5maW5pdHkuICovXG4gICAgcHVibGljIHN0YXJ0UGluZ2luZygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgLy8gQSBzb3VyY2Ugd2hvc2Ugd2luZG93IGhhcyBwYXNzZWQgbmV2ZXIgcmVjZWl2ZXMgcmVhZHMgb3Igd3JpdGVzIC0gbWVhc3VyaW5nIGl0IGlzIHBvaW50bGVzcyB0cmFmZmljXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy52YWxpZFdpbmRvd1sxXSA8PSBEYXRlLm5vdygpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlbW90ZSA9IHRoaXMucmVtb3RlO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnVybDtcbiAgICAgICAgbGV0IHByb2JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBpZiAocmVtb3RlKSB7XG4gICAgICAgICAgICBwcm9iZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZW1vdGUucGluZygpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh1cmwpIHtcbiAgICAgICAgICAgIC8vIEEgMS1ieXRlIHJhbmdlZCByZWFkIG9mIHRoZSByb3V0aW5nIGZpbGUgdHJhbnNmZXJzIGVzc2VudGlhbGx5IG5vdGhpbmcsIGFuZCB1bmxpa2UgYW4gZXhwbGljaXQgT1BUSU9OUyByZXF1ZXN0IGl0IG5lZWRzIG5vIENPUlMgcHJlZmxpZ2h0IChiYWNrYmxhemUncyBDT1JTIHJ1bGVzIG9ubHkgYWxsb3cgZG93bmxvYWQgb3BlcmF0aW9ucykgLSBzbyBpdCB3b3JrcyBmcm9tIHRoZSBicm93c2VyLCB3aGljaCBpcyBleGFjdGx5IHdoZXJlIFVSTC1vbmx5IG1vZGUgcnVuc1xuICAgICAgICAgICAgcHJvYmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdXJsLmdldEluZm8oUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lYXN1cmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBwcm9iZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSBmYWlsZWQgcGluZyBpcyBhbHNvIG91ciBlYXJsaWVzdCBkb3duLWRldGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nZ2VkQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZWRDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25uZWN0ZWQgdG8gc3RvcmFnZSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9ICgke0RhdGUubm93KCkgLSBzdGFydH1tcylgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGluZ3MucHVzaChEYXRlLm5vdygpIC0gc3RhcnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGluZ3MubGVuZ3RoID4gUElOR19ISVNUT1JZKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waW5ncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2b2lkIG1lYXN1cmUoKTtcbiAgICAgICAgdGhpcy5waW5nVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIG1lYXN1cmUoKTtcbiAgICAgICAgfSwgUElOR19JTlRFUlZBTCk7XG4gICAgICAgICh0aGlzLnBpbmdUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgLyoqIFNlZWRzIHRoZSBsYXRlbmN5IGVzdGltYXRlIGJlZm9yZSB0aGUgZmlyc3QgcGluZyBsYW5kcyAoZS5nLiBmcm9tIHRoZSBpbml0aWFsIHJvdXRpbmcgZmV0Y2gpLCBzbyB2YXJpYWJsZS1zaGFyZCBwaWNraW5nIGhhcyBzb21ldGhpbmcgaW1tZWRpYXRlbHkuIFJlYWwgcGluZ3MgdGFrZSBvdmVyIGZyb20gdGhlIGZpcnN0IG1lYXN1cmVtZW50IG9uLiAqL1xuICAgIHB1YmxpYyBzZWVkTGF0ZW5jeShtczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBpbmdzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBpbmdzLnB1c2gobXMpO1xuICAgIH1cblxuICAgIC8qKiBNZWRpYW4gb2YgdGhlIHJlY2VudCBwaW5ncyAoQVBJIG9yIFVSTC1mb3JtLCB3aGljaGV2ZXIgdGhpcyBzb3VyY2UgbWVhc3VyZXMpLCBwbHVzIERJU0NPTk5FQ1RFRF9MQVRFTkNZX1BFTkFMVFkgd2hpbGUgdGhlIHNvdXJjZSBpcyBkaXNjb25uZWN0ZWQgLSBzbyBhIGRvd24gc291cmNlIHN0aWxsIHNvcnRzIGFuZCBjYW4gc3RpbGwgYmUgcGlja2VkLCBqdXN0IGFmdGVyIGV2ZXJ5IGNvbm5lY3RlZCBvbmUuIFNvdXJjZXMgd2l0aCBubyBtZWFzdXJlbWVudHMgeWV0IHNvcnQgbGFzdCAoSW5maW5pdHkpLCBleGNlcHQgb3VyIG93biBpbi1wcm9jZXNzIHNlcnZlciwgd2hpY2ggaXMgdGhlIGJlc3QgcG9zc2libGUgdGFyZ2V0ICgwKS4gKi9cbiAgICBwdWJsaWMgZ2V0TGF0ZW5jeSgpOiBudW1iZXIge1xuICAgICAgICAvLyBPdXIgb3duIGluLXByb2Nlc3Mgc2VydmVyOiBob3N0ZWQgKHR5cGUgcmVtb3RlKSwgYXBpIHByZXNlbnQsIGJ1dCBubyByZW1vdGUgY29ubmVjdGlvbiAtIGl0IElTIHVzXG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUgJiYgdGhpcy5jb25maWcudHlwZSA9PT0gXCJyZW1vdGVcIiAmJiB0aGlzLmFwaSkgcmV0dXJuIDA7XG4gICAgICAgIGlmICghdGhpcy5waW5ncy5sZW5ndGgpIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgbGV0IHNvcnRlZCA9IFsuLi50aGlzLnBpbmdzXTtcbiAgICAgICAgc29ydChzb3J0ZWQsIHggPT4geCk7XG4gICAgICAgIGxldCBtZWRpYW4gPSBzb3J0ZWRbTWF0aC5mbG9vcihzb3J0ZWQubGVuZ3RoIC8gMildO1xuICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1lZGlhbiArIERJU0NPTk5FQ1RFRF9MQVRFTkNZX1BFTkFMVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lZGlhbjtcbiAgICB9XG5cbiAgICAvKiogd3JpdGVCbG9ja2VkIGZyb20gbWlzc2luZyBiYWNrYmxhemUgY3JlZGVudGlhbHMgaXMgcmUtY2hlY2tlZCBvbiBldmVyeSB3cml0ZSBhdHRlbXB0OiB0aGUgc2VjcmV0IGxvYWQgY2FuIGZhaWwgVFJBTlNJRU5UTFkgKGVhcmx5IHN0YXJ0dXAsIGEgZmlsZS1yZWFkIGhpY2N1cCksIGFuZCBvbmUgZmFpbGVkIGxvYWQgbXVzdCBuZXZlciBwZXJtYW5lbnRseSBzdG9wIHRoaXMgcHJvY2VzcyBmcm9tIHdyaXRpbmcgdG8gdGhlIGJ1Y2tldC4gVGhlIG90aGVyIHdyaXRlQmxvY2tlZCByZWFzb25zIChyZWFkLW9ubHkgbW9kZSwgYnJvd3NlcnMpIGFyZSBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgcHJvY2Vzcywgc28gdGhlcmUgaXMgbm90aGluZyB0byByZS1jaGVjay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVjaGVja1dyaXRlQmxvY2tlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLndyaXRlQmxvY2tlZCB8fCB0aGlzLmFwaSB8fCB0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy50eXBlICE9PSBcImJhY2tibGF6ZVwiKSByZXR1cm47XG4gICAgICAgIGlmICghYXdhaXQgaGFzQmFja2JsYXplQ3JlZHMoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFwaSA9IG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKHRoaXMuY29uZmlnLnVybCkuYnVja2V0TmFtZSwgcHVibGljOiB0aGlzLmNvbmZpZy5wdWJsaWMsIGltbXV0YWJsZTogdGhpcy5jb25maWcuaW1tdXRhYmxlLCBhbGxvd2VkT3JpZ2luczogdGhpcy5jb25maWcuYWxsb3dlZE9yaWdpbnMgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBCYWNrYmxhemUgY3JlZGVudGlhbHMgYXJlIG5vdyBhdmFpbGFibGUgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHVuYmxvY2tpbmcgd3JpdGVzICh3YXMgYmxvY2tlZDogJHt0aGlzLndyaXRlQmxvY2tlZH0pYCk7XG4gICAgICAgIHRoaXMud3JpdGVCbG9ja2VkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBXcml0ZXMgYWx3YXlzIGdvIHRocm91Z2ggdGhlIEFQSSwgc28gYSBwZXJtaXNzaW9uIGVycm9yIHRocm93cyB0byB0aGUgY2FsbGVyIG9uIGV2ZXJ5IHdyaXRlIChhbmQgYWNjZXNzIGdyYW50ZWQgaW4gdGhlIG1lYW50aW1lIGlzIHBpY2tlZCB1cCBhdXRvbWF0aWNhbGx5KS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGU8VD4ocnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAodGhpcy53cml0ZUJsb2NrZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja1dyaXRlQmxvY2tlZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlQmxvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXcml0ZXMgYXJlIGJsb2NrZWQgb24gdGhpcyBzb3VyY2U6ICR7dGhpcy53cml0ZUJsb2NrZWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFwaSA9IHRoaXMuYXBpO1xuICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgaGFzIG5vIEFQSSBhY2Nlc3MsIHNvIGl0IGNhbm5vdCBhY2NlcHQgd3JpdGVzOiAke3RoaXMuY29uZmlnLnVybH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogdHJ1ZSwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
309
+ /* _JS_SOURCE_HASH = "be8265db0161e724610b9f986dc2a2f94a673fc11954432ffdc09789c77cb2a4"; */
@@ -192,6 +192,9 @@ async function writeRoutingConfig(account, bucketName, name, data, config) {
192
192
  (0, serverConfig_1.assertWritesAllowed)();
193
193
  let store = getStore(account, bucketName, name);
194
194
  let incoming = (0, remoteConfig_1.parseRoutingData)(data);
195
+ if (!incoming) {
196
+ throw new Error(`Routing config write rejected - not a parseable config. The data written for ${account}/${bucketName} (store ${JSON.stringify(name)}) is not a valid { version?, sources: [...] } JSON config (${data.length} bytes)`);
197
+ }
195
198
  let current = await (0, bucketDisk_1.readRoutingFromDisk)(account, bucketName);
196
199
  let stored = (0, intermediateManagement_1.reinjectIntermediates)(current, incoming);
197
200
  let storedData = Buffer.from((0, remoteConfig_1.serializeRemoteConfig)(stored));
@@ -283,5 +286,5 @@ async function debugListAccountBuckets(account) {
283
286
  }
284
287
  }
285
288
  exports.debugListAccountBuckets = debugListAccountBuckets;
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUl4QyxpREFBd0c7QUFDeEcsaURBQXNFO0FBQ3RFLDJEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsNkNBQXFEO0FBQ3JELDZDQUFrSjtBQUNsSixxRUFBdUY7QUFDdkYsbUVBQWdFO0FBQ2hFLHVFQUFvRTtBQUNwRSwyQ0FBMkM7QUFDM0MsK0NBQXFHO0FBQ3JHLCtDQUE0QztBQUU1Qzs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUM1QywrTUFBK007QUFDL00sTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFFL0QsU0FBZ0IsUUFBUSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLElBQVksRUFBRSxZQUFxQjtJQUM3Riw4R0FBOEc7SUFDOUcsSUFBQSxrQ0FBcUIsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFBLDRCQUFlLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxJQUFJLFVBQVUsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNHLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO1FBQ3BDLG1FQUFtRTtRQUNuRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FB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VSxDQUFDLENBQUM7SUFDaEgsQ0FBQztBQUNMLENBQUM7QUFyQ0QsMERBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmxvYlN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgU291cmNlQ29uZmlnLCBJQXJjaGl2ZXMsIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIG5vcm1hbGl6ZVNvdXJjZSB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmVTb3VyY2UsIGFwcGx5U291cmNlQ29uZmlnIH0gZnJvbSBcIi4vc3RvcmVTb3VyY2VzXCI7XG5pbXBvcnQgeyBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBhc3NlcnRXcml0ZXNBbGxvd2VkIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZFNvdXJjZU5hbWUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZXRCdWNrZXRGb2xkZXIsIGxpc3RBY2NvdW50U3RvcmVGb2xkZXJzLCBsaXN0QnVja2V0U3RvcmVGb2xkZXJzLCByZWFkUm91dGluZ0Zyb21EaXNrLCBnZXREaXNrSW5mbywgQnVja2V0RGlza0luZm8gfSBmcm9tIFwiLi9idWNrZXREaXNrXCI7XG5pbXBvcnQgeyBzY2hlZHVsZUJvdW5kYXJ5V29yaywgcmVpbmplY3RJbnRlcm1lZGlhdGVzIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlTWFuYWdlbWVudFwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50Q29udHJvbGxlciB9IGZyb20gXCIuL3N0b3JhZ2VDbGllbnRDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBpc1NlbGZTb3VyY2UgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcbmltcG9ydCB7IGNvdW50QnVja2V0V3JpdGUsIGdldEJ1Y2tldFdyaXRlU3RhdHMsIHRyYWNrQWNjZXNzLCBCdWNrZXRXcml0ZVN0YXRzIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGxvZ011dGF0aW9uIH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcblxuLyoqXG4gKiBXaGF0IHRoaXMgc2VydmVyIEhBUzogdGhlIHN0b3JlcywgYnkgbmFtZSAoZ2V0U3RvcmUpIC0gbWFkZSBvbmNlLCBzZWxmLWNvbmZpZ3VyaW5nIGZyb20gdGhlcmUgLVxuICogYW5kIHRoZSB0aHJlZSBlbnRyeSBwb2ludHMgYSByZXF1ZXN0IHJlc29sdmVzIHRocm91Z2ggKGZpbmRCdWNrZXRTdG9yZSwgcmVhZEJ1Y2tldEludGVybmFsLFxuICogd3JpdGVSb3V0aW5nQ29uZmlnKS4gVGhlcmUgaXMgbm8gY2FjaGVkIGJ1Y2tldCBzdGF0ZTogYSBidWNrZXQgaXMgbm90aGluZyBidXQgdGhlIHN0b3JlcyB3aG9zZVxuICogZm9sZGVycyBzaGFyZSBpdHMgbmFtZSwgbGlzdGVkIG9mZiB0aGUgZGlzayB3aGVuIHNvbWV0aGluZyBnZW51aW5lbHkgbmVlZHMgYWxsIG9mIHRoZW0uXG4gKi9cblxuLyoqXG4gKiBFdmVyeSBzdG9yZSB0aGlzIHByb2Nlc3MgcnVucywgYnkgZm9sZGVyIC0gd2hpY2ggSVMgdGhlIHN0b3JlJ3MgaWRlbnRpdHk6IGFjY291bnQsIG5hbWUsIGJ1Y2tldC5cbiAqIEEgc3RvcmUgaXMgbWFkZSBvbmNlLCBjb25maWd1cmVzIGl0c2VsZiBmcm9tIHRoZSByb3V0aW5nIGNvbmZpZyBpdCBob2xkcywgYW5kIHN0YXlzOyBub3RoaW5nIGhlcmVcbiAqIGRlY2lkZXMgd2hhdCBpdCBpcywgb25seSB0aGF0IGl0IGV4aXN0cy5cbiAqL1xuY29uc3Qgc3RvcmVzID0gbmV3IE1hcDxzdHJpbmcsIEJsb2JTdG9yZT4oKTtcbi8vIFRoZSBvcGVuZWQgc3RvcmVzIG9mIGVhY2ggYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGJ5IG5hbWUgLSB3aGljaCBidWNrZXRzIGFyZSBBQ1RJVkUgKHNvbWV0aGluZyB0b3VjaGVkIHRoZW0pLCBmb3IgZGVwbG95IGhhbmRvZmZzIGFuZCB0aGUgZGVidWcgcGFnZXMuIFB1cmVseSBhIHJlZ2lzdHJ5IG9mIHdoYXQgZ2V0U3RvcmUgYWxyZWFkeSBtYWRlLlxuY29uc3QgYWN0aXZlU3RvcmVzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIEJsb2JTdG9yZT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgbmFtZTogc3RyaW5nLCBjYWxsZXJOb2RlSWQ/OiBzdHJpbmcpOiBCbG9iU3RvcmUge1xuICAgIC8vIFRoZSBvbmUgcGxhY2UgYSBuYW1lIGJlY29tZXMgYSBmb2xkZXIsIHNvIHRoZSBvbmUgcGxhY2UgaXQgaXMgdmFsaWRhdGVkIChpdCBjYW4gY29tZSBzdHJhaWdodCBvZmYgdGhlIHdpcmUpXG4gICAgYXNzZXJ0VmFsaWRTb3VyY2VOYW1lKG5hbWUpO1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIobmFtZSwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IGV4aXN0aW5nID0gc3RvcmVzLmdldChmb2xkZXIpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnNvbGUubG9nKGBPcGVuaW5nIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IG9mIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKGZvbGRlciAke2ZvbGRlcn0pYCk7XG4gICAgbGV0IHN0b3JlID0gbmV3IEJsb2JTdG9yZShmb2xkZXIsIG5hbWUsIHtcbiAgICAgICAgLy8gV2hpY2ggZW50cmllcyBpbiBJVFMgcm91dGluZyBjb25maWcgYXJlIHRoaXMgc2VydmVyJ3MgY29weSBvZiBpdFxuICAgICAgICBpc1NlbGY6IHNvdXJjZSA9PiBpc1NlbGZTb3VyY2Uoc291cmNlLCBhY2NvdW50LCBidWNrZXROYW1lKSxcbiAgICAgICAgY3JlYXRlU291cmNlOiBjb25maWcgPT4gY3JlYXRlU3RvcmVTb3VyY2UoeyBzb3VyY2VDb25maWc6IGNvbmZpZy5zb3VyY2VDb25maWcsIGZvbGRlciwgd3JpdGVEZWxheTogY29uZmlnLndyaXRlRGVsYXkgfSksXG4gICAgICAgIGFwcGx5U291cmNlOiAoc291cmNlLCBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkpID0+IGFwcGx5U291cmNlQ29uZmlnKHNvdXJjZSwgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5KSxcbiAgICAgICAgb25Xcml0ZUNvdW50ZWQ6IChraW5kLCBieXRlcykgPT4gY291bnRCdWNrZXRXcml0ZShgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCwga2luZCwgYnl0ZXMpLFxuICAgICAgICBvblN5bmNUcmFuc2ZlcjogKG9wZXJhdGlvbiwgcGF0aCwgYnl0ZXMpID0+IHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke3BhdGh9YCwgc2l6ZTogYnl0ZXMgfSk7XG4gICAgICAgICAgICAvLyBFdmVyeSBzeW5jaHJvbml6YXRpb24gd3JpdGUgaXMgbG9nZ2VkIHBlciBmaWxlLCBleGFjdGx5IGxpa2UgY2xpZW50IG11dGF0aW9ucyAtIHRoZSBsb2cgaXMgdGhlIGZ1bGwgYWNjb3VudCBvZiB3aGF0IG1vdmVkXG4gICAgICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBvcGVyYXRpb24sIGFjY291bnQsIGJ1Y2tldE5hbWUsIHN0b3JlOiBuYW1lLCBwYXRoLCBzaXplOiBieXRlcyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVNvdXJjZVVybDogcmVzb2x2ZVNvdXJjZUFyY2hpdmVzLFxuICAgICAgICAvLyBUaGUgc3RvcmUgaXMgdGhlIG9uZSB0aGF0IGtub3dzIHdoZW4gYSBjb25maWcgbGFuZGVkLCBhbmQgYSBjb25maWcgd2l0aCB1cGNvbWluZyB3aW5kb3dzIGlzIHdoYXQgYm91bmRhcnkgc2NhbnMgYXJlIGFybWVkIGZyb21cbiAgICAgICAgb25Sb3V0aW5nQXBwbGllZDogcm91dGluZyA9PiBzY2hlZHVsZUJvdW5kYXJ5V29yayhhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKSxcbiAgICAgICAgLy8gVGhlIHN0b3JlIHdhcyBjcmVhdGVkIGJ5IHRoaXMgY2FsbGVyJ3MgcmVxdWVzdCwgc28gdGhlIGNhbGxlciBrbm93cyBleGFjdGx5IHdoYXQgY29uZmlnIGl0IGludGVuZGVkIGZvciB0aGlzIG5hbWUgLSB0aGUgc3RvcmUgYXNrcyBpdCB3aGVuIGl0cyBvd24gZm9sZGVyIGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gKHNlZSBCbG9iU3RvcmUuaW5pdClcbiAgICAgICAgcmVxdWVzdFJvdXRpbmdDb25maWc6IGNhbGxlck5vZGVJZCAmJiAoYXN5bmMgKCkgPT4gYXdhaXQgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIubm9kZXNbY2FsbGVyTm9kZUlkXS5nZXRSb3V0aW5nQ29uZmlnRm9yTmFtZSh7IGFjY291bnQsIGJ1Y2tldE5hbWUsIG5hbWUgfSkpIHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzdG9yZXMuc2V0KGZvbGRlciwgc3RvcmUpO1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgYnlOYW1lID0gYWN0aXZlU3RvcmVzLmdldChrZXkpO1xuICAgIGlmICghYnlOYW1lKSB7XG4gICAgICAgIGJ5TmFtZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgYWN0aXZlU3RvcmVzLnNldChrZXksIGJ5TmFtZSk7XG4gICAgfVxuICAgIGJ5TmFtZS5zZXQobmFtZSwgc3RvcmUpO1xuICAgIC8vIExhenkgaW5pdCB3b3VsZCBsZWF2ZSBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgc2l0dGluZyBpbmVydCAtIG5vIGluZGV4IGxvYWRlZCwgbm8gY29uZmlnIGFwcGxpZWQsIG5vdGhpbmcgc3luY2hyb25pemluZyAtIHdoaWxlIGl0cyBmb2xkZXIgaXMgZnVsbCBvZiBmaWxlc1xuICAgIHZvaWQgc3RvcmUuaW5pdCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgSW5pdGlhbGl6aW5nIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IG9mIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgcmV0dXJuIHN0b3JlO1xufVxuXG4vKiogVGhlIHN0b3JlIHNlcnZpbmcgYSByZXF1ZXN0OiB0aGUgb25lIHRoZSBjbGllbnQncyBzZWxlY3RlZCBlbnRyeSBOQU1FUy4gQWNjb3VudCwgbmFtZSwgYW5kIGJ1Y2tldCBBUkUgdGhlIGZvbGRlciwgc28gdGhpcyBpcyBhIGRpcmVjdCBsb29rdXAsIG5ldmVyIGEgc2VhcmNoIG9mIHdoYXQgZXhpc3RzIC0gYW5kIGEgbmFtZSB0aGlzIHNlcnZlciBoYXMgbmV2ZXIgc2VlbiBpcyBDUkVBVEVELCBuZXZlciByZWplY3RlZCwgYmVjYXVzZSBhc2tpbmcgZm9yIGEgbmFtZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gaGF2ZSB0aGF0IHN0b3JlIChvbmUgbmFtZSwgb25lIGZvbGRlciwgb25lIGluZGV4OyBpdCBjb25maWd1cmVzIGl0c2VsZiBvbmNlIHRoZSByb3V0aW5nIGNvbmZpZyBsYW5kcyBpbiBpdCkuIE5vdGhpbmcgZWxzZSBhYm91dCB0aGUgcmVxdWVzdCBpcyBjb21wYXJlZCAtIG5vdCB0aGUgd2luZG93LCBub3QgdGhlIHJvdXRlLCBub3QgdGhlIGZsYWdzIC0gd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIG5hbWluZyBpdDogYSBjbGllbnQgYSBjb25maWcgdmVyc2lvbiBiZWhpbmQgb24gc29tZSBmbGFnIHN0aWxsIHJlYWNoZXMgdGhlIHJpZ2h0IHN0b3JlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRCdWNrZXRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQpOiBCbG9iU3RvcmUge1xuICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVtb3RlIHNvdXJjZSBjb25maWd1cmF0aW9uIHdhcyBwcm92aWRlZCBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogZXZlcnkgcmVxdWVzdCBtdXN0IHNheSB3aGljaCBjb25maWd1cmVkIHNvdXJjZSBpdCBzZWxlY3RlZGApO1xuICAgIH1cbiAgICAvLyBUaGUgY2FsbGVyJ3MgaWQsIHNvIGEgc3RvcmUgdGhpcyByZXF1ZXN0IENSRUFURVMgY2FuIGFzayB0aGF0IGNhbGxlciBmb3IgdGhlIGNvbmZpZyBpdCBpbnRlbmRlZCAoYSBzdG9yZSBvbmx5IGV2ZXIgZXhpc3RzIGJlY2F1c2UgYSBjb25maWcgbmFtZXMgaXQsIGFuZCB0aGUgcmVxdWVzdGVyIGhvbGRzIHRoYXQgY29uZmlnKVxuICAgIGxldCBjYWxsZXJOb2RlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgICBjYWxsZXJOb2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKT8ubm9kZUlkO1xuICAgIH0gY2F0Y2ggeyB9XG4gICAgcmV0dXJuIGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHNvdXJjZUNvbmZpZy5uYW1lLCBjYWxsZXJOb2RlSWQpO1xufVxuXG4vKiogVGhlIHN0b3JlcyBvZiBhIGJ1Y2tldCBhcyB0aGUgRElTSyByZWNvcmRzIHRoZW0gKGEgYnVja2V0IGlzIG5vdGhpbmcgbW9yZSB0aGFuIHRoZSBzdG9yZSBmb2xkZXJzIHNoYXJpbmcgaXRzIG5hbWUpLCBvcGVuZWQgLSBzbyB0aGUgb25lcyB0aGF0IHdlcmVuJ3QgcnVubmluZyB5ZXQgc3RhcnQgc3luY2hyb25pemluZy4gRW1wdHkgd2hlbiB0aGUgYnVja2V0IGRvZXMgbm90IGV4aXN0IGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0U3RvcmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgc3RvcmU6IEJsb2JTdG9yZSB9W10+IHtcbiAgICBsZXQgZm9sZGVycyA9IGF3YWl0IGxpc3RCdWNrZXRTdG9yZUZvbGRlcnMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgcmV0dXJuIGZvbGRlcnMubWFwKHggPT4gKHsgbmFtZTogeC5uYW1lLCBzdG9yZTogZ2V0U3RvcmUoYWNjb3VudCwgYnVja2V0TmFtZSwgeC5uYW1lKSB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBzdG9yZTogQmxvYlN0b3JlIH1bXT4ge1xuICAgIGxldCBsaXN0ID0gYXdhaXQgZ2V0QnVja2V0U3RvcmVzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBzZXJ2ZXI6ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfS4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZHMgc2tpcCBzdG9yZSBzZWxlY3Rpb24gZW50aXJlbHk6IHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSB3aG9zZSBpbmRleCBzYXlzIHRoaXMgTUFDSElORSBob2xkcyB0aGUgYnl0ZXMgLSB0aGUgcGVyc2lzdGVkIGhvbGRlciBpZGVudGl0eSBpcyBqdXN0IGEgVVJMLCB3aGljaCBjYW5ub3QgbmFtZSBhIHN0b3JlLiBXaGljaGV2ZXIgc3RvcmUncyBmb2xkZXIgaGFzIHRoZSBuZXdlc3QgY29weSBhbnN3ZXJzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWNrZXRJbnRlcm5hbChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXQyKHsgcGF0aDogY29uZmlnLnBhdGgsIHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMsIGludGVybmFsOiB0cnVlIH0pKSk7XG4gICAgbGV0IGJlc3Q6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAoIWJlc3QgfHwgcmVzdWx0LndyaXRlVGltZSA+IGJlc3Qud3JpdGVUaW1lKSkge1xuICAgICAgICAgICAgYmVzdCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzOiBCbG9iU3RvcmVbXSwgcm91dGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkKTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBpbmRleCA9IHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfTtcbiAgICBsZXQgbWFya2VkSW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH0gPSB7IGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH07XG4gICAgbGV0IGluZGV4U291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBzeW5jaW5nOiBTeW5jQWN0aXZpdHlbXSA9IFtdO1xuICAgIGxldCByZWFkZXJEaXNrTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBzdG9yZSBvZiBidWNrZXRTdG9yZXMpIHtcbiAgICAgICAgbGV0IHByb2dyZXNzID0gc3RvcmUuZ2V0U3luY1Byb2dyZXNzKCk7XG4gICAgICAgIGluZGV4LmZpbGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5maWxlQ291bnQ7XG4gICAgICAgIGluZGV4LmJ5dGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5ieXRlQ291bnQ7XG4gICAgICAgIG1hcmtlZEluZGV4LmZpbGVDb3VudCArPSBwcm9ncmVzcy5tYXJrZWQuZmlsZUNvdW50O1xuICAgICAgICBtYXJrZWRJbmRleC5ieXRlQ291bnQgKz0gcHJvZ3Jlc3MubWFya2VkLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKHByb2dyZXNzLm1hcmtlZC5vbGRlc3REZWxldGVUaW1lICE9PSB1bmRlZmluZWQgJiYgKG1hcmtlZEluZGV4Lm9sZGVzdERlbGV0ZVRpbWUgPT09IHVuZGVmaW5lZCB8fCBwcm9ncmVzcy5tYXJrZWQub2xkZXN0RGVsZXRlVGltZSA8IG1hcmtlZEluZGV4Lm9sZGVzdERlbGV0ZVRpbWUpKSB7XG4gICAgICAgICAgICBtYXJrZWRJbmRleC5vbGRlc3REZWxldGVUaW1lID0gcHJvZ3Jlc3MubWFya2VkLm9sZGVzdERlbGV0ZVRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhTb3VyY2VzLnB1c2goLi4ucHJvZ3Jlc3Muc291cmNlcyk7XG4gICAgICAgIHN5bmNpbmcucHVzaCguLi5wcm9ncmVzcy5zeW5jaW5nKTtcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0ID0gcmVhZGVyRGlza0xpbWl0IHx8IHByb2dyZXNzLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gRXZlcnkgc3RvcmUgaXMgaW5kZXgtYmFja2VkLCBzbyB0aGUgY2hhbmdlIGZlZWQgaXMgYWx3YXlzIG5hdGl2ZVxuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSxcbiAgICAgICAgcmVtb3RlQ29uZmlnOiByb3V0aW5nLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgbWFya2VkSW5kZXgsXG4gICAgICAgIGluZGV4U291cmNlcyxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0LFxuICAgICAgICBzeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCdWNrZXRBcmNoaXZlc0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUFyY2hpdmVzQ29uZmlnKGJ1Y2tldFN0b3Jlcy5tYXAoeCA9PiB4LnN0b3JlKSwgcm91dGluZyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWNrZXRTeW5jU3RhdHVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXRTeW5jU3RhdHVzKCkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlYnVnQnVja2V0SW5kZXhUb3RhbHMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgdG90YWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0U3RvcmVzLm1hcChzID0+IHMuc3RvcmUuY29tcHV0ZUluZGV4VG90YWxzKCkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5maWxlQ291bnQsIDApLFxuICAgICAgICBieXRlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5ieXRlQ291bnQsIDApLFxuICAgICAgICBzb3VyY2VzOiB0b3RhbHMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuY29uc3QgcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBJQXJjaGl2ZXM+KCk7XG4vKiogQSBjYWNoZWQgSUFyY2hpdmVzIGZvciBhIHBlcnNpc3RlZCBzb3VyY2UgaWRlbnRpdHk6IGEgcm91dGluZyBVUkwgKGhvc3RlZC9iYWNrYmxhemUpIG9yIGEgZGlzayBmb2xkZXIgcGF0aCAtIHRoZSBmb3JtIEJsb2JTdG9yZSdzIHNvdXJjZXMgbGlzdCBzdG9yZXMuIENvbmZpZ3VyYXRpb24gKHZhbGlkIHdpbmRvd3MsIHJvdXRlcykgZGVjaWRlcyBXSEVOIGEgc291cmNlIHNob3VsZCBiZSB1c2VkOyBmb3IgcmVhZGluZyBieXRlcyB0aGUgaW5kZXggc2F5cyBhIHNvdXJjZSBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2ggLSBldmVuIGZvciBzb3VyY2VzIG5vIGxvbmdlciBpbiBhbnkgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb3VyY2VBcmNoaXZlcyh1cmw6IHN0cmluZyk6IElBcmNoaXZlcyB7XG4gICAgbGV0IGV4aXN0aW5nID0gcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcy5nZXQodXJsKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgLy8gVGhlIGNvbmZpZyBpcyBmYWJyaWNhdGVkIGZyb20gdGhlIGJhcmUgVVJMIGFuZCBjYW4gbmV2ZXIgZXhhY3QtbWF0Y2ggYSBzZXJ2ZXIncyBlbnRyaWVzIC0gd2hpY2ggaXMgZmluZSwgYmVjYXVzZSBob2xkZXIgcmVhZHMgYXJlIGludGVybmFsIHJlYWRzLCBhbmQgaW50ZXJuYWwgcmVhZHMgbmV2ZXIgc2VsZWN0IGEgc3RvcmUgKHNlZSByZWFkQnVja2V0SW50ZXJuYWwpXG4gICAgICAgIHNvdXJjZUNvbmZpZyA9IG5vcm1hbGl6ZVNvdXJjZSh1cmwpO1xuICAgIH1cbiAgICBsZXQgYXJjaGl2ZXMgPSBjcmVhdGVTdG9yZVNvdXJjZSh7IHNvdXJjZUNvbmZpZywgZm9sZGVyOiB1cmwgfSk7XG4gICAgcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcy5zZXQodXJsLCBhcmNoaXZlcyk7XG4gICAgcmV0dXJuIGFyY2hpdmVzO1xufVxuXG4vKipcbiAqIFdyaXRpbmcgdGhlIHJvdXRpbmcgY29uZmlnIGlzIGEgd3JpdGUgbGlrZSBhbnkgb3RoZXI6IGl0IGdvZXMgaW50byBhIHN0b3JlLCBhbmQgdGhlIHN0b3JlIGFwcGxpZXNcbiAqIGl0IHRvIGl0c2VsZiBhbmQgbGV0cyBpdHMgcGVlcnMgcHVsbCBpdC4gVGhlIG9ubHkgdGhpbmcgdGhhdCBoYXBwZW5zIGhlcmUgaXMgcGlja2luZyBXSElDSCBzdG9yZSxcbiAqIGJlY2F1c2UgdGhlIHdyaXRlciBuYW1lcyBhIHNvdXJjZSBhbmQgYSBzb3VyY2UgbmFtZXMgYSBzdG9yZS5cbiAqXG4gKiBJbi1mbGlnaHQgc3dpdGNob3ZlciB3aW5kb3dzIGFyZSByZS1pbmplY3RlZCBmaXJzdCAoc2VlIGludGVybWVkaWF0ZU1hbmFnZW1lbnQpOiBhbiBvcGVyYXRvcidzXG4gKiBjb25maWcga25vd3Mgbm90aGluZyBhYm91dCBhIHN3aXRjaG92ZXIgdGhhdCBpcyBoYXBwZW5pbmcgcmlnaHQgbm93LCBhbmQgd3JpdGluZyBpdCBhcy1pcyB3b3VsZFxuICogY2FuY2VsIGl0IG1pZC1mbGlnaHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgIGxldCBzdG9yZSA9IGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIG5hbWUpO1xuICAgIGxldCBpbmNvbWluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgbGV0IGN1cnJlbnQgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBzdG9yZWQgPSByZWluamVjdEludGVybWVkaWF0ZXMoY3VycmVudCwgaW5jb21pbmcpO1xuICAgIGxldCBzdG9yZWREYXRhID0gQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHN0b3JlZCkpO1xuICAgIGF3YWl0IHN0b3JlLnNldCh7IHBhdGg6IFJPVVRJTkdfRklMRSwgZGF0YTogc3RvcmVkRGF0YSwgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBsb2dNdXRhdGlvbih7IG9wOiBcInJvdXRpbmdDb25maWdcIiwgYWNjb3VudCwgYnVja2V0TmFtZSwgc3RvcmU6IG5hbWUsIHBhdGg6IFJPVVRJTkdfRklMRSwgc2l6ZTogc3RvcmVkRGF0YS5sZW5ndGgsIHdyaXRlVGltZTogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuLyoqIFdoaWNoIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGN1cnJlbnRseSBoYXMgYWN0aXZlIChzb21lIHN0b3JlIG9mIHRoZWlycyB3YXMgb3BlbmVkKSAtIHdoYXQgYSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciwgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbLi4uYWN0aXZlU3RvcmVzLmtleXMoKV0ubWFwKGtleSA9PiB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgcmV0dXJuIHsgYWNjb3VudDoga2V5LnNsaWNlKDAsIHNsYXNoKSwgYnVja2V0TmFtZToga2V5LnNsaWNlKHNsYXNoICsgMSkgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHRoZSBuZXdlc3QgY29weSBhbW9uZyBpdHMgc3RvcmVzLiBBYnNlbnQgd2hlbiBub25lIG9mIHRoZW0gaGFzIG9uZSB5ZXQuICovXG4gICAgcm91dGluZz86IFJlbW90ZUNvbmZpZztcbiAgICBjb25maWc6IEFyY2hpdmVzQ29uZmlnO1xufTtcblxuLyoqIFRoZSBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJ1Y2tldC4gUmV0dXJucyBhbiBlcnJvciBzdHJpbmcgd2hlbiB0aGUgYnVja2V0IGlzIG5vdCBhY3RpdmUgaGVyZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBidWNrZXQgbm90aGluZyBoYXMgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWJ1Z0dldEFjdGl2ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgb3BlbmVkID0gYWN0aXZlU3RvcmVzLmdldChrZXkpO1xuICAgIGlmICghb3BlbmVkIHx8ICFvcGVuZWQuc2l6ZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gaXMgbm90IGFjdGl2ZSBvbiB0aGlzIHNlcnZlciAoYSBidWNrZXQgYWN0aXZhdGVzIG9uIGZpcnN0IGFjY2VzcylgO1xuICAgIH1cbiAgICBsZXQgYnVja2V0U3RvcmVzID0gWy4uLm9wZW5lZC52YWx1ZXMoKV07XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiB7IGZvbGRlcjogYnVja2V0U3RvcmVzWzBdLmZvbGRlciwgcm91dGluZywgY29uZmlnOiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhidWNrZXRTdG9yZXMsIHJvdXRpbmcpIH07XG59XG5cbi8qKiBMb2FkcyBldmVyeSBzdG9yZSBvZiBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlcidzIGRpc2sgaW50byBtZW1vcnksIHdoaWNoIHN0YXJ0cyB0aGVpciBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIHRoZSBidWNrZXQncyBzdGF0ZS4gTm90aGluZyBpcyB3cml0dGVuIGFuZCBubyBvdGhlciBzZXJ2ZXIgaXMgY29udGFjdGVkIC0gdW5saWtlIGJ1aWxkaW5nIGFuIEFyY2hpdmVzQ2hhaW4gZm9yIGl0LCB3aGljaCB3b3VsZCBwcm9iZSBldmVyeSBzb3VyY2UgYW5kIGNvdWxkIHdyaXRlIHRoZSByb3V0aW5nIGNvbmZpZy4gQWxyZWFkeS1hY3RpdmUgYnVja2V0cyBqdXN0IHJldHVybiB0aGVpciBzdGF0ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgd2FzQWN0aXZlID0gYWN0aXZlU3RvcmVzLmhhcyhrZXkpO1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCBnZXRCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFidWNrZXRTdG9yZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciAoaXQgaGFzIG5vIHN0b3JlIGZvbGRlcnMgdW5kZXIgJHtnZXRCdWNrZXRGb2xkZXIoXCI8bmFtZT5cIiwgYWNjb3VudCwgYnVja2V0TmFtZSl9KWA7XG4gICAgfVxuICAgIC8vIFdhaXQgZm9yIHRoZSBpbmRleGVzIHRvIGxvYWQsIHNvIHRoZSB0b3RhbHMgd2UgcmV0dXJuIGFyZSB0aGUgcmVhbCBvbmVzIHJhdGhlciB0aGFuIHplcm9lcyBmcm9tIHN0b3JlcyB0aGF0IGhhdmUgbm90IHJlYWQgdGhlaXIgaW5kZXggeWV0LiBUaGUgc291cmNlIHNjYW5zIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICBmb3IgKGxldCBzIG9mIGJ1Y2tldFN0b3Jlcykge1xuICAgICAgICBhd2FpdCBzLnN0b3JlLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKCF3YXNBY3RpdmUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFjdGl2YXRlZCBidWNrZXQgJHtrZXl9IG9uIHJlcXVlc3Q6IGl0cyAke2J1Y2tldFN0b3Jlcy5sZW5ndGh9IHN0b3JlKHMpIGFyZSBub3cgbG9hZGVkIGFuZCBzeW5jaHJvbml6aW5nYCk7XG4gICAgfVxuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICByZXR1cm4geyBmb2xkZXI6IGJ1Y2tldFN0b3Jlc1swXS5zdG9yZS5mb2xkZXIsIHJvdXRpbmcsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzLm1hcCh4ID0+IHguc3RvcmUpLCByb3V0aW5nKSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVidWdMaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIC8vIFRoZSBkaXNrIGlzIHRoZSByZWNvcmQ6IGEgYnVja2V0IGV4aXN0cyBoZXJlIHdoZW4gaXQgaGFzIGF0IGxlYXN0IG9uZSBzdG9yZSBmb2xkZXIsIGFuZCBzZXZlcmFsIG5hbWVzIGZvciBvbmUgYnVja2V0IGFyZSBzdGlsbCBvbmUgYnVja2V0XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QWNjb3VudFN0b3JlRm9sZGVycyhhY2NvdW50KTtcbiAgICBsZXQgYnlCdWNrZXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAobGV0IHN0b3JlIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGJ5QnVja2V0LmhhcyhzdG9yZS5idWNrZXROYW1lKSkgY29udGludWU7XG4gICAgICAgIGJ5QnVja2V0LnNldChzdG9yZS5idWNrZXROYW1lLCBzdG9yZS5mb2xkZXIpO1xuICAgIH1cbiAgICBsZXQgbmFtZXMgPSBbLi4uYnlCdWNrZXQua2V5cygpXTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGJ5QnVja2V0LmdldChidWNrZXROYW1lKSB8fCBcIlwiO1xuICAgICAgICAgICAgbGV0IGJhc2U6IFNlcnZlckJ1Y2tldEluZm8gPSB7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogYWN0aXZlU3RvcmVzLmhhcyhrZXkpLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGJhc2UuZGlzayA9IGF3YWl0IGdldERpc2tJbmZvKGZvbGRlcikuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFzZS5kaXNrRXJyb3IgPSBTdHJpbmcoZS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3BlbmVkID0gWy4uLihhY3RpdmVTdG9yZXMuZ2V0KGtleSk/LnZhbHVlcygpIHx8IFtdKV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcob3BlbmVkLCByb3V0aW5nKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IGBObyByb3V0aW5nIGZpbGUgKCR7Uk9VVElOR19GSUxFfSkgaW4gYW55IG9mIGl0cyBzdG9yZXNgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHJvdXRpbmcgfSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cygke2FjY291bnR9KSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIGZvciAke25hbWVzLmxlbmd0aH0gYnVja2V0c2ApO1xuICAgIH1cbn1cbiJdfQ==
287
- /* _JS_SOURCE_HASH = "15d94e2b7215ed9a80484c7fbd6cbaf7cff06581788f48a5b4b32ec0c9ba8f59"; */
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUl4QyxpREFBd0c7QUFDeEcsaURBQXNFO0FBQ3RFLDJEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsNkNBQXFEO0FBQ3JELDZDQUFrSjtBQUNsSixxRUFBdUY7QUFDdkYsbUVBQWdFO0FBQ2hFLHVFQUFvRTtBQUNwRSwyQ0FBMkM7QUFDM0MsK0NBQXFHO0FBQ3JHLCtDQUE0QztBQUU1Qzs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUM1QywrTUFBK007QUFDL00sTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFFL0QsU0FBZ0IsUUFBUSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLElBQVksRUFBRSxZQUFxQjtJQUM3Riw4R0FBOEc7SUFDOUcsSUFBQSxrQ0FBcUIsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFBLDRCQUFlLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxJQUFJLFVBQVUsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNHLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO1FBQ3BDLG1FQUFtRTtRQUNuRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLHdCQUFZLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDM0QsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSxnQ0FBaUIsRUFBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZILFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFBLGdDQUFpQixFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO1FBQ3RHLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUEsOEJBQWdCLEVBQUMsR0FBRyxPQUFPLElBQUksVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUMxRixjQUFjLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUEseUJBQVcsRUFBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLDRIQUE0SDtZQUM1SCxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELGdCQUFnQixFQUFFLHFCQUFxQjtRQUN2QyxpSUFBaUk7UUFDakksZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDZDQUFvQixFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO1FBQy9FLHdNQUF3TTtRQUN4TSxvQkFBb0IsRUFBRSxZQUFZLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0saURBQXVCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUztLQUM1SyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQixJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QixrS0FBa0s7SUFDbEssS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsV0FBQyxPQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxJQUFJLFVBQVUsWUFBWSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7SUFDOUosT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQW5DRCw0QkFtQ0M7QUFFRCxtbUJBQW1tQjtBQUNubUIsU0FBZ0IsZUFBZSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLFlBQXNDOztJQUN2RyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsT0FBTyxJQUFJLFVBQVUsOERBQThELENBQUMsQ0FBQztJQUNuSyxDQUFDO0lBQ0QsNExBQTRMO0lBQzVMLElBQUksWUFBZ0MsQ0FBQztJQUNyQyxJQUFJLENBQUM7UUFDRCxZQUFZLEdBQUcsTUFBQSwrQkFBYyxDQUFDLFNBQVMsRUFBRSwwQ0FBRSxNQUFNLENBQUM7SUFDdEQsQ0FBQztJQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7SUFDWCxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQVZELDBDQVVDO0FBRUQsd09BQXdPO0FBQ2pPLEtBQUssVUFBVSxlQUFlLENBQUMsT0FBZSxFQUFFLFVBQWtCO0lBQ3JFLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBQSxtQ0FBc0IsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUhELDBDQUdDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNsRSxJQUFJLElBQUksR0FBRyxNQUFNLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLE9BQU8sSUFBSSxVQUFVLGlDQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNqSyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELCtRQUErUTtBQUN4USxLQUFLLFVBQVUsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsTUFBNkY7SUFDdkssSUFBSSxZQUFZLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsSUFBSSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUssSUFBSSxJQUFtRSxDQUFDO0lBQ3hFLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUksR0FBRyxNQUFNLENBQUM7UUFDbEIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBVkQsZ0RBVUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLFlBQXlCLEVBQUUsT0FBaUM7SUFDekYsSUFBSSxLQUFLLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMzQyxJQUFJLFdBQVcsR0FBd0UsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN0SCxJQUFJLFlBQVksR0FBa0UsRUFBRSxDQUFDO0lBQ3JGLElBQUksT0FBTyxHQUFtQixFQUFFLENBQUM7SUFDakMsSUFBSSxlQUFtQyxDQUFDO0lBQ3hDLEtBQUssSUFBSSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDNUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUM1QyxXQUFXLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25ELFdBQVcsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDbkQsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3BLLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ3BFLENBQUM7UUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsZUFBZSxHQUFHLGVBQWUsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPO1FBQ0gsbUVBQW1FO1FBQ25FLG9CQUFvQixFQUFFLElBQUk7UUFDMUIsWUFBWSxFQUFFLE9BQU87UUFDckIsS0FBSztRQUNMLFdBQVc7UUFDWCxZQUFZO1FBQ1osZUFBZTtRQUNmLE9BQU87S0FDVixDQUFDO0FBQ04sQ0FBQztBQUVNLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDN0UsSUFBSSxZQUFZLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsSUFBSSxPQUFPLEdBQUcsTUFBTSxJQUFBLGdDQUFtQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RCxPQUFPLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUpELDBEQUlDO0FBRU0sS0FBSyxVQUFVLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUN0RSxJQUFJLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNsRSxJQUFJLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ3pELFNBQVMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztLQUM1QyxDQUFDO0FBQ04sQ0FBQztBQVJELDRDQVFDO0FBRU0sS0FBSyxVQUFVLHNCQUFzQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUM1RSxJQUFJLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNsRSxJQUFJLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsT0FBTztRQUNILFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFELFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztLQUMxQyxDQUFDO0FBQ04sQ0FBQztBQVJELHdEQVFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUM1RCw4VkFBOFY7QUFDOVYsU0FBZ0IscUJBQXFCLENBQUMsR0FBVztJQUM3QyxJQUFJLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0MsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsSUFBSSxZQUFzQyxDQUFDO0lBQzNDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzdCLHFOQUFxTjtRQUNyTixZQUFZLEdBQUcsSUFBQSw4QkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFBLGdDQUFpQixFQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQVhELHNEQVdDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLElBQVksRUFBRSxNQUFrQztJQUN4SSxJQUFBLGtDQUFtQixHQUFFLENBQUM7SUFDdEIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsSUFBSSxRQUFRLEdBQUcsSUFBQSwrQkFBZ0IsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixPQUFPLElBQUksVUFBVSxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxJQUFJLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQztJQUM1TyxDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsTUFBTSxJQUFBLGdDQUFtQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RCxJQUFJLE1BQU0sR0FBRyxJQUFBLDhDQUFxQixFQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUEsb0NBQXFCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RCxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsMkJBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUM5RixJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsMkJBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDckosSUFBQSwyQ0FBdUIsR0FBRSxDQUFDO0FBQzlCLENBQUM7QUFiRCxnREFhQztBQUVELDBNQUEwTTtBQUMxTSxTQUFnQixtQkFBbUI7SUFDL0IsT0FBTyxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3RDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFMRCxrREFLQztBQXNCRCw2S0FBNks7QUFDdEssS0FBSyxVQUFVLG9CQUFvQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUMxRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxVQUFVLEdBQUcsb0VBQW9FLENBQUM7SUFDN0YsQ0FBQztJQUNELElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4QyxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUEsZ0NBQW1CLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQy9HLENBQUM7QUFURCxvREFTQztBQUVELDJYQUEyWDtBQUNwWCxLQUFLLFVBQVUsY0FBYyxDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNwRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksWUFBWSxHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sVUFBVSxHQUFHLGlFQUFpRSxJQUFBLDRCQUFlLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzNJLENBQUM7SUFDRCw4TEFBOEw7SUFDOUwsS0FBSyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLFlBQVksQ0FBQyxNQUFNLDRDQUE0QyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLE1BQU0sSUFBQSxnQ0FBbUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUN2SSxDQUFDO0FBaEJELHdDQWdCQztBQUVNLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxPQUFlO0lBQ3pELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2Qiw0SUFBNEk7SUFDNUksSUFBSSxPQUFPLEdBQUcsTUFBTSxJQUFBLG9DQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFBRSxTQUFTO1FBQzdDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUM7UUFDRCxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxVQUFVLEVBQUMsRUFBRTs7WUFDbEQsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUMsSUFBSSxJQUFJLEdBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ25GLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFBLHdCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUU7O2dCQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sU0FBUyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFBLGlDQUFtQixFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQztnQkFDRCxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUEsZ0NBQW1CLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDZCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLE1BQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsMENBQUUsTUFBTSxFQUFFLEtBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDMUQsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDekUsQ0FBQztnQkFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsMkJBQVksd0JBQXdCLEVBQUUsQ0FBQztnQkFDeEYsQ0FBQztnQkFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDMUQsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBQyxDQUFXLENBQUMsS0FBSyxtQ0FBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0UsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO1lBQVMsQ0FBQztRQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLE9BQU8sVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxVQUFVLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7QUFDTCxDQUFDO0FBckNELDBEQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2JTdG9yZSB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVDb25maWcsIFNvdXJjZUNvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTeW5jQWN0aXZpdHksXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGNyZWF0ZVN0b3JlU291cmNlLCBhcHBseVNvdXJjZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlU291cmNlc1wiO1xuaW1wb3J0IHsgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRTb3VyY2VOYW1lIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0QnVja2V0Rm9sZGVyLCBsaXN0QWNjb3VudFN0b3JlRm9sZGVycywgbGlzdEJ1Y2tldFN0b3JlRm9sZGVycywgcmVhZFJvdXRpbmdGcm9tRGlzaywgZ2V0RGlza0luZm8sIEJ1Y2tldERpc2tJbmZvIH0gZnJvbSBcIi4vYnVja2V0RGlza1wiO1xuaW1wb3J0IHsgc2NoZWR1bGVCb3VuZGFyeVdvcmssIHJlaW5qZWN0SW50ZXJtZWRpYXRlcyB9IGZyb20gXCIuL2ludGVybWVkaWF0ZU1hbmFnZW1lbnRcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ2xpZW50Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgaXNTZWxmU291cmNlIH0gZnJvbSBcIi4vc3RvcmVQbGFuXCI7XG5pbXBvcnQgeyBjb3VudEJ1Y2tldFdyaXRlLCBnZXRCdWNrZXRXcml0ZVN0YXRzLCB0cmFja0FjY2VzcywgQnVja2V0V3JpdGVTdGF0cyB9IGZyb20gXCIuL2FjY2Vzc1N0YXRzXCI7XG5pbXBvcnQgeyBsb2dNdXRhdGlvbiB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5cbi8qKlxuICogV2hhdCB0aGlzIHNlcnZlciBIQVM6IHRoZSBzdG9yZXMsIGJ5IG5hbWUgKGdldFN0b3JlKSAtIG1hZGUgb25jZSwgc2VsZi1jb25maWd1cmluZyBmcm9tIHRoZXJlIC1cbiAqIGFuZCB0aGUgdGhyZWUgZW50cnkgcG9pbnRzIGEgcmVxdWVzdCByZXNvbHZlcyB0aHJvdWdoIChmaW5kQnVja2V0U3RvcmUsIHJlYWRCdWNrZXRJbnRlcm5hbCxcbiAqIHdyaXRlUm91dGluZ0NvbmZpZykuIFRoZXJlIGlzIG5vIGNhY2hlZCBidWNrZXQgc3RhdGU6IGEgYnVja2V0IGlzIG5vdGhpbmcgYnV0IHRoZSBzdG9yZXMgd2hvc2VcbiAqIGZvbGRlcnMgc2hhcmUgaXRzIG5hbWUsIGxpc3RlZCBvZmYgdGhlIGRpc2sgd2hlbiBzb21ldGhpbmcgZ2VudWluZWx5IG5lZWRzIGFsbCBvZiB0aGVtLlxuICovXG5cbi8qKlxuICogRXZlcnkgc3RvcmUgdGhpcyBwcm9jZXNzIHJ1bnMsIGJ5IGZvbGRlciAtIHdoaWNoIElTIHRoZSBzdG9yZSdzIGlkZW50aXR5OiBhY2NvdW50LCBuYW1lLCBidWNrZXQuXG4gKiBBIHN0b3JlIGlzIG1hZGUgb25jZSwgY29uZmlndXJlcyBpdHNlbGYgZnJvbSB0aGUgcm91dGluZyBjb25maWcgaXQgaG9sZHMsIGFuZCBzdGF5czsgbm90aGluZyBoZXJlXG4gKiBkZWNpZGVzIHdoYXQgaXQgaXMsIG9ubHkgdGhhdCBpdCBleGlzdHMuXG4gKi9cbmNvbnN0IHN0b3JlcyA9IG5ldyBNYXA8c3RyaW5nLCBCbG9iU3RvcmU+KCk7XG4vLyBUaGUgb3BlbmVkIHN0b3JlcyBvZiBlYWNoIGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gLCBieSBuYW1lIC0gd2hpY2ggYnVja2V0cyBhcmUgQUNUSVZFIChzb21ldGhpbmcgdG91Y2hlZCB0aGVtKSwgZm9yIGRlcGxveSBoYW5kb2ZmcyBhbmQgdGhlIGRlYnVnIHBhZ2VzLiBQdXJlbHkgYSByZWdpc3RyeSBvZiB3aGF0IGdldFN0b3JlIGFscmVhZHkgbWFkZS5cbmNvbnN0IGFjdGl2ZVN0b3JlcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBCbG9iU3RvcmU+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY2FsbGVyTm9kZUlkPzogc3RyaW5nKTogQmxvYlN0b3JlIHtcbiAgICAvLyBUaGUgb25lIHBsYWNlIGEgbmFtZSBiZWNvbWVzIGEgZm9sZGVyLCBzbyB0aGUgb25lIHBsYWNlIGl0IGlzIHZhbGlkYXRlZCAoaXQgY2FuIGNvbWUgc3RyYWlnaHQgb2ZmIHRoZSB3aXJlKVxuICAgIGFzc2VydFZhbGlkU291cmNlTmFtZShuYW1lKTtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKG5hbWUsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBleGlzdGluZyA9IHN0b3Jlcy5nZXQoZm9sZGVyKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBjb25zb2xlLmxvZyhgT3BlbmluZyBzdG9yZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBvZiBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChmb2xkZXIgJHtmb2xkZXJ9KWApO1xuICAgIGxldCBzdG9yZSA9IG5ldyBCbG9iU3RvcmUoZm9sZGVyLCBuYW1lLCB7XG4gICAgICAgIC8vIFdoaWNoIGVudHJpZXMgaW4gSVRTIHJvdXRpbmcgY29uZmlnIGFyZSB0aGlzIHNlcnZlcidzIGNvcHkgb2YgaXRcbiAgICAgICAgaXNTZWxmOiBzb3VyY2UgPT4gaXNTZWxmU291cmNlKHNvdXJjZSwgYWNjb3VudCwgYnVja2V0TmFtZSksXG4gICAgICAgIGNyZWF0ZVNvdXJjZTogY29uZmlnID0+IGNyZWF0ZVN0b3JlU291cmNlKHsgc291cmNlQ29uZmlnOiBjb25maWcuc291cmNlQ29uZmlnLCBmb2xkZXIsIHdyaXRlRGVsYXk6IGNvbmZpZy53cml0ZURlbGF5IH0pLFxuICAgICAgICBhcHBseVNvdXJjZTogKHNvdXJjZSwgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5KSA9PiBhcHBseVNvdXJjZUNvbmZpZyhzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgIG9uV3JpdGVDb3VudGVkOiAoa2luZCwgYnl0ZXMpID0+IGNvdW50QnVja2V0V3JpdGUoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGtpbmQsIGJ5dGVzKSxcbiAgICAgICAgb25TeW5jVHJhbnNmZXI6IChvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKSA9PiB7XG4gICAgICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtwYXRofWAsIHNpemU6IGJ5dGVzIH0pO1xuICAgICAgICAgICAgLy8gRXZlcnkgc3luY2hyb25pemF0aW9uIHdyaXRlIGlzIGxvZ2dlZCBwZXIgZmlsZSwgZXhhY3RseSBsaWtlIGNsaWVudCBtdXRhdGlvbnMgLSB0aGUgbG9nIGlzIHRoZSBmdWxsIGFjY291bnQgb2Ygd2hhdCBtb3ZlZFxuICAgICAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogb3BlcmF0aW9uLCBhY2NvdW50LCBidWNrZXROYW1lLCBzdG9yZTogbmFtZSwgcGF0aCwgc2l6ZTogYnl0ZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVTb3VyY2VVcmw6IHJlc29sdmVTb3VyY2VBcmNoaXZlcyxcbiAgICAgICAgLy8gVGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIGEgY29uZmlnIHdpdGggdXBjb21pbmcgd2luZG93cyBpcyB3aGF0IGJvdW5kYXJ5IHNjYW5zIGFyZSBhcm1lZCBmcm9tXG4gICAgICAgIG9uUm91dGluZ0FwcGxpZWQ6IHJvdXRpbmcgPT4gc2NoZWR1bGVCb3VuZGFyeVdvcmsoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyksXG4gICAgICAgIC8vIFRoZSBzdG9yZSB3YXMgY3JlYXRlZCBieSB0aGlzIGNhbGxlcidzIHJlcXVlc3QsIHNvIHRoZSBjYWxsZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3IgdGhpcyBuYW1lIC0gdGhlIHN0b3JlIGFza3MgaXQgd2hlbiBpdHMgb3duIGZvbGRlciBob2xkcyBubyBjb25maWd1cmF0aW9uIChzZWUgQmxvYlN0b3JlLmluaXQpXG4gICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnOiBjYWxsZXJOb2RlSWQgJiYgKGFzeW5jICgpID0+IGF3YWl0IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW2NhbGxlck5vZGVJZF0uZ2V0Um91dGluZ0NvbmZpZ0Zvck5hbWUoeyBhY2NvdW50LCBidWNrZXROYW1lLCBuYW1lIH0pKSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgc3RvcmVzLnNldChmb2xkZXIsIHN0b3JlKTtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGJ5TmFtZSA9IGFjdGl2ZVN0b3Jlcy5nZXQoa2V5KTtcbiAgICBpZiAoIWJ5TmFtZSkge1xuICAgICAgICBieU5hbWUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGFjdGl2ZVN0b3Jlcy5zZXQoa2V5LCBieU5hbWUpO1xuICAgIH1cbiAgICBieU5hbWUuc2V0KG5hbWUsIHN0b3JlKTtcbiAgICAvLyBMYXp5IGluaXQgd291bGQgbGVhdmUgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHNpdHRpbmcgaW5lcnQgLSBubyBpbmRleCBsb2FkZWQsIG5vIGNvbmZpZyBhcHBsaWVkLCBub3RoaW5nIHN5bmNocm9uaXppbmcgLSB3aGlsZSBpdHMgZm9sZGVyIGlzIGZ1bGwgb2YgZmlsZXNcbiAgICB2b2lkIHN0b3JlLmluaXQoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEluaXRpYWxpemluZyBzdG9yZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBvZiBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJldHVybiBzdG9yZTtcbn1cblxuLyoqIFRoZSBzdG9yZSBzZXJ2aW5nIGEgcmVxdWVzdDogdGhlIG9uZSB0aGUgY2xpZW50J3Mgc2VsZWN0ZWQgZW50cnkgTkFNRVMuIEFjY291bnQsIG5hbWUsIGFuZCBidWNrZXQgQVJFIHRoZSBmb2xkZXIsIHNvIHRoaXMgaXMgYSBkaXJlY3QgbG9va3VwLCBuZXZlciBhIHNlYXJjaCBvZiB3aGF0IGV4aXN0cyAtIGFuZCBhIG5hbWUgdGhpcyBzZXJ2ZXIgaGFzIG5ldmVyIHNlZW4gaXMgQ1JFQVRFRCwgbmV2ZXIgcmVqZWN0ZWQsIGJlY2F1c2UgYXNraW5nIGZvciBhIG5hbWUgaXMgdGhlIGluc3RydWN0aW9uIHRvIGhhdmUgdGhhdCBzdG9yZSAob25lIG5hbWUsIG9uZSBmb2xkZXIsIG9uZSBpbmRleDsgaXQgY29uZmlndXJlcyBpdHNlbGYgb25jZSB0aGUgcm91dGluZyBjb25maWcgbGFuZHMgaW4gaXQpLiBOb3RoaW5nIGVsc2UgYWJvdXQgdGhlIHJlcXVlc3QgaXMgY29tcGFyZWQgLSBub3QgdGhlIHdpbmRvdywgbm90IHRoZSByb3V0ZSwgbm90IHRoZSBmbGFncyAtIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBuYW1pbmcgaXQ6IGEgY2xpZW50IGEgY29uZmlnIHZlcnNpb24gYmVoaW5kIG9uIHNvbWUgZmxhZyBzdGlsbCByZWFjaGVzIHRoZSByaWdodCBzdG9yZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnVja2V0U3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkKTogQmxvYlN0b3JlIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbW90ZSBzb3VyY2UgY29uZmlndXJhdGlvbiB3YXMgcHJvdmlkZWQgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IGV2ZXJ5IHJlcXVlc3QgbXVzdCBzYXkgd2hpY2ggY29uZmlndXJlZCBzb3VyY2UgaXQgc2VsZWN0ZWRgKTtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlcidzIGlkLCBzbyBhIHN0b3JlIHRoaXMgcmVxdWVzdCBDUkVBVEVTIGNhbiBhc2sgdGhhdCBjYWxsZXIgZm9yIHRoZSBjb25maWcgaXQgaW50ZW5kZWQgKGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBhbmQgdGhlIHJlcXVlc3RlciBob2xkcyB0aGF0IGNvbmZpZylcbiAgICBsZXQgY2FsbGVyTm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FsbGVyTm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk/Lm5vZGVJZDtcbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBnZXRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBzb3VyY2VDb25maWcubmFtZSwgY2FsbGVyTm9kZUlkKTtcbn1cblxuLyoqIFRoZSBzdG9yZXMgb2YgYSBidWNrZXQgYXMgdGhlIERJU0sgcmVjb3JkcyB0aGVtIChhIGJ1Y2tldCBpcyBub3RoaW5nIG1vcmUgdGhhbiB0aGUgc3RvcmUgZm9sZGVycyBzaGFyaW5nIGl0cyBuYW1lKSwgb3BlbmVkIC0gc28gdGhlIG9uZXMgdGhhdCB3ZXJlbid0IHJ1bm5pbmcgeWV0IHN0YXJ0IHN5bmNocm9uaXppbmcuIEVtcHR5IHdoZW4gdGhlIGJ1Y2tldCBkb2VzIG5vdCBleGlzdCBoZXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHN0b3JlOiBCbG9iU3RvcmUgfVtdPiB7XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QnVja2V0U3RvcmVGb2xkZXJzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiBmb2xkZXJzLm1hcCh4ID0+ICh7IG5hbWU6IHgubmFtZSwgc3RvcmU6IGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHgubmFtZSkgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgc3RvcmU6IEJsb2JTdG9yZSB9W10+IHtcbiAgICBsZXQgbGlzdCA9IGF3YWl0IGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyOiAke2FjY291bnR9LyR7YnVja2V0TmFtZX0uIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHJlYWRzIHNraXAgc3RvcmUgc2VsZWN0aW9uIGVudGlyZWx5OiB0aGUgY2FsbGVyIGlzIGFub3RoZXIgc3RvcmUgd2hvc2UgaW5kZXggc2F5cyB0aGlzIE1BQ0hJTkUgaG9sZHMgdGhlIGJ5dGVzIC0gdGhlIHBlcnNpc3RlZCBob2xkZXIgaWRlbnRpdHkgaXMganVzdCBhIFVSTCwgd2hpY2ggY2Fubm90IG5hbWUgYSBzdG9yZS4gV2hpY2hldmVyIHN0b3JlJ3MgZm9sZGVyIGhhcyB0aGUgbmV3ZXN0IGNvcHkgYW5zd2Vycy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVja2V0SW50ZXJuYWwoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0U3RvcmVzLm1hcChzID0+IHMuc3RvcmUuZ2V0Mih7IHBhdGg6IGNvbmZpZy5wYXRoLCByYW5nZTogY29uZmlnLnJhbmdlLCBpbmNsdWRlVG9tYnN0b25lczogY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzLCBpbnRlcm5hbDogdHJ1ZSB9KSkpO1xuICAgIGxldCBiZXN0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgKCFiZXN0IHx8IHJlc3VsdC53cml0ZVRpbWUgPiBiZXN0LndyaXRlVGltZSkpIHtcbiAgICAgICAgICAgIGJlc3QgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUFyY2hpdmVzQ29uZmlnKGJ1Y2tldFN0b3JlczogQmxvYlN0b3JlW10sIHJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZCk6IEFyY2hpdmVzQ29uZmlnIHtcbiAgICBsZXQgaW5kZXggPSB7IGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH07XG4gICAgbGV0IG1hcmtlZEluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9ID0geyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9O1xuICAgIGxldCBpbmRleFNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gPSBbXTtcbiAgICBsZXQgc3luY2luZzogU3luY0FjdGl2aXR5W10gPSBbXTtcbiAgICBsZXQgcmVhZGVyRGlza0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgc3RvcmUgb2YgYnVja2V0U3RvcmVzKSB7XG4gICAgICAgIGxldCBwcm9ncmVzcyA9IHN0b3JlLmdldFN5bmNQcm9ncmVzcygpO1xuICAgICAgICBpbmRleC5maWxlQ291bnQgKz0gcHJvZ3Jlc3MuaW5kZXguZmlsZUNvdW50O1xuICAgICAgICBpbmRleC5ieXRlQ291bnQgKz0gcHJvZ3Jlc3MuaW5kZXguYnl0ZUNvdW50O1xuICAgICAgICBtYXJrZWRJbmRleC5maWxlQ291bnQgKz0gcHJvZ3Jlc3MubWFya2VkLmZpbGVDb3VudDtcbiAgICAgICAgbWFya2VkSW5kZXguYnl0ZUNvdW50ICs9IHByb2dyZXNzLm1hcmtlZC5ieXRlQ291bnQ7XG4gICAgICAgIGlmIChwcm9ncmVzcy5tYXJrZWQub2xkZXN0RGVsZXRlVGltZSAhPT0gdW5kZWZpbmVkICYmIChtYXJrZWRJbmRleC5vbGRlc3REZWxldGVUaW1lID09PSB1bmRlZmluZWQgfHwgcHJvZ3Jlc3MubWFya2VkLm9sZGVzdERlbGV0ZVRpbWUgPCBtYXJrZWRJbmRleC5vbGRlc3REZWxldGVUaW1lKSkge1xuICAgICAgICAgICAgbWFya2VkSW5kZXgub2xkZXN0RGVsZXRlVGltZSA9IHByb2dyZXNzLm1hcmtlZC5vbGRlc3REZWxldGVUaW1lO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4U291cmNlcy5wdXNoKC4uLnByb2dyZXNzLnNvdXJjZXMpO1xuICAgICAgICBzeW5jaW5nLnB1c2goLi4ucHJvZ3Jlc3Muc3luY2luZyk7XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdCA9IHJlYWRlckRpc2tMaW1pdCB8fCBwcm9ncmVzcy5yZWFkZXJEaXNrTGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIEV2ZXJ5IHN0b3JlIGlzIGluZGV4LWJhY2tlZCwgc28gdGhlIGNoYW5nZSBmZWVkIGlzIGFsd2F5cyBuYXRpdmVcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRydWUsXG4gICAgICAgIHJlbW90ZUNvbmZpZzogcm91dGluZyxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIG1hcmtlZEluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXMsXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgc3luY2luZyxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0QXJjaGl2ZXNDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhidWNrZXRTdG9yZXMubWFwKHggPT4geC5zdG9yZSksIHJvdXRpbmcpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVja2V0U3luY1N0YXR1cyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0U3RvcmVzLm1hcChzID0+IHMuc3RvcmUuZ2V0U3luY1N0YXR1cygpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICBpbmRleFNpemU6IHN0YXR1c2VzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmluZGV4U2l6ZSwgMCksXG4gICAgICAgIHNvdXJjZXM6IHN0YXR1c2VzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWJ1Z0J1Y2tldEluZGV4VG90YWxzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9PiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHRvdGFscyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldFN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlLmNvbXB1dGVJbmRleFRvdGFscygpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguZmlsZUNvdW50LCAwKSxcbiAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguYnl0ZUNvdW50LCAwKSxcbiAgICAgICAgc291cmNlczogdG90YWxzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgIH07XG59XG5cbmNvbnN0IHJlc29sdmVkU291cmNlQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuLyoqIEEgY2FjaGVkIElBcmNoaXZlcyBmb3IgYSBwZXJzaXN0ZWQgc291cmNlIGlkZW50aXR5OiBhIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSBvciBhIGRpc2sgZm9sZGVyIHBhdGggLSB0aGUgZm9ybSBCbG9iU3RvcmUncyBzb3VyY2VzIGxpc3Qgc3RvcmVzLiBDb25maWd1cmF0aW9uICh2YWxpZCB3aW5kb3dzLCByb3V0ZXMpIGRlY2lkZXMgV0hFTiBhIHNvdXJjZSBzaG91bGQgYmUgdXNlZDsgZm9yIHJlYWRpbmcgYnl0ZXMgdGhlIGluZGV4IHNheXMgYSBzb3VyY2UgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoIC0gZXZlbiBmb3Igc291cmNlcyBubyBsb25nZXIgaW4gYW55IGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlQXJjaGl2ZXModXJsOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBleGlzdGluZyA9IHJlc29sdmVkU291cmNlQXJjaGl2ZXMuZ2V0KHVybCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgIC8vIFRoZSBjb25maWcgaXMgZmFicmljYXRlZCBmcm9tIHRoZSBiYXJlIFVSTCBhbmQgY2FuIG5ldmVyIGV4YWN0LW1hdGNoIGEgc2VydmVyJ3MgZW50cmllcyAtIHdoaWNoIGlzIGZpbmUsIGJlY2F1c2UgaG9sZGVyIHJlYWRzIGFyZSBpbnRlcm5hbCByZWFkcywgYW5kIGludGVybmFsIHJlYWRzIG5ldmVyIHNlbGVjdCBhIHN0b3JlIChzZWUgcmVhZEJ1Y2tldEludGVybmFsKVxuICAgICAgICBzb3VyY2VDb25maWcgPSBub3JtYWxpemVTb3VyY2UodXJsKTtcbiAgICB9XG4gICAgbGV0IGFyY2hpdmVzID0gY3JlYXRlU3RvcmVTb3VyY2UoeyBzb3VyY2VDb25maWcsIGZvbGRlcjogdXJsIH0pO1xuICAgIHJlc29sdmVkU291cmNlQXJjaGl2ZXMuc2V0KHVybCwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cblxuLyoqXG4gKiBXcml0aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIHdyaXRlIGxpa2UgYW55IG90aGVyOiBpdCBnb2VzIGludG8gYSBzdG9yZSwgYW5kIHRoZSBzdG9yZSBhcHBsaWVzXG4gKiBpdCB0byBpdHNlbGYgYW5kIGxldHMgaXRzIHBlZXJzIHB1bGwgaXQuIFRoZSBvbmx5IHRoaW5nIHRoYXQgaGFwcGVucyBoZXJlIGlzIHBpY2tpbmcgV0hJQ0ggc3RvcmUsXG4gKiBiZWNhdXNlIHRoZSB3cml0ZXIgbmFtZXMgYSBzb3VyY2UgYW5kIGEgc291cmNlIG5hbWVzIGEgc3RvcmUuXG4gKlxuICogSW4tZmxpZ2h0IHN3aXRjaG92ZXIgd2luZG93cyBhcmUgcmUtaW5qZWN0ZWQgZmlyc3QgKHNlZSBpbnRlcm1lZGlhdGVNYW5hZ2VtZW50KTogYW4gb3BlcmF0b3Inc1xuICogY29uZmlnIGtub3dzIG5vdGhpbmcgYWJvdXQgYSBzd2l0Y2hvdmVyIHRoYXQgaXMgaGFwcGVuaW5nIHJpZ2h0IG5vdywgYW5kIHdyaXRpbmcgaXQgYXMtaXMgd291bGRcbiAqIGNhbmNlbCBpdCBtaWQtZmxpZ2h0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICBsZXQgc3RvcmUgPSBnZXRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBuYW1lKTtcbiAgICBsZXQgaW5jb21pbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGlmICghaW5jb21pbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSByZWplY3RlZCAtIG5vdCBhIHBhcnNlYWJsZSBjb25maWcuIFRoZSBkYXRhIHdyaXR0ZW4gZm9yICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAoc3RvcmUgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0pIGlzIG5vdCBhIHZhbGlkIHsgdmVyc2lvbj8sIHNvdXJjZXM6IFsuLi5dIH0gSlNPTiBjb25maWcgKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWApO1xuICAgIH1cbiAgICBsZXQgY3VycmVudCA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHN0b3JlZCA9IHJlaW5qZWN0SW50ZXJtZWRpYXRlcyhjdXJyZW50LCBpbmNvbWluZyk7XG4gICAgbGV0IHN0b3JlZERhdGEgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcoc3RvcmVkKSk7XG4gICAgYXdhaXQgc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiBzdG9yZWREYXRhLCBsYXN0TW9kaWZpZWQ6IGNvbmZpZz8ubGFzdE1vZGlmaWVkIH0pO1xuICAgIGxvZ011dGF0aW9uKHsgb3A6IFwicm91dGluZ0NvbmZpZ1wiLCBhY2NvdW50LCBidWNrZXROYW1lLCBzdG9yZTogbmFtZSwgcGF0aDogUk9VVElOR19GSUxFLCBzaXplOiBzdG9yZWREYXRhLmxlbmd0aCwgd3JpdGVUaW1lOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xufVxuXG4vKiogV2hpY2ggYnVja2V0cyB0aGlzIHByb2Nlc3MgY3VycmVudGx5IGhhcyBhY3RpdmUgKHNvbWUgc3RvcmUgb2YgdGhlaXJzIHdhcyBvcGVuZWQpIC0gd2hhdCBhIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yLCBzbyBpdCBhY3RpdmF0ZXMgZXhhY3RseSB0aGUgYnVja2V0cyB0aGF0IGFyZSBhY3R1YWxseSBpbiB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlQnVja2V0S2V5cygpOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIFsuLi5hY3RpdmVTdG9yZXMua2V5cygpXS5tYXAoa2V5ID0+IHtcbiAgICAgICAgbGV0IHNsYXNoID0ga2V5LmluZGV4T2YoXCIvXCIpO1xuICAgICAgICByZXR1cm4geyBhY2NvdW50OiBrZXkuc2xpY2UoMCwgc2xhc2gpLCBidWNrZXROYW1lOiBrZXkuc2xpY2Uoc2xhc2ggKyAxKSB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJCdWNrZXRJbmZvID0ge1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICBhY3RpdmU6IGJvb2xlYW47XG4gICAgLyoqIFdoZXJlIHRoZSBidWNrZXQncyBkYXRhIGxpdmVzIG9uIHRoaXMgc2VydmVyICovXG4gICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkcml2ZSB0aGF0IGZvbGRlciBpcyBvbi4gQnVja2V0cyBzaGFyaW5nIGEgZHJpdmUgcmVwb3J0IHRoZSBzYW1lIG51bWJlcnMuICovXG4gICAgZGlzaz86IEJ1Y2tldERpc2tJbmZvO1xuICAgIGRpc2tFcnJvcj86IHN0cmluZztcbiAgICB3cml0ZVN0YXRzPzogQnVja2V0V3JpdGVTdGF0cztcbiAgICBjb25maWc/OiBBcmNoaXZlc0NvbmZpZztcbiAgICBlcnJvcj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGl2ZUJ1Y2tldEluZm8gPSB7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZywgdGhlIG5ld2VzdCBjb3B5IGFtb25nIGl0cyBzdG9yZXMuIEFic2VudCB3aGVuIG5vbmUgb2YgdGhlbSBoYXMgb25lIHlldC4gKi9cbiAgICByb3V0aW5nPzogUmVtb3RlQ29uZmlnO1xuICAgIGNvbmZpZzogQXJjaGl2ZXNDb25maWc7XG59O1xuXG4vKiogVGhlIHN0YXRlIG9mIE9ORSBhY3RpdmUgYnVja2V0LiBSZXR1cm5zIGFuIGVycm9yIHN0cmluZyB3aGVuIHRoZSBidWNrZXQgaXMgbm90IGFjdGl2ZSBoZXJlLCB3aGljaCBpcyB0aGUgbm9ybWFsIHN0YXRlIGZvciBhIGJ1Y2tldCBub3RoaW5nIGhhcyBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlYnVnR2V0QWN0aXZlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBvcGVuZWQgPSBhY3RpdmVTdG9yZXMuZ2V0KGtleSk7XG4gICAgaWYgKCFvcGVuZWQgfHwgIW9wZW5lZC5zaXplKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBpcyBub3QgYWN0aXZlIG9uIHRoaXMgc2VydmVyIChhIGJ1Y2tldCBhY3RpdmF0ZXMgb24gZmlyc3QgYWNjZXNzKWA7XG4gICAgfVxuICAgIGxldCBidWNrZXRTdG9yZXMgPSBbLi4ub3BlbmVkLnZhbHVlcygpXTtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgcmV0dXJuIHsgZm9sZGVyOiBidWNrZXRTdG9yZXNbMF0uZm9sZGVyLCByb3V0aW5nLCBjb25maWc6IGFnZ3JlZ2F0ZUFyY2hpdmVzQ29uZmlnKGJ1Y2tldFN0b3Jlcywgcm91dGluZykgfTtcbn1cblxuLyoqIExvYWRzIGV2ZXJ5IHN0b3JlIG9mIGEgYnVja2V0IHRoYXQgZXhpc3RzIG9uIHRoaXMgc2VydmVyJ3MgZGlzayBpbnRvIG1lbW9yeSwgd2hpY2ggc3RhcnRzIHRoZWlyIHN5bmNocm9uaXphdGlvbiBhbmQgd2luZG93IHRpbWVycywgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCdzIHN0YXRlLiBOb3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNlcnZlciBpcyBjb250YWN0ZWQgLSB1bmxpa2UgYnVpbGRpbmcgYW4gQXJjaGl2ZXNDaGFpbiBmb3IgaXQsIHdoaWNoIHdvdWxkIHByb2JlIGV2ZXJ5IHNvdXJjZSBhbmQgY291bGQgd3JpdGUgdGhlIHJvdXRpbmcgY29uZmlnLiBBbHJlYWR5LWFjdGl2ZSBidWNrZXRzIGp1c3QgcmV0dXJuIHRoZWlyIHN0YXRlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCB3YXNBY3RpdmUgPSBhY3RpdmVTdG9yZXMuaGFzKGtleSk7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWJ1Y2tldFN0b3Jlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyIChpdCBoYXMgbm8gc3RvcmUgZm9sZGVycyB1bmRlciAke2dldEJ1Y2tldEZvbGRlcihcIjxuYW1lPlwiLCBhY2NvdW50LCBidWNrZXROYW1lKX0pYDtcbiAgICB9XG4gICAgLy8gV2FpdCBmb3IgdGhlIGluZGV4ZXMgdG8gbG9hZCwgc28gdGhlIHRvdGFscyB3ZSByZXR1cm4gYXJlIHRoZSByZWFsIG9uZXMgcmF0aGVyIHRoYW4gemVyb2VzIGZyb20gc3RvcmVzIHRoYXQgaGF2ZSBub3QgcmVhZCB0aGVpciBpbmRleCB5ZXQuIFRoZSBzb3VyY2Ugc2NhbnMga2VlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgIGZvciAobGV0IHMgb2YgYnVja2V0U3RvcmVzKSB7XG4gICAgICAgIGF3YWl0IHMuc3RvcmUuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoIXdhc0FjdGl2ZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWN0aXZhdGVkIGJ1Y2tldCAke2tleX0gb24gcmVxdWVzdDogaXRzICR7YnVja2V0U3RvcmVzLmxlbmd0aH0gc3RvcmUocykgYXJlIG5vdyBsb2FkZWQgYW5kIHN5bmNocm9uaXppbmdgKTtcbiAgICB9XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiB7IGZvbGRlcjogYnVja2V0U3RvcmVzWzBdLnN0b3JlLmZvbGRlciwgcm91dGluZywgY29uZmlnOiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhidWNrZXRTdG9yZXMubWFwKHggPT4geC5zdG9yZSksIHJvdXRpbmcpIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgLy8gVGhlIGRpc2sgaXMgdGhlIHJlY29yZDogYSBidWNrZXQgZXhpc3RzIGhlcmUgd2hlbiBpdCBoYXMgYXQgbGVhc3Qgb25lIHN0b3JlIGZvbGRlciwgYW5kIHNldmVyYWwgbmFtZXMgZm9yIG9uZSBidWNrZXQgYXJlIHN0aWxsIG9uZSBidWNrZXRcbiAgICBsZXQgZm9sZGVycyA9IGF3YWl0IGxpc3RBY2NvdW50U3RvcmVGb2xkZXJzKGFjY291bnQpO1xuICAgIGxldCBieUJ1Y2tldCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChsZXQgc3RvcmUgb2YgZm9sZGVycykge1xuICAgICAgICBpZiAoYnlCdWNrZXQuaGFzKHN0b3JlLmJ1Y2tldE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgYnlCdWNrZXQuc2V0KHN0b3JlLmJ1Y2tldE5hbWUsIHN0b3JlLmZvbGRlcik7XG4gICAgfVxuICAgIGxldCBuYW1lcyA9IFsuLi5ieUJ1Y2tldC5rZXlzKCldO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChuYW1lcy5tYXAoYXN5bmMgYnVja2V0TmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgICAgICAgICBsZXQgZm9sZGVyID0gYnlCdWNrZXQuZ2V0KGJ1Y2tldE5hbWUpIHx8IFwiXCI7XG4gICAgICAgICAgICBsZXQgYmFzZTogU2VydmVyQnVja2V0SW5mbyA9IHsgYnVja2V0TmFtZSwgYWN0aXZlOiBhY3RpdmVTdG9yZXMuaGFzKGtleSksIGZvbGRlciB9O1xuICAgICAgICAgICAgYmFzZS5kaXNrID0gYXdhaXQgZ2V0RGlza0luZm8oZm9sZGVyKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLmRpc2tFcnJvciA9IFN0cmluZyhlLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFzZS53cml0ZVN0YXRzID0gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2UuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcGVuZWQgPSBbLi4uKGFjdGl2ZVN0b3Jlcy5nZXQoa2V5KT8udmFsdWVzKCkgfHwgW10pXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhvcGVuZWQsIHJvdXRpbmcpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBlcnJvcjogYE5vIHJvdXRpbmcgZmlsZSAoJHtST1VUSU5HX0ZJTEV9KSBpbiBhbnkgb2YgaXRzIHN0b3Jlc2AgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiB7IHJlbW90ZUNvbmZpZzogcm91dGluZyB9IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc29sZS5sb2coYGRlYnVnTGlzdEFjY291bnRCdWNrZXRzKCR7YWNjb3VudH0pIHRvb2sgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgZm9yICR7bmFtZXMubGVuZ3RofSBidWNrZXRzYCk7XG4gICAgfVxufVxuIl19
290
+ /* _JS_SOURCE_HASH = "07c1855782185df7a505b5d9fab394cf9ef1a961a5682f89aebbc1d2f46b902e"; */