sliftutils 1.7.24 → 1.7.26

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.
@@ -673,7 +673,7 @@ class ArchivesLocalBucket {
673
673
  return await getLoadedBucket(this.account, this.bucketName);
674
674
  }
675
675
  getDebugName() {
676
- return `localBucket/${this.account}/${this.bucketName}`;
676
+ return `localBucket account ${this.account} bucket ${this.bucketName}`;
677
677
  }
678
678
  async get(fileName, config) {
679
679
  let result = await this.get2(fileName, config);
@@ -775,5 +775,5 @@ function getLocalArchives(account, bucketName) {
775
775
  return archives;
776
776
  }
777
777
  exports.getLocalArchives = getLocalArchives;
778
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUF5RjtBQUN6RixxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUs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QyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSwyRUFBMkUsQ0FBQyxDQUFDO1FBQzFJLENBQUM7UUFDRCxPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0o7QUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUNuRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDaEUsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7SUFDckMsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBUEQsNENBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RvcmFnZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvblN0b3JhZ2VcIjtcbmltcG9ydCB7IEpTT05TdG9yYWdlIH0gZnJvbSBcIi4uL0pTT05TdG9yYWdlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2sgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBCbG9iU3RvcmUsIElCdWNrZXRTdG9yZSwgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZLCBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTiB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVDb25maWcsIEhvc3RlZENvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZyxcbiAgICBBcmNoaXZlc1N5bmNTdGF0dXMsIEZVTExfVkFMSURfV0lORE9XLFxuICAgIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBwYXJzZUhvc3RlZFVybCwgYnVpbGRGaWxlVXJsLCBnZXRDb25maWdWZXJzaW9uLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGFwcGx5RGVwbG95UmVtYXAsIGdldFRha2VvdmVyQWx0UG9ydCwgb25UYWtlb3ZlckV2ZW50IH0gZnJvbSBcIi4vZGVwbG95VGFrZW92ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vY3JlYXRlQXJjaGl2ZXNcIjtcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2UgfSBmcm9tIFwiLi4vSVN0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgQWNjZXNzUmVxdWVzdCwgVHJ1c3RSZWNvcmQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgZ2V0QXJnIH0gZnJvbSBcIi4vY2xpQXJnc1wiO1xuXG4vLyBUaGUgc3RvcmFnZSBzZXJ2ZXIncyBnbG9iYWwgc2VydmVyLXNpZGUgc3RhdGUuIGhvc3RTdG9yYWdlU2VydmVyIHNldHMgdGhlIGNvbmZpZyBvbmNlIGF0XG4vLyBzdGFydHVwOyBldmVyeXRoaW5nIGVsc2UgKHN5c3RlbSBzdG9yYWdlcywgYnVja2V0cykgaXMgYSBnbG9iYWwgY2FjaGUgY3JlYXRlZCBsYXppbHkgb24gZmlyc3Rcbi8vIHVzZSwgdGhyb3dpbmcgaWYgdGhlIGNvbmZpZyB3YXMgbmV2ZXIgc2V0LlxuLy9cbi8vIEJ1Y2tldHMgaGF2ZSBubyBzZXBhcmF0ZSByZWdpc3RyeTogZWFjaCBidWNrZXQncyBjb25maWd1cmF0aW9uIChhIFJlbW90ZUNvbmZpZykgbGl2ZXMgaW5zaWRlIHRoZVxuLy8gYnVja2V0IGl0c2VsZiwgYXQgUk9VVElOR19GSUxFLiBBIGJ1Y2tldCBleGlzdHMgaWZmIHRoYXQgZmlsZSBleGlzdHMuIFdyaXRpbmcgaXQgY3JlYXRlcyB0aGVcbi8vIGJ1Y2tldCAoYnVpbGRpbmcgaXRzIHN0b3JlLCB3aGljaCBtYXkgaW1tZWRpYXRlbHkgc3RhcnQgc3luY2hyb25pemF0aW9uIHNjYW5zKTsgb3ZlcndyaXRpbmcgaXQg4oCUXG4vLyBkaXJlY3RseSBvciB2aWEgYSBmaWxlIHB1bGxlZCBpbiBmcm9tIGEgc3luY2hyb25pemF0aW9uIHNvdXJjZSDigJQgcmVidWlsZHMgdGhlIHN0b3JlIHdpdGggdGhlIG5ld1xuLy8gc291cmNlcyAoY2FuY2VsbGluZyB0aGUgb2xkIHN0b3JlJ3Mgc2NhbnMpLlxuXG5leHBvcnQgdHlwZSBTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICByb290RG9tYWluOiBzdHJpbmc7XG4gICAgLy8gdXNlckBleHRlcm5hbElwIG9mIHRoZSBzdG9yYWdlIG1hY2hpbmUsIGZvciBnZW5lcmF0ZWQgc3NoIGNvbW1hbmRzXG4gICAgc3NoVGFyZ2V0OiBzdHJpbmc7XG4gICAgLy8gQWJzb2x1dGUgY29tbWFuZCB0aGF0IHJ1bnMgdGhlIGdyYW50QWNjZXNzIENMSSBvbiB0aGUgc3RvcmFnZSBtYWNoaW5lIChhZG1pbiBhcmdzIGFwcGVuZGVkKVxuICAgIHNlcnZlckNvbW1hbmQ6IHN0cmluZztcbiAgICAvLyBUaGUgc2VydmVyJ3Mgcm9vdCBzdG9yYWdlIGZvbGRlciAoYWJzb2x1dGUpXG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbi8vIEZvciBzZWxmLWRldGVjdGlvbjogY29kZSB0aGF0IENBTiBydW4gb3V0c2lkZSB0aGUgc3RvcmFnZSBzZXJ2ZXIgKGNyZWF0ZUFyY2hpdmVzKSB1c2VzIHRoaXMgdG9cbi8vIGNoZWNrIFwiaXMgdGhpcyBVUkwgb3VyIG93biBwcm9jZXNzP1wiIHdpdGhvdXQgdGhyb3dpbmcuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbi8vIFdoZW4gc2V0LCBhbGwgd3JpdGUtcGF0aCBvcGVyYXRpb25zIChjcmVhdGluZyBmaWxlcywgYXBwZW5kaW5nIGxhcmdlIHVwbG9hZHMsIGNyZWF0aW5nIGJ1Y2tldHMpXG4vLyB0aHJvdyB0aGlzIG1lc3NhZ2UuIFJlYWRzLCBmaW5kSW5mbywgYW5kIGRlbGV0ZXMgc3RpbGwgd29yayDigJQgc28gY2xpZW50cyBjYW4gZnJlZSBzcGFjZS4gTWFuYWdlZFxuLy8gYnkgaG9zdFN0b3JhZ2VTZXJ2ZXIncyBkaXNrLXNwYWNlIG1vbml0b3IuXG5sZXQgd3JpdGVzUmVqZWN0ZWRSZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbihyZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHdyaXRlc1JlamVjdGVkUmVhc29uID0gcmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRlc1JlamVjdGVkUmVhc29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHdyaXRlc1JlamVjdGVkUmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyaXRlc0FsbG93ZWQoKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlc1JlamVjdGVkUmVhc29uKSB0aHJvdyBuZXcgRXJyb3Iod3JpdGVzUmVqZWN0ZWRSZWFzb24pO1xufVxuXG4vLyBUaGUgc3lzdGVtIHN0b3JhZ2VzICh0cnVzdCwgcmVxdWVzdHMpIGFyZSB0aGUgc2FtZSBraW5kIG9mIHRoaW5nIOKAlCBhIEpTT04ga2V5L3ZhbHVlIHN0b3JlIHVuZGVyXG4vLyA8Zm9sZGVyPi9zeXN0ZW0yLzxuYW1lPiDigJQgc28gdGhleSBzaGFyZSBvbmUgY2FjaGUsIGtleWVkIGJ5IG5hbWUuIChcInN5c3RlbTJcIiBiZWNhdXNlIHRoZSBsYXlvdXRcbi8vIGNoYW5nZWQgd2hlbiBidWNrZXQgY29uZmlncyBtb3ZlZCBpbnRvIHRoZSBidWNrZXRzIHRoZW1zZWx2ZXM7IG9sZCBcInN5c3RlbVwiL1wiYnVja2V0c1wiIGZvbGRlcnNcbi8vIGFyZSBzaW1wbHkgaWdub3JlZC4pXG4vLyBzZXRUcnVzdGVkTWFjaGluZXMgaXMgY2FsbGVkIGJ5IGNvbnN1bWVycyBCRUZPUkUgc3RhcnRpbmcgdGhlIHNlcnZlciwgc28gd2hlbiB0aGUgY29uZmlnIGlzbid0XG4vLyBzZXQgeWV0IHdlIGZhbGwgYmFjayB0byB0aGUgc2FtZSAtLWZvbGRlciBhcmcgdGhlIENMSSBzdGFydHMgdGhlIHNlcnZlciB3aXRoLlxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG4vKiogTWFrZXMgbWFjaGluZUlkcyB0aGUgY29tcGxldGUgdHJ1c3QgbGlzdCBmb3IgdGhlIGFjY291bnQ6IG1hY2hpbmVzIG5vdCBpbiB0aGUgbGlzdCBsb3NlIGFjY2VzcywgbWFjaGluZXMgYWxyZWFkeSB0cnVzdGVkIGtlZXAgdGhlaXIgZXhpc3RpbmcgcmVjb3JkLCBhbmQgbWlzc2luZyBvbmVzIGFyZSBhZGRlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG4vLyDilIDilIAgYnVja2V0cyDilIDilIBcblxuZXhwb3J0IHR5cGUgTG9hZGVkQnVja2V0ID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gVGhlIGJ1Y2tldCdzIHBhcnNlZCByb3V0aW5nIGNvbmZpZyAodGhlIGNvbnRlbnRzIG9mIFJPVVRJTkdfRklMRSlcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLy8gSlNPTiBvZiByb3V0aW5nLCBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgIHJvdXRpbmdKU09OOiBzdHJpbmc7XG4gICAgLy8gQUxMIG9mIG91ciBvd24gZW50cmllcyBpbiByb3V0aW5nLnNvdXJjZXMgKHRoaXMgYnVja2V0IG9uIHRoaXMgc2VydmVyKS4gTW9yZSB0aGFuIG9uZSB3aGVuXG4gICAgLy8gdGhlIGJ1Y2tldCdzIG9wdGlvbnMgY2hhbmdlIG92ZXIgdGltZSAtIG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93IChlLmcuIGltbXV0YWJsZSBkcm9wcGVkLFxuICAgIC8vIG9yIGZhc3QgZW5hYmxlZCwgc3RhcnRpbmcgYXQgYSBzY2hlZHVsZWQgaW5zdGFudCkuXG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIC8vIFRoZSBlbnRyeSB2YWxpZCB3aGVuIHRoZSBzdG9yZSB3YXMgYnVpbHQgLSB0aGUgc3RydWN0dXJhbCBvcHRpb25zIChyYXdEaXNrLCB3aGljaCBlbnRyaWVzXG4gICAgLy8gYXJlIGRvd25zdHJlYW0pLiBQZXItd3JpdGUgb3B0aW9ucyAoZmFzdC9pbW11dGFibGUpIGFyZSBpbnN0ZWFkIGV2YWx1YXRlZCBhdCBlYWNoIHdyaXRlJ3NcbiAgICAvLyB0aW1lLCBzZWUgZ2V0V3JpdGVDb25maWcvYXNzZXJ0TXV0YWJsZS4gdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkb2Vzbid0IG1lbnRpb24gdXMuXG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHN0b3JlOiBJQnVja2V0U3RvcmU7XG59O1xuXG5jb25zdCBidWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPj4oKTtcblxuLy8gc2V0VGltZW91dCBjYW5ub3QgcmVwcmVzZW50IGxvbmdlciBkZWxheXM7IG1vcmUgZGlzdGFudCB3aW5kb3cgYm91bmRhcmllcyByZS1jaGVjayBhZnRlciB0aGlzXG5jb25zdCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSA9IDIgKiogMzEgLSAxO1xuLy8gUmVidWlsZCBzbGlnaHRseSBhZnRlciB0aGUgYm91bmRhcnksIHNvIHRoZSBuZXdseS12YWxpZCBlbnRyeSBpcyB1bmFtYmlndW91c2x5IGFjdGl2ZVxuY29uc3QgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIgPSAxMDAwO1xuXG5mdW5jdGlvbiBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgXCJidWNrZXRzMlwiLCBhY2NvdW50LCBidWNrZXROYW1lKTtcbn1cblxuLy8gUG9ydHMgd2UgYXJlIGxpc3RlbmluZyBvbiBiZXlvbmQgdGhlIG1haW4gY29uZmlnIHBvcnQgLSBhIGRlcGxveS10YWtlb3ZlciBzdWNjZXNzb3Igc2VydmVzIG9uIGFcbi8vIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydCwgYW5kIG11c3QgcmVjb2duaXplIGFsdGVybmF0ZS1wb3J0IHNvdXJjZSBVUkxzIGFzIGl0c2VsZlxuY29uc3QgZXh0cmFMaXN0ZW5Qb3J0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4dHJhTGlzdGVuUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBleHRyYUxpc3RlblBvcnRzLmFkZChwb3J0KTtcbn1cbmZ1bmN0aW9uIGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nOiBSZW1vdGVDb25maWcsIGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIC8vIFRoZSB0YWtlb3ZlcidzIGFsdGVybmF0ZSBwb3J0IGlzIHRoZSBPVEhFUiBwcm9jZXNzIG9mIHRoZSBzd2l0Y2hvdmVyLCBvbiBPVVIgbWFjaGluZSB3aXRoXG4gICAgLy8gT1VSIGRpc2sgLSBzZWxmIGZvciBzeW5jIHB1cnBvc2VzIG9uIGJvdGggc2lkZXMgKHRoZSBvbGQgbm9kZSBtdXN0IG5vdCBzY2FuL3B1c2ggaXRzIG93blxuICAgIC8vIHN1Y2Nlc3NvcjsgdGhlIHNoYXJlZCBmb2xkZXIgcGx1cyB0aGUgc3dpdGNob3ZlciBkaXNrIHNjYW5zIHJlY29uY2lsZSB0aGVtKVxuICAgIGxldCB0YWtlb3ZlckFsdFBvcnQgPSBnZXRUYWtlb3ZlckFsdFBvcnQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikgY29udGludWU7XG4gICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgaWYgKHBhcnNlZC5hZGRyZXNzICE9PSBkb21haW4gfHwgcGFyc2VkLmFjY291bnQgIT09IGFjY291bnQgfHwgcGFyc2VkLmJ1Y2tldE5hbWUgIT09IGJ1Y2tldE5hbWUpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocGFyc2VkLnBvcnQgPT09IHBvcnQgfHwgZXh0cmFMaXN0ZW5Qb3J0cy5oYXMocGFyc2VkLnBvcnQpIHx8IHBhcnNlZC5wb3J0ID09PSB0YWtlb3ZlckFsdFBvcnQpIHtcbiAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXhlcztcbn1cblxuLy8gVGhlIGVudHJ5IHdob3NlIHZhbGlkIHdpbmRvdyBjb250YWlucyB0aGUgdGltZSAoYW1vbmcgdGhlIGVudHJpZXMgY292ZXJpbmcgdGhlIGtleSdzIHJvdXRlLFxuLy8gd2hlbiBvbmUgaXMgZ2l2ZW4gLSBhIHNlcnZlciBjYW4gaG9sZCBkaWZmZXJlbnQgc2hhcmRzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMpLiBIYWxmLW9wZW5cbi8vIChbc3RhcnQsIGVuZCkpLCBzbyBjbGVhbiBicmVha3MgcmVzb2x2ZSB1bmFtYmlndW91c2x5LiBGYWxscyBiYWNrIHRvIHRoZSBuZWFyZXN0IHdpbmRvdyB3aGVuXG4vLyBub25lIGNvbnRhaW5zIHRoZSB0aW1lIC0gZ2FwcyBzaG91bGRuJ3QgZXhpc3QsIGJ1dCBhIHdyaXRlIG11c3Qgc3RpbGwgcmVzb2x2ZSB0byBTT01FXG4vLyBjb25maWd1cmF0aW9uLlxuZnVuY3Rpb24gc2VsZWN0RW50cnlBdChlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSwgdGltZTogbnVtYmVyLCByb3V0ZT86IG51bWJlcik6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvdmVyaW5nID0gZW50cmllcy5maWx0ZXIoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmIChjb3ZlcmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBjb3ZlcmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29udGFpbmluZyA9IGVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gdGltZSAmJiB0aW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgaWYgKGNvbnRhaW5pbmcpIHJldHVybiBjb250YWluaW5nO1xuICAgIGxldCBiZXN0OiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgbGV0IGRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzBdKSwgTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzFdKSk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICBiZXN0ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbi8vIEJ1Y2tldCBvcHRpb25zIGNhbiBjaGFuZ2Ugb3ZlciB0aW1lIChtdWx0aXBsZSBzZWxmIGVudHJpZXMgd2l0aCBkaWZmZXJlbnQgdmFsaWQgd2luZG93cyksIGFuZFxuLy8gdGhlIHN0cnVjdHVyYWwgb25lcyAocmF3RGlzaywgdGhlIGRvd25zdHJlYW0gbGlzdCkgYXJlIGJha2VkIGludG8gdGhlIHN0b3JlIC0gc28gdGhlIHN0b3JlIGlzXG4vLyByZWJ1aWx0IHNob3J0bHkgYWZ0ZXIgZWFjaCBvZiBvdXIgd2luZG93IGJvdW5kYXJpZXMgcGFzc2VzLCBtYWtpbmcgdGhlIG5ld2x5LXZhbGlkIGVudHJ5IGFwcGx5LlxuZnVuY3Rpb24gc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkOiBMb2FkZWRCdWNrZXQpOiB2b2lkIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYm91bmRhcmllcyA9IGxvYWRlZC5zZWxmRW50cmllcy5mbGF0TWFwKHggPT4geC52YWxpZFdpbmRvdykuZmlsdGVyKHQgPT4gdCA+IG5vdyk7XG4gICAgaWYgKCFib3VuZGFyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGxldCBuZXh0Qm91bmRhcnkgPSBNYXRoLm1pbiguLi5ib3VuZGFyaWVzKTtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQSByb3V0aW5nIGNoYW5nZSBtYXkgaGF2ZSBhbHJlYWR5IHJlcGxhY2VkIHRoaXMgc3RvcmU7IG9ubHkgSVQgZ2V0cyBhIGJvdW5kYXJ5IHRpbWVyXG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbG9hZGVkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IG5leHRCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImEgdmFsaWQgd2luZG93IGJvdW5kYXJ5IHBhc3NlZFwiIH0pO1xuICAgICAgICB9KSgpO1xuICAgIH0sIE1hdGgubWluKG5leHRCb3VuZGFyeSAtIG5vdyArIFJFQlVJTERfQk9VTkRBUllfQlVGRkVSLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG59XG5cbi8vIEV4dHJhIHNjYW5zIGFyb3VuZCBlYWNoIG9mIE9VUiB2YWxpZC13aW5kb3cgc3RhcnRzIChhIGRlcGxveSBzd2l0Y2hvdmVyIGlzIGp1c3QgdGhpcyB0b28gLSBpdHNcbi8vIHJlbWFwIGFkZHMgdmFsaWQgd2luZG93cyksIGNhdGNoaW5nIGxhc3QtbW9tZW50IHdyaXRlcyB0aGUgcHJldmlvdXMgd2luZG93J3Mgb3duZXIgYWNjZXB0ZWQgbmVhclxuLy8gdGhlIGJvdW5kYXJ5LiBCeSB0aGUgZmluYWwgc2NhbiB0aGUgcHJldmlvdXMgb3duZXIgaGFzIGZsdXNoZWQgZXZlcnl0aGluZyAoZmFzdCB3cml0ZXMgbmV2ZXJcbi8vIGRlbGF5IHBhc3QgYSB3aW5kb3cncyBlbmQpLCBzbyBub3RoaW5nIGlzIG1pc3NlZC5cbmNvbnN0IEJPVU5EQVJZX1NDQU5fT0ZGU0VUUyA9IFstMzAgKiAxMDAwLCAyICogMTAwMCwgMzAgKiAxMDAwXTtcbi8vIEhvdyBmYXIgYmFjayBhIGJvdW5kYXJ5IHNjYW4gYXNrcyB0aGUgcHJldmlvdXMgb3duZXIgZm9yIGNoYW5nZXM6IGFueXRoaW5nIG9sZGVyIGhhcyBhbHJlYWR5XG4vLyBhcnJpdmVkIHRocm91Z2ggbm9ybWFsIHN5bmNocm9uaXphdGlvbiwgYW5kIHRoaXMgY292ZXJzIHRoZSBsb25nZXN0IGEgd3JpdGUgY2FuIHNpdCB1bmZsdXNoZWRcbmNvbnN0IEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0sgPSBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVkgKyBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcblxuLy8gRWFjaCAoYnVja2V0LCBib3VuZGFyeSwgb2Zmc2V0KSBpcyBzY2hlZHVsZWQgZXhhY3RseSBvbmNlLCBzdXJ2aXZpbmcgc3RvcmUgcmVidWlsZHMgLSB0aGUgdGltZXJcbi8vIHJlLXJlc29sdmVzIHRoZSBidWNrZXQgKGFuZCByZWNvbXB1dGVzIG93bmVycyBmcm9tIHRoZSB0aGVuLWN1cnJlbnQgcm91dGluZykgd2hlbiBpdCBmaXJlc1xuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0YXJ0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHNlbGYudmFsaWRXaW5kb3dbMF07XG4gICAgICAgIGlmIChzdGFydCA+IG5vdyAmJiBzdGFydCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBzdGFydHMuYWRkKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzdGFydCBvZiBzdGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0IG9mIEJPVU5EQVJZX1NDQU5fT0ZGU0VUUykge1xuICAgICAgICAgICAgbGV0IGF0ID0gc3RhcnQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYXQgPD0gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18JHtvZmZzZXR9YDtcbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICAgICAgbGV0IGFybSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGltZXIgbGVuZ3RoIGlzIGNhcHBlZCAoZmFyLWZ1dHVyZSBib3VuZGFyaWVzKSwgc28gcmUtYXJtIHVudGlsIHRoZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgb2Zmc2V0KS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgICAgICAgICAgfSwgTWF0aC5taW4oYXQgLSBEYXRlLm5vdygpLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICAgICAgICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJvdW5kYXJ5U2NhbihidWNrZXRLZXk6IHN0cmluZywgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFiZWwgPSBgYnVja2V0ICR7YnVja2V0S2V5fSwgd2luZG93IHN0YXJ0aW5nICR7bmV3IERhdGUod2luZG93U3RhcnQpLnRvSVNPU3RyaW5nKCl9LCBvZmZzZXQgJHtvZmZzZXQgLyAxMDAwfXNgO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoYnVja2V0S2V5KSkge1xuICAgICAgICAvLyBCb3VuZGFyeSBzY2FucyBuZXZlciBydW4gaW4gcGFyYWxsZWw7IGEgc2xvdyBvbmUgc2ltcGx5IHN3YWxsb3dzIGxhdGVyIHNjaGVkdWxlZCBwb2ludHNcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIGJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogdGhlIHByZXZpb3VzIGJvdW5kYXJ5IHNjYW4gaXMgc3RpbGwgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmFkZChidWNrZXRLZXkpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChidWNrZXRLZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RvcmUgPSBsb2FkZWQuc3RvcmU7XG4gICAgICAgIGlmICghKHN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgcmV0dXJuO1xuICAgICAgICAvLyBPd25lcnMgYXJlIHJlY29tcHV0ZWQgYXQgZmlyZSB0aW1lIC0gdGhlIHJvdXRpbmcgKG9yIHRoZSB0YWtlb3ZlciByZW1hcCkgbWF5IGhhdmVcbiAgICAgICAgLy8gY2hhbmdlZCBzaW5jZSB0aGlzIHNjYW4gd2FzIHNjaGVkdWxlZFxuICAgICAgICBsZXQgZWZmZWN0aXZlID0gYXBwbHlEZXBsb3lSZW1hcChsb2FkZWQucm91dGluZyk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgbGV0IHNlbHZlcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZykuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA9PT0gd2luZG93U3RhcnQpO1xuICAgICAgICBpZiAoIXNlbHZlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgICAgICBsZXQgbmVlZERpc2tTY2FuID0gZmFsc2U7XG4gICAgICAgIC8vIHNvdXJjZUluZGV4IC0+IHRoZSBzbGljZSBvZiBvdXIgcm91dGUgdGhhdCBzb3VyY2Ugb3duZWQgaW4gdGhlIHByZXZpb3VzIHdpbmRvd1xuICAgICAgICBsZXQgcmVtb3RlT3duZXJzID0gbmV3IE1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+KCk7XG4gICAgICAgIGZvciAobGV0IHNlbGYgb2Ygc2VsdmVzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgbGV0IGlkeCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgICAgICAgICAvLyBUaGVzZSBzY2FucyBvbmx5IHJ1biBvbiB0aGUgd3JpdGUgbm9kZSAtIHRoZSBmaXJzdCBzb3VyY2UgdmFsaWQgYXQgdGhlIG5ldyB3aW5kb3cnc1xuICAgICAgICAgICAgLy8gc3RhcnQgZm9yIG91ciByb3V0ZS4gQW4gZWFybGllciBlbnRyeSBmdWxseSBjb3ZlcmluZyBvdXIgcm91dGUgbWVhbnMgd3JpdGVzIGdvIHRoZXJlLFxuICAgICAgICAgICAgLy8gYW5kIElUIGRvZXMgdGhlIGJvdW5kYXJ5IHNjYW5zLlxuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVyczogd2Fsa2luZyB0aGUgY29uZmlnIGluIG9yZGVyICh3cml0ZS10YXJnZXQgb3JkZXIpLFxuICAgICAgICAgICAgLy8gZWFjaCBzb3VyY2UgY2xhaW1zIHdoYXRldmVyIHNsaWNlIG9mIG91ciByb3V0ZSBubyBlYXJsaWVyIHNvdXJjZSBhbHJlYWR5IG93bnNcbiAgICAgICAgICAgIGxldCB1bmNvdmVyZWQ6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtbc2VsZlJvdXRlWzBdLCBzZWxmUm91dGVbMV1dXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWZmZWN0aXZlLnNvdXJjZXMubGVuZ3RoICYmIHVuY292ZXJlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGVmZmVjdGl2ZS5zb3VyY2VzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBbd3MsIHdlXSA9IG90aGVyLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmICghKHdzIDw9IHByZXZUaW1lICYmIHByZXZUaW1lIDwgd2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgciA9IG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZzogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGNsYWltZWQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdSBvZiB1bmNvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyID0gcm91dGVJbnRlcnNlY3Rpb24odSwgcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5wdXNoKHUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhaW1lZCA9IGNsYWltZWQgJiYgW01hdGgubWluKGNsYWltZWRbMF0sIGludGVyWzBdKSwgTWF0aC5tYXgoY2xhaW1lZFsxXSwgaW50ZXJbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGludGVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodVswXSA8IGludGVyWzBdKSByZW1haW5pbmcucHVzaChbdVswXSwgaW50ZXJbMF1dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyWzFdIDwgdVsxXSkgcmVtYWluaW5nLnB1c2goW2ludGVyWzFdLCB1WzFdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY292ZXJlZCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBpZiAoIWNsYWltZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmSW5kZXhTZXQuaGFzKGopKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBvd25lciBzaGFyZXMgb3VyIHN0b3JhZ2UgKHNhbWUgbWFjaGluZSArIGJ1Y2tldCwgZS5nLiB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBvZiBhIGRlcGxveSBzd2l0Y2hvdmVyKSwgc28gYSBkaXNrIHJlc2NhbiBzZWVzIGl0cyB3cml0ZXNcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSByZW1vdGVPd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4gJiYgIXJlbW90ZU93bmVycy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IGRpc2tTY2FuPSR7bmVlZERpc2tTY2FufSwgcmVtb3RlIHByZXZpb3VzLXdpbmRvdyBvd25lcnM6ICR7cmVtb3RlT3duZXJzLnNpemV9YCk7XG4gICAgICAgIGlmIChuZWVkRGlza1NjYW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgbGV0IG93bmVyU291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KSBvZiBwcmV2aW91cy13aW5kb3cgb3duZXIgKHNvdXJjZSBpbmRleCAke3NvdXJjZUluZGV4fSkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnKTogTG9hZGVkQnVja2V0IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIC8vIFRoZSBkZXBsb3ktdGFrZW92ZXIgcmVtYXAgaXMgYW4gSU5URVJQUkVUQVRJT04gb3ZlcmxheTogZXZlcnl0aGluZyBiZWhhdmlvcmFsIChzZWxmIGVudHJpZXMsXG4gICAgLy8gd2luZG93cywgZG93bnN0cmVhbSBzb3VyY2VzKSB1c2VzIHRoZSByZW1hcHBlZCB2aWV3LCB3aGlsZSBsb2FkZWQucm91dGluZy9yb3V0aW5nSlNPTiBzdGF5XG4gICAgLy8gdGhlIFNUT1JFRCBjb25maWcgLSBzbyB2ZXJzaW9uIGd1YXJkcywgY2hhbmdlIGRldGVjdGlvbiwgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciBzZWUgKG9yXG4gICAgLy8gcGVyc2lzdCkgdGhlIHJlbWFwXG4gICAgbGV0IGVmZmVjdGl2ZSA9IGFwcGx5RGVwbG95UmVtYXAocm91dGluZyk7XG4gICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKTtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoc2VsZkVudHJpZXMsIERhdGUubm93KCkpO1xuICAgIGxldCBzZWxmSW5kZXggPSAtMTtcbiAgICBpZiAoc2VsZikge1xuICAgICAgICBzZWxmSW5kZXggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgIH1cbiAgICBsZXQgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBpZiAoc2VsZj8ucmF3RGlzaykge1xuICAgICAgICBzdG9yZSA9IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgaXMgdGhlIGJhc2Ugc291cmNlOyBvbmx5IHRoZSByb3V0aW5nIGVudHJpZXMgRE9XTlNUUkVBTSBmcm9tIHVzIChhZnRlciBvdXJcbiAgICAgICAgLy8gY3VycmVudGx5LXZhbGlkIGVudHJ5KSBiZWNvbWUgc3luY2hyb25pemF0aW9uIHNvdXJjZXMuIFVwc3RyZWFtIHNvdXJjZXMgc3luYyBmcm9tIHVzLCBzb1xuICAgICAgICAvLyB3cml0aW5nIHRvIG9yIHNjYW5uaW5nIHRoZW0gd291bGQganVzdCBlY2hvIG91ciBvd24gZGF0YSBiYWNrIChhbmQgbWFrZSBvdXIgYXZhaWxhYmlsaXR5XG4gICAgICAgIC8vIGRlcGVuZCBvbiB0aGVpcnMpLiBBIHNlcnZlciBOT1QgaW4gdGhlIGxpc3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQ6IGl0IGtlZXBzXG4gICAgICAgIC8vIGl0cyBkaXNrIGRhdGEgKHRoZSBjb25maWcgbWF5IHJlLWFkZCBpdCksIGJ1dCBzdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIC0gbm8gb25lXG4gICAgICAgIC8vIGNvbnRhY3RzIGEgcmVtb3ZlZCBzb3VyY2UsIGFuZCBzY2FubmluZy9wdXNoaW5nIGFzIGlmIHdlIHdlcmUgc3RpbGwgb25lIHdvdWxkIGZpZ2h0IHRoZVxuICAgICAgICAvLyByZWFsIGNoYWluLiBUaGUgY29uZmlnLWxldmVsIHZhbGlkV2luZG93IHJpZGVzIG9uIGVhY2ggQXJjaGl2ZXNTb3VyY2U7IHRoZSBkaXNrIHNvdXJjZVxuICAgICAgICAvLyBzaGFyZXMgb3VyIGN1cnJlbnRseS12YWxpZCBlbnRyeSdzIHdpbmRvdyAoaXQgaG9sZHMgb3VyIGNvcHkgb2YgdGhlIGRhdGEpLlxuICAgICAgICBsZXQgb3duSW5kZXhlcyA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgZ2V0cyBubyByb3V0ZSBmaWx0ZXI6IGV2ZXJ5dGhpbmcgaXQgaG9sZHMgaXMgb3VycyB0byBpbmRleCBhbmQgc2VydmVcbiAgICAgICAgbGV0IHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBbe1xuICAgICAgICAgICAgc291cmNlOiBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlciksXG4gICAgICAgICAgICB2YWxpZFdpbmRvdzogc2VsZj8udmFsaWRXaW5kb3cgfHwgRlVMTF9WQUxJRF9XSU5ET1csXG4gICAgICAgIH1dO1xuICAgICAgICBpZiAoc2VsZkluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFRoaXMgc2VydmVyIGlzIG5vdCBpbiB0aGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX07IGtlZXBpbmcgaXRzIGRhdGEgb24gZGlzayBidXQgbm8gbG9uZ2VyIHN5bmNocm9uaXppbmcgaXRgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxmSW5kZXggKyAxOyBpIDwgZWZmZWN0aXZlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgb3duSW5kZXhlcy5oYXMoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIERpc2pvaW50LXNoYXJkIHNvdXJjZXMgbmV2ZXIgdGFsayB0byBlYWNoIG90aGVyOyBhIHBhcnRpYWwgb3ZlcmxhcCBzeW5jcyBvbmx5XG4gICAgICAgICAgICAgICAgLy8gdGhlIGludGVyc2VjdGlvbiAoc2NhbnMgaWdub3JlIHRoZSByZXN0LCB3cml0ZXMgb25seSBzZW5kIG1hdGNoaW5nIGtleXMpXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlZFJvdXRlID0gcm91dGVJbnRlcnNlY3Rpb24oc2VsZj8ucm91dGUsIHNvdXJjZS5yb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFyZWRSb3V0ZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gQSBib3VuZGVkLWNhY2hlIHNlcnZlciAobm9GdWxsU3luYyBvbiBvdXIgb3duIGVudHJ5KSBtdXN0IG5vdCBmdWxsLXN5bmMgZnJvbVxuICAgICAgICAgICAgICAgIC8vIEFOWSBzb3VyY2UsIG9yIGl0cyBkaXNrIHdvdWxkIGZpbGwgcmVnYXJkbGVzcyBvZiB0aGUgbGltaXRcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goeyBzb3VyY2U6IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZSksIHZhbGlkV2luZG93OiBzb3VyY2UudmFsaWRXaW5kb3csIHJvdXRlOiBzaGFyZWRSb3V0ZSwgbm9GdWxsU3luYzogc291cmNlLm5vRnVsbFN5bmMgfHwgc2VsZj8ubm9GdWxsU3luYyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdG9yZSA9IG5ldyBCbG9iU3RvcmUoZm9sZGVyLCBzb3VyY2VzLCB7XG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZDoga2V5ID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlcyBmb3Igb3VyIG93biByb3V0aW5nIHdyaXRlcyBBTkQgcm91dGluZyBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvblxuICAgICAgICAgICAgICAgIC8vIChvbmx5IGV2ZXIgbmV3ZXIgb25lcywgc2VlIElBcmNoaXZlcy5zZXQpIOKAlCBlaXRoZXIgd2F5LCBhcHBseSB0aGUgbmV3IGNvbmZpZ1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZvaWQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogc2VsZj8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogTG9hZGVkQnVja2V0ID0geyBhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzLCBzZWxmLCBzdG9yZSB9O1xuICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZCk7XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGxvYWRlZCA9IGxvYWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgbG9hZGVkKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIGFyZSBub3QgY2FjaGVkIOKAlCB0aGV5IGNhbiBiZSBjcmVhdGVkIGF0IGFueSB0aW1lIChndWFyZGluZyBhZ2FpbnN0IGFcbiAgICAgICAgLy8gY29uY3VycmVudCBjcmVhdGUgaGF2aW5nIGFscmVhZHkgcmVwbGFjZWQgb3VyIGVudHJ5KVxuICAgICAgICB2b2lkIGxvYWRlZC50aGVuKGJ1Y2tldCA9PiB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCAmJiBidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbi8vIFJvdXRpbmcgcmVsb2FkcyBhcmUgc2VyaWFsaXplZCBwZXIgYnVja2V0LCBzbyBjb25jdXJyZW50IHdyaXRlcy9zeW5jcyBjYW4ndCByZWJ1aWxkIHRoZSBzYW1lXG4vLyBzdG9yZSB0d2ljZSBpbiBwYXJhbGxlbFxuY29uc3Qgcm91dGluZ1JlbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcbmZ1bmN0aW9uIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBuZXh0ID0gKHJvdXRpbmdSZWxvYWRzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgICAudGhlbigoKSA9PiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQsIGJ1Y2tldE5hbWUsIGNvbmZpZykpXG4gICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYFJlbG9hZGluZyByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6YCwgZSkpO1xuICAgIHJvdXRpbmdSZWxvYWRzLnNldChrZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGl0IGlzIG5ldmVyIHB1bGxlZCBmcm9tIGFub3RoZXJcbiAgICAvLyBzb3VyY2UgKGl0IHJlYWNoZXMgdXMgZXhjbHVzaXZlbHkgYXMgYSB2ZXJzaW9uLXZhbGlkYXRlZCB3cml0ZSwgd2hpY2ggbGFuZHMgb24gZGlzayBmaXJzdClcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgaWYgKCFjb25maWc/LmZvcmNlICYmIEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpID09PSBsb2FkZWQucm91dGluZ0pTT04pIHJldHVybjtcbiAgICBpZiAoY29uZmlnPy5mb3JjZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7Y29uZmlnLnJlYXNvbiB8fCBcImZvcmNlZFwifSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgUm91dGluZyBjb25maWcgY2hhbmdlZCBmb3IgYnVja2V0ICR7a2V5fSwgcmVidWlsZGluZyBpdHMgc3RvcmVgKTtcbiAgICB9XG4gICAgaWYgKGxvYWRlZC5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICBhd2FpdCBsb2FkZWQuc3RvcmUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBidWNrZXRzLnNldChrZXksIFByb21pc2UucmVzb2x2ZShidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKSkpO1xufVxuXG4vLyBQZXItd3JpdGUgb3B0aW9ucyBhcmUgZXZhbHVhdGVkIGF0IHRoZSBXUklURSdzIHRpbWUgKGFuZCB0aGUga2V5J3Mgcm91dGUpLCBub3QgdGhlIGN1cnJlbnRcbi8vIGNvbmZpZzogdGhlIHdyaXRlIHRpbWUgaXMgc3RhbXBlZCBleGFjdGx5IG9uY2UgKGF0IHRoZSBmaXJzdCBub2RlIHRoYXQgcmVjZWl2ZXMgdGhlIHdyaXRlKSBhbmRcbi8vIHByb3BhZ2F0ZXMgd2l0aCB0aGUgZGF0YSwgc28gZXZlcnkgbm9kZSByZXNvbHZlcyB0aGUgc2FtZSBzZWxmIGVudHJ5IC0gYW5kIHRoZSBzYW1lIG9wdGlvbnMuXG5mdW5jdGlvbiBnZXRXcml0ZUNvbmZpZyhidWNrZXQ6IExvYWRlZEJ1Y2tldCwgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB7IGZhc3Q/OiBib29sZWFuOyB3cml0ZURlbGF5PzogbnVtYmVyIH0ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgcm91dGUpO1xuICAgIHJldHVybiB7IGZhc3Q6IHNlbGY/LmZhc3QsIHdyaXRlRGVsYXk6IHNlbGY/LndyaXRlRGVsYXkgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydE11dGFibGUoYnVja2V0OiBMb2FkZWRCdWNrZXQsIGZpbGVQYXRoOiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCBnZXRSb3V0ZShmaWxlUGF0aCkpO1xuICAgIGlmICghc2VsZj8uaW1tdXRhYmxlKSByZXR1cm47XG4gICAgaWYgKGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2J1Y2tldC5hY2NvdW50fS8ke2J1Y2tldC5idWNrZXROYW1lfSBpcyBpbW11dGFibGUgKGF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9KSBhbmQgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IGFscmVhZHkgZXhpc3RzLCBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiB0b2ApO1xuICAgIH1cbn1cblxuLy8gV3JvbmctdGFyZ2V0IHJlamVjdGlvbnMgYXJlIHJhcmUgYW5kIGltcG9ydGFudCAodGhleSBBUkUgdGhlIHN3aXRjaG92ZXIgaGFuZG9mZiksIGJ1dCBhIGJ1cnN0IG9mXG4vLyByYWNpbmcgd3JpdGVzIGF0IGEgYm91bmRhcnkgbXVzdCBub3QgZmxvb2QgdGhlIGxvZyAtIHNvIGF0IG1vc3Qgb25lIGxpbmUgYSBtaW51dGVcbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbi8vIFJvdXRpbmcgd3JpdGVzIGFyZSBzZXJpYWxpemVkIHBlciBidWNrZXQsIHNvIHR3byBjb25jdXJyZW50IGNyZWF0ZXMgY2FuJ3QgYm90aCBidWlsZCBhIHN0b3JlXG4vLyAodGhlIGxvc2VyJ3Mgc3RvcmUgd291bGQgbGVhayB3aXRoIGl0cyBzeW5jIGxvb3BzIHJ1bm5pbmcgZm9yZXZlcilcbmNvbnN0IHJvdXRpbmdXcml0ZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgLy8gVmFsaWRhdGVzIGJlZm9yZSBzdG9yaW5nIGFueXRoaW5nLCBzbyBhIGJhZCBjb25maWcgY2FuJ3QgYnJpY2sgdGhlIGJ1Y2tldFxuICAgIGxldCBpbmNvbWluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuc2V0KFJPVVRJTkdfRklMRSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZz8ubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICBidWNrZXRzLnNldChrZXksIFByb21pc2UucmVzb2x2ZShidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCBpbmNvbWluZykpKTtcbiAgICAgICAgY29uc29sZS5sb2coYENyZWF0ZWQgYnVja2V0ICR7a2V5fWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgY2hhbmdlZCBjb25maWcgbXVzdCBjYXJyeSBhIGhpZ2hlciB2ZXJzaW9uIHRoYW4gdGhlIG9uZSBjdXJyZW50bHkgc3RvcmVkIOKAlCBvdGhlcndpc2UgdHdvXG4gICAgLy8gY2xpZW50cyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGF0IHRoZSBzYW1lIHZlcnNpb24gd291bGQga2VlcCBjbG9iYmVyaW5nIGVhY2ggb3RoZXIuIFNhbWVcbiAgICAvLyBjb250ZW50IGF0IGFueSB2ZXJzaW9uIGlzIGEgaGFybWxlc3Mgbm8tb3AgYW5kIGlzIGFsbG93ZWQgdGhyb3VnaC5cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpICE9PSBsb2FkZWQucm91dGluZ0pTT04gJiYgZ2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZykgPD0gZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXBkYXRlIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9OiB0aGUgbmV3IGNvbmZpZyBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgb25lIGJ1dCBpdHMgdmVyc2lvbiAoJHtnZXRDb25maWdWZXJzaW9uKGluY29taW5nKX0pIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiAoJHtnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKX0pLiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gdG8gdXBkYXRlIGl0LiBDdXJyZW50OiAke2xvYWRlZC5yb3V0aW5nSlNPTn0uIEF0dGVtcHRlZDogJHtKU09OLnN0cmluZ2lmeShpbmNvbWluZyl9YCk7XG4gICAgfVxuICAgIC8vIFJvdXRpbmcgd3JpdGVzIGJ5cGFzcyBmYXN0IG1vZGUgKHRoZSBjb25maWcgbXVzdCBhcHBseSBpbW1lZGlhdGVseSBhbmQgc3Vydml2ZSBhIGNyYXNoKVxuICAgIC8vIGFuZCBpZ25vcmUgaW1tdXRhYmxlICh0aGUgcm91dGluZyBmaWxlIG11c3QgYWx3YXlzIHN0YXkgdXBkYXRhYmxlKS4gQW4gb2xkZXIgbGFzdE1vZGlmaWVkXG4gICAgLy8gbm8tb3BzIGluc2lkZSBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIHJlbG9hZCBiZWxvdyBzZWVzIG5vIGNoYW5nZS5cbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KFJPVVRJTkdfRklMRSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZz8ubGFzdE1vZGlmaWVkIH0pO1xuICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQnVja2V0RmlsZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgIGlmIChmaWxlUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAgICAgbGV0IHJ1biA9IChyb3V0aW5nV3JpdGVzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKCgpID0+IHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50LCBidWNrZXROYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgLy8gVGhlIGNoYWluIG11c3Qgc3Vydml2ZSBhIGZhaWxlZCB3cml0ZSwgc28gdGhlIHN0b3JlZCBsaW5rIHN3YWxsb3dzIHRoZSBlcnJvciAodGhlIGNhbGxlclxuICAgICAgICAvLyBzdGlsbCBnZXRzIGl0IGZyb20gcnVuKVxuICAgICAgICByb3V0aW5nV3JpdGVzLnNldChrZXksIHJ1bi50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW47XG4gICAgfVxuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgfVxuICAgIC8vIFRoZSB3cml0ZSB0aW1lIGlzIGRldGVybWluZWQgZXhhY3RseSBvbmNlLCBIRVJFIGF0IHRoZSBmaXJzdCBub2RlIHRoYXQgcmVjZWl2ZXMgdGhlIHdyaXRlO1xuICAgIC8vIGl0IHByb3BhZ2F0ZXMgYXMgbGFzdE1vZGlmaWVkLCBzbyBldmVyeSBub2RlIGV2YWx1YXRlcyB0aGUgYnVja2V0IG9wdGlvbnMgYXQgdGhlIHNhbWUgaW5zdGFudFxuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgIC8vIE9ubHkgZnJlc2hseS1zdGFtcGVkIHdyaXRlcyBhcmUgY2hlY2tlZDogYSB3cml0ZSB3aXRoIGFuIGV4cGxpY2l0IGxhc3RNb2RpZmllZCBpc1xuICAgIC8vIHN5bmNocm9uaXphdGlvbi9iYWNrZmlsbCAob2xkIGRhdGEgbGVnaXRpbWF0ZWx5IGxhbmRzIG9uIHNvdXJjZXMgd2hvc2Ugd2luZG93IGhhcyBtb3ZlZCBvbiksXG4gICAgLy8gYnV0IGEgZnJlc2ggd3JpdGUgcmVhY2hpbmcgdXMgb3V0c2lkZSBvdXIgd2luZG93cy9yb3V0ZXMgbWVhbnMgdGhlIGNsaWVudCByZXNvbHZlZCBpdHNcbiAgICAvLyB0YXJnZXQgZnJvbSBhIHN0YWxlIHZpZXcgLSBpdCBtdXN0IHJlLXJlc29sdmUgYW5kIHJldHJ5IGF0IHRoZSBjb3JyZWN0IHNvdXJjZS5cbiAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShmaWxlUGF0aCk7XG4gICAgaWYgKCFjb25maWc/Lmxhc3RNb2RpZmllZCAmJiBsb2FkZWQuc2VsZkVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSBsb2FkZWQuc2VsZkVudHJpZXMuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gLSBXUklURV9QQVNUX1dJTkRPV19HUkFDRSAmJiB3cml0ZVRpbWUgPD0geC52YWxpZFdpbmRvd1sxXSArIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gZXZlbiB3aXRoIHRoZSAke1dSSVRFX1BBU1RfV0lORE9XX0dSQUNFfW1zIGdyYWNlIChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gVGhpcyBzZXJ2ZXIgaXMgbm90IGEgdmFsaWQgd3JpdGUgdGFyZ2V0IGF0ICR7d3JpdGVUaW1lfSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAob3VyIHZhbGlkIHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0pLiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRpbWVWYWxpZC5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9KSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAob3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF3YWl0IGFzc2VydE11dGFibGUobG9hZGVkLCBmaWxlUGF0aCwgd3JpdGVUaW1lKTtcbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KGZpbGVQYXRoLCBkYXRhLCB7IC4uLmdldFdyaXRlQ29uZmlnKGxvYWRlZCwgd3JpdGVUaW1lLCByb3V0ZSksIGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0KTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBwcm9ncmVzcyA9IGJ1Y2tldC5zdG9yZS5nZXRTeW5jUHJvZ3Jlc3M/LigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiAhIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgIC8vIFRoZSByZW1hcHBlZCAoaW50ZXJwcmV0YXRpb24pIHZpZXc6IGdldENvbmZpZyBpcyBob3cgY2xpZW50cyBsZWFybiBvZiBhbiBpbi1wcm9ncmVzc1xuICAgICAgICAvLyBkZXBsb3kgdGFrZW92ZXIsIHNpbmNlIHRoZSByZW1hcCBpcyBuZXZlciB3cml0dGVuIGludG8gdGhlIHJvdXRpbmcgZmlsZSBpdHNlbGZcbiAgICAgICAgcmVtb3RlQ29uZmlnOiBhcHBseURlcGxveVJlbWFwKGJ1Y2tldC5yb3V0aW5nKSxcbiAgICAgICAgaW5kZXg6IHByb2dyZXNzPy5pbmRleCxcbiAgICAgICAgaW5kZXhTb3VyY2VzOiBwcm9ncmVzcz8uc291cmNlcyxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBwcm9ncmVzcz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICBzeW5jaW5nOiBwcm9ncmVzcz8uc3luY2luZyxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi5idWNrZXRzLmtleXMoKV0pIHtcbiAgICAgICAgbGV0IHNsYXNoID0ga2V5LmluZGV4T2YoXCIvXCIpO1xuICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoa2V5LnNsaWNlKDAsIHNsYXNoKSwga2V5LnNsaWNlKHNsYXNoICsgMSksIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJkZXBsb3kgdGFrZW92ZXIgc3RhdGUgY2hhbmdlZFwiIH0pO1xuICAgIH1cbn1cblxub25UYWtlb3ZlckV2ZW50KGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQgPT09IFwicmVtYXBDaGFuZ2VkXCIpIHtcbiAgICAgICAgLy8gVGhlIHJlYnVpbGQgYXBwbGllcyB0aGUgcmVtYXBwZWQgd2luZG93cywgYW5kIHNjaGVkdWxlQm91bmRhcnlTY2FucyAocGFydCBvZiB0aGVcbiAgICAgICAgLy8gcmVidWlsZCkgc2NoZWR1bGVzIHRoZSBoYW5kb2ZmIHNjYW5zIGFyb3VuZCB0aGUgbmV3IHdpbmRvd3MnIHN0YXJ0c1xuICAgICAgICB2b2lkIHJlYnVpbGRBbGxMb2FkZWRCdWNrZXRzKCk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckJ1Y2tldEluZm8gPSB7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIC8vIExvYWRlZCBpbiBtZW1vcnkgKGNyZWF0ZWQgb3IgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cCksIHNvIGl0cyBzeW5jaHJvbml6YXRpb24gaXMgcnVubmluZ1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICBjb25maWc/OiBBcmNoaXZlc0NvbmZpZztcbiAgICBlcnJvcj86IHN0cmluZztcbn07XG5cbi8qKiBFdmVyeSBidWNrZXQgdGhlIGFjY291bnQgaGFzIG9uIHRoaXMgc2VydmVyLCBhY3RpdmUgb3Igbm90LCBlYWNoIHdpdGggaXRzIGNvbmZpZ3VyYXRpb24uXG4gKiAgSW5hY3RpdmUgYnVja2V0cyBhcmUgaW5zcGVjdGVkIHN0cmFpZ2h0IGZyb20gZGlzayBXSVRIT1VUIGxvYWRpbmcgdGhlbSAtIGxvYWRpbmcgd291bGQgc3RhcnRcbiAqICB0aGVpciBzeW5jaHJvbml6YXRpb24sIGFuZCBvbGQgaW52YWxpZCBidWNrZXRzIG11c3Qgc3RheSBpbmVydCAodGhlaXIgcGFyc2UgZXJyb3IgaXMgcmVwb3J0ZWRcbiAqICBpbnN0ZWFkKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgYWNjb3VudEZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQpO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgdHJ5IHtcbiAgICAgICAgbmFtZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGFjY291bnRGb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCByZXN1bHRzOiBTZXJ2ZXJCdWNrZXRJbmZvW10gPSBbXTtcbiAgICBmb3IgKGxldCBidWNrZXROYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWApO1xuICAgICAgICBpZiAobG9hZGVkUHJvbWlzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogdHJ1ZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBlcnJvcjogYE5vIHJvdXRpbmcgZmlsZSAoJHtST1VUSU5HX0ZJTEV9KWAgfSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBjb25maWc6IHsgcmVtb3RlQ29uZmlnOiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpIH0gfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgZGVsZXRlZCAob3ZlcndyaXRlIGl0IHRvIGNoYW5nZSB0aGUgYnVja2V0J3MgY29uZmlndXJhdGlvbilgKTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kZWwoZmlsZVBhdGgsIGdldFdyaXRlQ29uZmlnKGxvYWRlZCwgRGF0ZS5ub3coKSwgZ2V0Um91dGUoZmlsZVBhdGgpKSk7XG59XG5cbi8vIOKUgOKUgCBsb2NhbCBJQXJjaGl2ZXMgYWNjZXNzIOKUgOKUgFxuXG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuLy8gVGhlIGluLXByb2Nlc3MgSUFyY2hpdmVzIGZvciBhIGJ1Y2tldCBob3N0ZWQgYnkgVEhJUyBzZXJ2ZXIg4oCUIHVzZWQgd2hlbiBhIFJlbW90ZUNvbmZpZyBzb3VyY2Vcbi8vIFVSTCBwb2ludHMgYXQgb3Vyc2VsdmVzLCBzbyB3ZSBkb24ndCB0YWxrIHRvIG91cnNlbHZlcyBvdmVyIEhUVFBTLiBPbmUgc2luZ2xldG9uIHBlciBidWNrZXQuXG5jbGFzcyBBcmNoaXZlc0xvY2FsQnVja2V0IGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjY291bnQ6IHN0cmluZywgcHJpdmF0ZSBidWNrZXROYW1lOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWNrZXQoKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExvYWRlZEJ1Y2tldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGBsb2NhbEJ1Y2tldC8ke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9YDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHdyaXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUJ1Y2tldEZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdC4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGFzc2VydE11dGFibGUoYnVja2V0LCBjb25maWcucGF0aCwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IGJ1Y2tldC5zdG9yZS5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5hcHBlbmRMYXJnZVVwbG9hZChpZCwgZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmZpbmlzaExhcmdlVXBsb2FkKGlkLCBjb25maWcucGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybChgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS9maWxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWNjb3VudCl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYnVja2V0TmFtZSl9YCwgZmlsZVBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIC8vIE1pc3NpbmcgYnVja2V0cyBzYXkgdHJ1ZSwgbWF0Y2hpbmcgd2hhdCB0aGV5IGJlY29tZSBvbmNlIGNyZWF0ZWQgKHRoZSBkZWZhdWx0IHN0b3JlIHR5cGUpXG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSB9O1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIodGltZTogbnVtYmVyKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgZ2V0Q2hhbmdlc0FmdGVyIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBpbmRleClgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcih0aW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBhbGxTY2Fuc0NvbXBsZXRlOiB0cnVlLCBpbmRleFNpemU6IDAsIHNvdXJjZXM6IFtdIH07XG4gICAgICAgIGlmICghYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBzeW5jaHJvbml6YXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKCk7XG4gICAgfVxufVxuXG5jb25zdCBsb2NhbEFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbEFyY2hpdmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGV4aXN0aW5nID0gbG9jYWxBcmNoaXZlcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgYXJjaGl2ZXMgPSBuZXcgQXJjaGl2ZXNMb2NhbEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsb2NhbEFyY2hpdmVzLnNldChrZXksIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG4iXX0=
779
- /* _JS_SOURCE_HASH = "6ace0ce6415bbf3792600230bb9c1d0508f83f5cd88aa66ba4660878112f254d"; */
778
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUF5RjtBQUN6RixxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUs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QUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLDJFQUEyRSxDQUFDLENBQUM7UUFDMUksQ0FBQztRQUNELE9BQU8sTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDSjtBQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBQ25ELFNBQWdCLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLElBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBJQXJjaGl2ZXMsIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLFxuICAgIEFyY2hpdmVzU3luY1N0YXR1cywgRlVMTF9WQUxJRF9XSU5ET1csXG4gICAgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UsIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHBhcnNlSG9zdGVkVXJsLCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgYXBwbHlEZXBsb3lSZW1hcCwgZ2V0VGFrZW92ZXJBbHRQb3J0LCBvblRha2VvdmVyRXZlbnQgfSBmcm9tIFwiLi9kZXBsb3lUYWtlb3ZlclwiO1xuaW1wb3J0IHsgY3JlYXRlQXBpQXJjaGl2ZXMgfSBmcm9tIFwiLi9jcmVhdGVBcmNoaXZlc1wiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbi8vIFRoZSBzdG9yYWdlIHNlcnZlcidzIGdsb2JhbCBzZXJ2ZXItc2lkZSBzdGF0ZS4gaG9zdFN0b3JhZ2VTZXJ2ZXIgc2V0cyB0aGUgY29uZmlnIG9uY2UgYXRcbi8vIHN0YXJ0dXA7IGV2ZXJ5dGhpbmcgZWxzZSAoc3lzdGVtIHN0b3JhZ2VzLCBidWNrZXRzKSBpcyBhIGdsb2JhbCBjYWNoZSBjcmVhdGVkIGxhemlseSBvbiBmaXJzdFxuLy8gdXNlLCB0aHJvd2luZyBpZiB0aGUgY29uZmlnIHdhcyBuZXZlciBzZXQuXG4vL1xuLy8gQnVja2V0cyBoYXZlIG5vIHNlcGFyYXRlIHJlZ2lzdHJ5OiBlYWNoIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBsaXZlcyBpbnNpZGUgdGhlXG4vLyBidWNrZXQgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIEEgYnVja2V0IGV4aXN0cyBpZmYgdGhhdCBmaWxlIGV4aXN0cy4gV3JpdGluZyBpdCBjcmVhdGVzIHRoZVxuLy8gYnVja2V0IChidWlsZGluZyBpdHMgc3RvcmUsIHdoaWNoIG1heSBpbW1lZGlhdGVseSBzdGFydCBzeW5jaHJvbml6YXRpb24gc2NhbnMpOyBvdmVyd3JpdGluZyBpdCDigJRcbi8vIGRpcmVjdGx5IG9yIHZpYSBhIGZpbGUgcHVsbGVkIGluIGZyb20gYSBzeW5jaHJvbml6YXRpb24gc291cmNlIOKAlCByZWJ1aWxkcyB0aGUgc3RvcmUgd2l0aCB0aGUgbmV3XG4vLyBzb3VyY2VzIChjYW5jZWxsaW5nIHRoZSBvbGQgc3RvcmUncyBzY2FucykuXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHJvb3REb21haW46IHN0cmluZztcbiAgICAvLyB1c2VyQGV4dGVybmFsSXAgb2YgdGhlIHN0b3JhZ2UgbWFjaGluZSwgZm9yIGdlbmVyYXRlZCBzc2ggY29tbWFuZHNcbiAgICBzc2hUYXJnZXQ6IHN0cmluZztcbiAgICAvLyBBYnNvbHV0ZSBjb21tYW5kIHRoYXQgcnVucyB0aGUgZ3JhbnRBY2Nlc3MgQ0xJIG9uIHRoZSBzdG9yYWdlIG1hY2hpbmUgKGFkbWluIGFyZ3MgYXBwZW5kZWQpXG4gICAgc2VydmVyQ29tbWFuZDogc3RyaW5nO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyByb290IHN0b3JhZ2UgZm9sZGVyIChhYnNvbHV0ZSlcbiAgICBmb2xkZXI6IHN0cmluZztcbn07XG5cbmxldCBjb25maWc6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmFnZVNlcnZlckNvbmZpZyh2YWx1ZTogU3RvcmFnZVNlcnZlckNvbmZpZyk6IHZvaWQge1xuICAgIGNvbmZpZyA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgKHRoaXMgQVBJIG9ubHkgd29ya3Mgb24gdGhlIHN0b3JhZ2Ugc2VydmVyKWApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuLy8gRm9yIHNlbGYtZGV0ZWN0aW9uOiBjb2RlIHRoYXQgQ0FOIHJ1biBvdXRzaWRlIHRoZSBzdG9yYWdlIHNlcnZlciAoY3JlYXRlQXJjaGl2ZXMpIHVzZXMgdGhpcyB0b1xuLy8gY2hlY2sgXCJpcyB0aGlzIFVSTCBvdXIgb3duIHByb2Nlc3M/XCIgd2l0aG91dCB0aHJvd2luZy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxuLy8gV2hlbiBzZXQsIGFsbCB3cml0ZS1wYXRoIG9wZXJhdGlvbnMgKGNyZWF0aW5nIGZpbGVzLCBhcHBlbmRpbmcgbGFyZ2UgdXBsb2FkcywgY3JlYXRpbmcgYnVja2V0cylcbi8vIHRocm93IHRoaXMgbWVzc2FnZS4gUmVhZHMsIGZpbmRJbmZvLCBhbmQgZGVsZXRlcyBzdGlsbCB3b3JrIOKAlCBzbyBjbGllbnRzIGNhbiBmcmVlIHNwYWNlLiBNYW5hZ2VkXG4vLyBieSBob3N0U3RvcmFnZVNlcnZlcidzIGRpc2stc3BhY2UgbW9uaXRvci5cbmxldCB3cml0ZXNSZWplY3RlZFJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgd3JpdGVzUmVqZWN0ZWRSZWFzb24gPSByZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gd3JpdGVzUmVqZWN0ZWRSZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V3JpdGVzQWxsb3dlZCgpOiB2b2lkIHtcbiAgICBpZiAod3JpdGVzUmVqZWN0ZWRSZWFzb24pIHRocm93IG5ldyBFcnJvcih3cml0ZXNSZWplY3RlZFJlYXNvbik7XG59XG5cbi8vIFRoZSBzeXN0ZW0gc3RvcmFnZXMgKHRydXN0LCByZXF1ZXN0cykgYXJlIHRoZSBzYW1lIGtpbmQgb2YgdGhpbmcg4oCUIGEgSlNPTiBrZXkvdmFsdWUgc3RvcmUgdW5kZXJcbi8vIDxmb2xkZXI+L3N5c3RlbTIvPG5hbWU+IOKAlCBzbyB0aGV5IHNoYXJlIG9uZSBjYWNoZSwga2V5ZWQgYnkgbmFtZS4gKFwic3lzdGVtMlwiIGJlY2F1c2UgdGhlIGxheW91dFxuLy8gY2hhbmdlZCB3aGVuIGJ1Y2tldCBjb25maWdzIG1vdmVkIGludG8gdGhlIGJ1Y2tldHMgdGhlbXNlbHZlczsgb2xkIFwic3lzdGVtXCIvXCJidWNrZXRzXCIgZm9sZGVyc1xuLy8gYXJlIHNpbXBseSBpZ25vcmVkLilcbi8vIHNldFRydXN0ZWRNYWNoaW5lcyBpcyBjYWxsZWQgYnkgY29uc3VtZXJzIEJFRk9SRSBzdGFydGluZyB0aGUgc2VydmVyLCBzbyB3aGVuIHRoZSBjb25maWcgaXNuJ3Rcbi8vIHNldCB5ZXQgd2UgZmFsbCBiYWNrIHRvIHRoZSBzYW1lIC0tZm9sZGVyIGFyZyB0aGUgQ0xJIHN0YXJ0cyB0aGUgc2VydmVyIHdpdGguXG5mdW5jdGlvbiBnZXRTdG9yYWdlRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmIChjb25maWcpIHJldHVybiBjb25maWcuZm9sZGVyO1xuICAgIGxldCBmb2xkZXIgPSBnZXRBcmcoXCJmb2xkZXJcIik7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHRoZXJlIGlzIG5vIC0tZm9sZGVyIGFyZywgc28gdGhlIHN0b3JhZ2UgZm9sZGVyIGlzIHVua25vd25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmb2xkZXIpO1xufVxuXG5jb25zdCBzeXN0ZW1TdG9yYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPElTdG9yYWdlPHVua25vd24+Pj4oKTtcbmZ1bmN0aW9uIGdldFN5c3RlbVN0b3JhZ2U8VD4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxJU3RvcmFnZTxUPj4ge1xuICAgIGxldCBzdG9yYWdlID0gc3lzdGVtU3RvcmFnZXMuZ2V0KG5hbWUpO1xuICAgIGlmICghc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByb290ID0gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyKGdldFN0b3JhZ2VGb2xkZXIoKSk7XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gYXdhaXQgcm9vdC5mb2xkZXIuZ2V0U3RvcmFnZShcInN5c3RlbTJcIik7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25OYW1lID0gXCJzdG9yYWdlXCIgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTx1bmtub3duPihuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGF3YWl0IHN5c3RlbS5mb2xkZXIuZ2V0U3RvcmFnZShuYW1lKSwgdHJhbnNhY3Rpb25OYW1lKSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHN5c3RlbVN0b3JhZ2VzLnNldChuYW1lLCBzdG9yYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2UgYXMgUHJvbWlzZTxJU3RvcmFnZTxUPj47XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJ1c3QoKTogUHJvbWlzZTxJU3RvcmFnZTxUcnVzdFJlY29yZD4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxUcnVzdFJlY29yZD4oXCJ0cnVzdFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0cygpOiBQcm9taXNlPElTdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+KFwicmVxdWVzdHNcIik7XG59XG5cbi8qKiBNYWtlcyBtYWNoaW5lSWRzIHRoZSBjb21wbGV0ZSB0cnVzdCBsaXN0IGZvciB0aGUgYWNjb3VudDogbWFjaGluZXMgbm90IGluIHRoZSBsaXN0IGxvc2UgYWNjZXNzLCBtYWNoaW5lcyBhbHJlYWR5IHRydXN0ZWQga2VlcCB0aGVpciBleGlzdGluZyByZWNvcmQsIGFuZCBtaXNzaW5nIG9uZXMgYXJlIGFkZGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRydXN0ZWRNYWNoaW5lcyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBtYWNoaW5lSWRzOiBzdHJpbmdbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgcHJlZml4ID0gYCR7Y29uZmlnLmFjY291bnR9fGA7XG4gICAgbGV0IGRlc2lyZWQgPSBuZXcgU2V0KGNvbmZpZy5tYWNoaW5lSWRzKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgYXdhaXQgdHJ1c3QuZ2V0S2V5cygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIGlmIChkZXNpcmVkLmhhcyhtYWNoaW5lSWQpKSB7XG4gICAgICAgICAgICBkZXNpcmVkLmRlbGV0ZShtYWNoaW5lSWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIHRydXN0IGZvciBtYWNoaW5lICR7bWFjaGluZUlkfSBvbiBhY2NvdW50ICR7Y29uZmlnLmFjY291bnR9YCk7XG4gICAgICAgIGF3YWl0IHRydXN0LnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBtYWNoaW5lSWQgb2YgZGVzaXJlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWRkaW5nIHRydXN0IGZvciBtYWNoaW5lICR7bWFjaGluZUlkfSBvbiBhY2NvdW50ICR7Y29uZmlnLmFjY291bnR9YCk7XG4gICAgICAgIGF3YWl0IHRydXN0LnNldChgJHtwcmVmaXh9JHttYWNoaW5lSWR9YCwgeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbWFjaGluZUlkLCBpcDogXCJcIiwgdGltZTogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG59XG5cbi8vIOKUgOKUgCBidWNrZXRzIOKUgOKUgFxuXG5leHBvcnQgdHlwZSBMb2FkZWRCdWNrZXQgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAvLyBUaGUgYnVja2V0J3MgcGFyc2VkIHJvdXRpbmcgY29uZmlnICh0aGUgY29udGVudHMgb2YgUk9VVElOR19GSUxFKVxuICAgIHJvdXRpbmc6IFJlbW90ZUNvbmZpZztcbiAgICAvLyBKU09OIG9mIHJvdXRpbmcsIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgcm91dGluZ0pTT046IHN0cmluZztcbiAgICAvLyBBTEwgb2Ygb3VyIG93biBlbnRyaWVzIGluIHJvdXRpbmcuc291cmNlcyAodGhpcyBidWNrZXQgb24gdGhpcyBzZXJ2ZXIpLiBNb3JlIHRoYW4gb25lIHdoZW5cbiAgICAvLyB0aGUgYnVja2V0J3Mgb3B0aW9ucyBjaGFuZ2Ugb3ZlciB0aW1lIC0gb25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cgKGUuZy4gaW1tdXRhYmxlIGRyb3BwZWQsXG4gICAgLy8gb3IgZmFzdCBlbmFibGVkLCBzdGFydGluZyBhdCBhIHNjaGVkdWxlZCBpbnN0YW50KS5cbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgLy8gVGhlIGVudHJ5IHZhbGlkIHdoZW4gdGhlIHN0b3JlIHdhcyBidWlsdCAtIHRoZSBzdHJ1Y3R1cmFsIG9wdGlvbnMgKHJhd0Rpc2ssIHdoaWNoIGVudHJpZXNcbiAgICAvLyBhcmUgZG93bnN0cmVhbSkuIFBlci13cml0ZSBvcHRpb25zIChmYXN0L2ltbXV0YWJsZSkgYXJlIGluc3RlYWQgZXZhbHVhdGVkIGF0IGVhY2ggd3JpdGUnc1xuICAgIC8vIHRpbWUsIHNlZSBnZXRXcml0ZUNvbmZpZy9hc3NlcnRNdXRhYmxlLiB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRvZXNuJ3QgbWVudGlvbiB1cy5cbiAgICBzZWxmOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgc3RvcmU6IElCdWNrZXRTdG9yZTtcbn07XG5cbmNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+PigpO1xuXG4vLyBzZXRUaW1lb3V0IGNhbm5vdCByZXByZXNlbnQgbG9uZ2VyIGRlbGF5czsgbW9yZSBkaXN0YW50IHdpbmRvdyBib3VuZGFyaWVzIHJlLWNoZWNrIGFmdGVyIHRoaXNcbmNvbnN0IE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZID0gMiAqKiAzMSAtIDE7XG4vLyBSZWJ1aWxkIHNsaWdodGx5IGFmdGVyIHRoZSBib3VuZGFyeSwgc28gdGhlIG5ld2x5LXZhbGlkIGVudHJ5IGlzIHVuYW1iaWd1b3VzbHkgYWN0aXZlXG5jb25zdCBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiA9IDEwMDA7XG5cbmZ1bmN0aW9uIGdldEJ1Y2tldEZvbGRlcihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG4vLyBQb3J0cyB3ZSBhcmUgbGlzdGVuaW5nIG9uIGJleW9uZCB0aGUgbWFpbiBjb25maWcgcG9ydCAtIGEgZGVwbG95LXRha2VvdmVyIHN1Y2Nlc3NvciBzZXJ2ZXMgb24gYVxuLy8gdGVtcG9yYXJ5IGFsdGVybmF0ZSBwb3J0LCBhbmQgbXVzdCByZWNvZ25pemUgYWx0ZXJuYXRlLXBvcnQgc291cmNlIFVSTHMgYXMgaXRzZWxmXG5jb25zdCBleHRyYUxpc3RlblBvcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5leHBvcnQgZnVuY3Rpb24gYWRkRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuYWRkKHBvcnQpO1xufVxuZnVuY3Rpb24gZmluZFNlbGZJbmRleGVzKHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgLy8gVGhlIHRha2VvdmVyJ3MgYWx0ZXJuYXRlIHBvcnQgaXMgdGhlIE9USEVSIHByb2Nlc3Mgb2YgdGhlIHN3aXRjaG92ZXIsIG9uIE9VUiBtYWNoaW5lIHdpdGhcbiAgICAvLyBPVVIgZGlzayAtIHNlbGYgZm9yIHN5bmMgcHVycG9zZXMgb24gYm90aCBzaWRlcyAodGhlIG9sZCBub2RlIG11c3Qgbm90IHNjYW4vcHVzaCBpdHMgb3duXG4gICAgLy8gc3VjY2Vzc29yOyB0aGUgc2hhcmVkIGZvbGRlciBwbHVzIHRoZSBzd2l0Y2hvdmVyIGRpc2sgc2NhbnMgcmVjb25jaWxlIHRoZW0pXG4gICAgbGV0IHRha2VvdmVyQWx0UG9ydCA9IGdldFRha2VvdmVyQWx0UG9ydCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGRvbWFpbiB8fCBwYXJzZWQuYWNjb3VudCAhPT0gYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChwYXJzZWQucG9ydCA9PT0gcG9ydCB8fCBleHRyYUxpc3RlblBvcnRzLmhhcyhwYXJzZWQucG9ydCkgfHwgcGFyc2VkLnBvcnQgPT09IHRha2VvdmVyQWx0UG9ydCkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG4vLyBUaGUgZW50cnkgd2hvc2UgdmFsaWQgd2luZG93IGNvbnRhaW5zIHRoZSB0aW1lIChhbW9uZyB0aGUgZW50cmllcyBjb3ZlcmluZyB0aGUga2V5J3Mgcm91dGUsXG4vLyB3aGVuIG9uZSBpcyBnaXZlbiAtIGEgc2VydmVyIGNhbiBob2xkIGRpZmZlcmVudCBzaGFyZHMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucykuIEhhbGYtb3BlblxuLy8gKFtzdGFydCwgZW5kKSksIHNvIGNsZWFuIGJyZWFrcyByZXNvbHZlIHVuYW1iaWd1b3VzbHkuIEZhbGxzIGJhY2sgdG8gdGhlIG5lYXJlc3Qgd2luZG93IHdoZW5cbi8vIG5vbmUgY29udGFpbnMgdGhlIHRpbWUgLSBnYXBzIHNob3VsZG4ndCBleGlzdCwgYnV0IGEgd3JpdGUgbXVzdCBzdGlsbCByZXNvbHZlIHRvIFNPTUVcbi8vIGNvbmZpZ3VyYXRpb24uXG5mdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuLy8gQnVja2V0IG9wdGlvbnMgY2FuIGNoYW5nZSBvdmVyIHRpbWUgKG11bHRpcGxlIHNlbGYgZW50cmllcyB3aXRoIGRpZmZlcmVudCB2YWxpZCB3aW5kb3dzKSwgYW5kXG4vLyB0aGUgc3RydWN0dXJhbCBvbmVzIChyYXdEaXNrLCB0aGUgZG93bnN0cmVhbSBsaXN0KSBhcmUgYmFrZWQgaW50byB0aGUgc3RvcmUgLSBzbyB0aGUgc3RvcmUgaXNcbi8vIHJlYnVpbHQgc2hvcnRseSBhZnRlciBlYWNoIG9mIG91ciB3aW5kb3cgYm91bmRhcmllcyBwYXNzZXMsIG1ha2luZyB0aGUgbmV3bHktdmFsaWQgZW50cnkgYXBwbHkuXG5mdW5jdGlvbiBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBib3VuZGFyaWVzID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZsYXRNYXAoeCA9PiB4LnZhbGlkV2luZG93KS5maWx0ZXIodCA9PiB0ID4gbm93KTtcbiAgICBpZiAoIWJvdW5kYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG5leHRCb3VuZGFyeSA9IE1hdGgubWluKC4uLmJvdW5kYXJpZXMpO1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBBIHJvdXRpbmcgY2hhbmdlIG1heSBoYXZlIGFscmVhZHkgcmVwbGFjZWQgdGhpcyBzdG9yZTsgb25seSBJVCBnZXRzIGEgYm91bmRhcnkgdGltZXJcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBsb2FkZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgbmV4dEJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYSB2YWxpZCB3aW5kb3cgYm91bmRhcnkgcGFzc2VkXCIgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgTWF0aC5taW4obmV4dEJvdW5kYXJ5IC0gbm93ICsgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIsIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbn1cblxuLy8gRXh0cmEgc2NhbnMgYXJvdW5kIGVhY2ggb2YgT1VSIHZhbGlkLXdpbmRvdyBzdGFydHMgKGEgZGVwbG95IHN3aXRjaG92ZXIgaXMganVzdCB0aGlzIHRvbyAtIGl0c1xuLy8gcmVtYXAgYWRkcyB2YWxpZCB3aW5kb3dzKSwgY2F0Y2hpbmcgbGFzdC1tb21lbnQgd3JpdGVzIHRoZSBwcmV2aW91cyB3aW5kb3cncyBvd25lciBhY2NlcHRlZCBuZWFyXG4vLyB0aGUgYm91bmRhcnkuIEJ5IHRoZSBmaW5hbCBzY2FuIHRoZSBwcmV2aW91cyBvd25lciBoYXMgZmx1c2hlZCBldmVyeXRoaW5nIChmYXN0IHdyaXRlcyBuZXZlclxuLy8gZGVsYXkgcGFzdCBhIHdpbmRvdydzIGVuZCksIHNvIG5vdGhpbmcgaXMgbWlzc2VkLlxuY29uc3QgQk9VTkRBUllfU0NBTl9PRkZTRVRTID0gWy0zMCAqIDEwMDAsIDIgKiAxMDAwLCAzMCAqIDEwMDBdO1xuLy8gSG93IGZhciBiYWNrIGEgYm91bmRhcnkgc2NhbiBhc2tzIHRoZSBwcmV2aW91cyBvd25lciBmb3IgY2hhbmdlczogYW55dGhpbmcgb2xkZXIgaGFzIGFscmVhZHlcbi8vIGFycml2ZWQgdGhyb3VnaCBub3JtYWwgc3luY2hyb25pemF0aW9uLCBhbmQgdGhpcyBjb3ZlcnMgdGhlIGxvbmdlc3QgYSB3cml0ZSBjYW4gc2l0IHVuZmx1c2hlZFxuY29uc3QgQk9VTkRBUllfU0NBTl9MT09LQkFDSyA9IERFRkFVTFRfRkFTVF9XUklURV9ERUxBWSArIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuXG4vLyBFYWNoIChidWNrZXQsIGJvdW5kYXJ5LCBvZmZzZXQpIGlzIHNjaGVkdWxlZCBleGFjdGx5IG9uY2UsIHN1cnZpdmluZyBzdG9yZSByZWJ1aWxkcyAtIHRoZSB0aW1lclxuLy8gcmUtcmVzb2x2ZXMgdGhlIGJ1Y2tldCAoYW5kIHJlY29tcHV0ZXMgb3duZXJzIGZyb20gdGhlIHRoZW4tY3VycmVudCByb3V0aW5nKSB3aGVuIGl0IGZpcmVzXG5jb25zdCBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBib3VuZGFyeVNjYW5zUnVubmluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5mdW5jdGlvbiBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkOiBMb2FkZWRCdWNrZXQpOiB2b2lkIHtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc3RhcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc2VsZi52YWxpZFdpbmRvd1swXTtcbiAgICAgICAgaWYgKHN0YXJ0ID4gbm93ICYmIHN0YXJ0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHN0YXJ0cy5hZGQoc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHN0YXJ0IG9mIHN0YXJ0cykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgb2YgQk9VTkRBUllfU0NBTl9PRkZTRVRTKSB7XG4gICAgICAgICAgICBsZXQgYXQgPSBzdGFydCArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChhdCA8PSBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXwke29mZnNldH1gO1xuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgICAgICBsZXQgYXJtID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaW1lciBsZW5ndGggaXMgY2FwcGVkIChmYXItZnV0dXJlIGJvdW5kYXJpZXMpLCBzbyByZS1hcm0gdW50aWwgdGhlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgYXJyaXZlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IGF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBvZmZzZXQpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgICAgICAgICB9LCBNYXRoLm1pbihhdCAtIERhdGUubm93KCksIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgICAgICAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQm91bmRhcnlTY2FuKGJ1Y2tldEtleTogc3RyaW5nLCB3aW5kb3dTdGFydDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYWJlbCA9IGBidWNrZXQgJHtidWNrZXRLZXl9LCB3aW5kb3cgc3RhcnRpbmcgJHtuZXcgRGF0ZSh3aW5kb3dTdGFydCkudG9JU09TdHJpbmcoKX0sIG9mZnNldCAke29mZnNldCAvIDEwMDB9c2A7XG4gICAgaWYgKGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmhhcyhidWNrZXRLZXkpKSB7XG4gICAgICAgIC8vIEJvdW5kYXJ5IHNjYW5zIG5ldmVyIHJ1biBpbiBwYXJhbGxlbDsgYSBzbG93IG9uZSBzaW1wbHkgc3dhbGxvd3MgbGF0ZXIgc2NoZWR1bGVkIHBvaW50c1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgYm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiB0aGUgcHJldmlvdXMgYm91bmRhcnkgc2NhbiBpcyBzdGlsbCBydW5uaW5nYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuYWRkKGJ1Y2tldEtleSk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG4gICAgICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgICAgIGxldCBzdG9yZSA9IGxvYWRlZC5zdG9yZTtcbiAgICAgICAgaWYgKCEoc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpKSByZXR1cm47XG4gICAgICAgIC8vIE93bmVycyBhcmUgcmVjb21wdXRlZCBhdCBmaXJlIHRpbWUgLSB0aGUgcm91dGluZyAob3IgdGhlIHRha2VvdmVyIHJlbWFwKSBtYXkgaGF2ZVxuICAgICAgICAvLyBjaGFuZ2VkIHNpbmNlIHRoaXMgc2NhbiB3YXMgc2NoZWR1bGVkXG4gICAgICAgIGxldCBlZmZlY3RpdmUgPSBhcHBseURlcGxveVJlbWFwKGxvYWRlZC5yb3V0aW5nKTtcbiAgICAgICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgbG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lKTtcbiAgICAgICAgbGV0IHNlbGZJbmRleFNldCA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgICAgICBsZXQgc2VsdmVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKS5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzBdID09PSB3aW5kb3dTdGFydCk7XG4gICAgICAgIGlmICghc2VsdmVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcHJldlRpbWUgPSB3aW5kb3dTdGFydCAtIDE7XG4gICAgICAgIGxldCBuZWVkRGlza1NjYW4gPSBmYWxzZTtcbiAgICAgICAgLy8gc291cmNlSW5kZXggLT4gdGhlIHNsaWNlIG9mIG91ciByb3V0ZSB0aGF0IHNvdXJjZSBvd25lZCBpbiB0aGUgcHJldmlvdXMgd2luZG93XG4gICAgICAgIGxldCByZW1vdGVPd25lcnMgPSBuZXcgTWFwPG51bWJlciwgW251bWJlciwgbnVtYmVyXT4oKTtcbiAgICAgICAgZm9yIChsZXQgc2VsZiBvZiBzZWx2ZXMpIHtcbiAgICAgICAgICAgIGxldCBzZWxmUm91dGUgPSBzZWxmLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICBsZXQgaWR4ID0gZWZmZWN0aXZlLnNvdXJjZXMuaW5kZXhPZihzZWxmKTtcbiAgICAgICAgICAgIC8vIFRoZXNlIHNjYW5zIG9ubHkgcnVuIG9uIHRoZSB3cml0ZSBub2RlIC0gdGhlIGZpcnN0IHNvdXJjZSB2YWxpZCBhdCB0aGUgbmV3IHdpbmRvdydzXG4gICAgICAgICAgICAvLyBzdGFydCBmb3Igb3VyIHJvdXRlLiBBbiBlYXJsaWVyIGVudHJ5IGZ1bGx5IGNvdmVyaW5nIG91ciByb3V0ZSBtZWFucyB3cml0ZXMgZ28gdGhlcmUsXG4gICAgICAgICAgICAvLyBhbmQgSVQgZG9lcyB0aGUgYm91bmRhcnkgc2NhbnMuXG4gICAgICAgICAgICBsZXQgc2hhZG93ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWR4OyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBlZmZlY3RpdmUuc291cmNlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgW3dzLCB3ZV0gPSBvdGhlci52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoISh3cyA8PSB3aW5kb3dTdGFydCAmJiB3aW5kb3dTdGFydCA8IHdlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgICAgIGlmIChyWzBdIDw9IHNlbGZSb3V0ZVswXSAmJiBzZWxmUm91dGVbMV0gPD0gclsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaGFkb3dlZCkgY29udGludWU7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgd2luZG93J3Mgb3duZXJzOiB3YWxraW5nIHRoZSBjb25maWcgaW4gb3JkZXIgKHdyaXRlLXRhcmdldCBvcmRlciksXG4gICAgICAgICAgICAvLyBlYWNoIHNvdXJjZSBjbGFpbXMgd2hhdGV2ZXIgc2xpY2Ugb2Ygb3VyIHJvdXRlIG5vIGVhcmxpZXIgc291cmNlIGFscmVhZHkgb3duc1xuICAgICAgICAgICAgbGV0IHVuY292ZXJlZDogW251bWJlciwgbnVtYmVyXVtdID0gW1tzZWxmUm91dGVbMF0sIHNlbGZSb3V0ZVsxXV1dO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlZmZlY3RpdmUuc291cmNlcy5sZW5ndGggJiYgdW5jb3ZlcmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gcHJldlRpbWUgJiYgcHJldlRpbWUgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhaW1lZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IG9mIHVuY292ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXIgPSByb3V0ZUludGVyc2VjdGlvbih1LCByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLnB1c2godSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFpbWVkID0gY2xhaW1lZCAmJiBbTWF0aC5taW4oY2xhaW1lZFswXSwgaW50ZXJbMF0pLCBNYXRoLm1heChjbGFpbWVkWzFdLCBpbnRlclsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1WzBdIDwgaW50ZXJbMF0pIHJlbWFpbmluZy5wdXNoKFt1WzBdLCBpbnRlclswXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJbMV0gPCB1WzFdKSByZW1haW5pbmcucHVzaChbaW50ZXJbMV0sIHVbMV1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb3ZlcmVkID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIGlmICghY2xhaW1lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZJbmRleFNldC5oYXMoaikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIG93bmVyIHNoYXJlcyBvdXIgc3RvcmFnZSAoc2FtZSBtYWNoaW5lICsgYnVja2V0LCBlLmcuIHRoZSBvdGhlclxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIG9mIGEgZGVwbG95IHN3aXRjaG92ZXIpLCBzbyBhIGRpc2sgcmVzY2FuIHNlZXMgaXRzIHdyaXRlc1xuICAgICAgICAgICAgICAgICAgICBuZWVkRGlza1NjYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHJlbW90ZU93bmVycy5nZXQoaik7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU93bmVycy5zZXQoaiwgZXhpc3RpbmcgJiYgW01hdGgubWluKGV4aXN0aW5nWzBdLCBjbGFpbWVkWzBdKSwgTWF0aC5tYXgoZXhpc3RpbmdbMV0sIGNsYWltZWRbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGNsYWltZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5lZWREaXNrU2NhbiAmJiAhcmVtb3RlT3duZXJzLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogZGlza1NjYW49JHtuZWVkRGlza1NjYW59LCByZW1vdGUgcHJldmlvdXMtd2luZG93IG93bmVyczogJHtyZW1vdGVPd25lcnMuc2l6ZX1gKTtcbiAgICAgICAgaWYgKG5lZWREaXNrU2Nhbikge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmUucmVzY2FuQmFzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaW5jZSA9IHdpbmRvd1N0YXJ0IC0gQk9VTkRBUllfU0NBTl9MT09LQkFDSztcbiAgICAgICAgZm9yIChsZXQgW3NvdXJjZUluZGV4LCByb3V0ZV0gb2YgcmVtb3RlT3duZXJzKSB7XG4gICAgICAgICAgICBsZXQgb3duZXJTb3VyY2UgPSBlZmZlY3RpdmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG93bmVyU291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmUuYm91bmRhcnlTY2FuUmVtb3RlKGNyZWF0ZUFwaUFyY2hpdmVzKG93bmVyU291cmNlKSwgeyBzaW5jZSwgcm91dGUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pIG9mIHByZXZpb3VzLXdpbmRvdyBvd25lciAoc291cmNlIGluZGV4ICR7c291cmNlSW5kZXh9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBib3VuZGFyeVNjYW5zUnVubmluZy5kZWxldGUoYnVja2V0S2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcpOiBMb2FkZWRCdWNrZXQge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgLy8gVGhlIGRlcGxveS10YWtlb3ZlciByZW1hcCBpcyBhbiBJTlRFUlBSRVRBVElPTiBvdmVybGF5OiBldmVyeXRoaW5nIGJlaGF2aW9yYWwgKHNlbGYgZW50cmllcyxcbiAgICAvLyB3aW5kb3dzLCBkb3duc3RyZWFtIHNvdXJjZXMpIHVzZXMgdGhlIHJlbWFwcGVkIHZpZXcsIHdoaWxlIGxvYWRlZC5yb3V0aW5nL3JvdXRpbmdKU09OIHN0YXlcbiAgICAvLyB0aGUgU1RPUkVEIGNvbmZpZyAtIHNvIHZlcnNpb24gZ3VhcmRzLCBjaGFuZ2UgZGV0ZWN0aW9uLCBhbmQgc3luY2hyb25pemF0aW9uIG5ldmVyIHNlZSAob3JcbiAgICAvLyBwZXJzaXN0KSB0aGUgcmVtYXBcbiAgICBsZXQgZWZmZWN0aXZlID0gYXBwbHlEZXBsb3lSZW1hcChyb3V0aW5nKTtcbiAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMoZWZmZWN0aXZlLCBhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgc2VsZkVudHJpZXMgPSBzZWxmSW5kZXhlcy5tYXAoaSA9PiBlZmZlY3RpdmUuc291cmNlc1tpXSBhcyBIb3N0ZWRDb25maWcpO1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChzZWxmRW50cmllcywgRGF0ZS5ub3coKSk7XG4gICAgbGV0IHNlbGZJbmRleCA9IC0xO1xuICAgIGlmIChzZWxmKSB7XG4gICAgICAgIHNlbGZJbmRleCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgfVxuICAgIGxldCBzdG9yZTogSUJ1Y2tldFN0b3JlO1xuICAgIGlmIChzZWxmPy5yYXdEaXNrKSB7XG4gICAgICAgIHN0b3JlID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE91ciBvd24gZGlzayBpcyB0aGUgYmFzZSBzb3VyY2U7IG9ubHkgdGhlIHJvdXRpbmcgZW50cmllcyBET1dOU1RSRUFNIGZyb20gdXMgKGFmdGVyIG91clxuICAgICAgICAvLyBjdXJyZW50bHktdmFsaWQgZW50cnkpIGJlY29tZSBzeW5jaHJvbml6YXRpb24gc291cmNlcy4gVXBzdHJlYW0gc291cmNlcyBzeW5jIGZyb20gdXMsIHNvXG4gICAgICAgIC8vIHdyaXRpbmcgdG8gb3Igc2Nhbm5pbmcgdGhlbSB3b3VsZCBqdXN0IGVjaG8gb3VyIG93biBkYXRhIGJhY2sgKGFuZCBtYWtlIG91ciBhdmFpbGFiaWxpdHlcbiAgICAgICAgLy8gZGVwZW5kIG9uIHRoZWlycykuIEEgc2VydmVyIE5PVCBpbiB0aGUgbGlzdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGJ1Y2tldDogaXQga2VlcHNcbiAgICAgICAgLy8gaXRzIGRpc2sgZGF0YSAodGhlIGNvbmZpZyBtYXkgcmUtYWRkIGl0KSwgYnV0IHN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gLSBubyBvbmVcbiAgICAgICAgLy8gY29udGFjdHMgYSByZW1vdmVkIHNvdXJjZSwgYW5kIHNjYW5uaW5nL3B1c2hpbmcgYXMgaWYgd2Ugd2VyZSBzdGlsbCBvbmUgd291bGQgZmlnaHQgdGhlXG4gICAgICAgIC8vIHJlYWwgY2hhaW4uIFRoZSBjb25maWctbGV2ZWwgdmFsaWRXaW5kb3cgcmlkZXMgb24gZWFjaCBBcmNoaXZlc1NvdXJjZTsgdGhlIGRpc2sgc291cmNlXG4gICAgICAgIC8vIHNoYXJlcyBvdXIgY3VycmVudGx5LXZhbGlkIGVudHJ5J3Mgd2luZG93IChpdCBob2xkcyBvdXIgY29weSBvZiB0aGUgZGF0YSkuXG4gICAgICAgIGxldCBvd25JbmRleGVzID0gbmV3IFNldChzZWxmSW5kZXhlcyk7XG4gICAgICAgIC8vIE91ciBvd24gZGlzayBnZXRzIG5vIHJvdXRlIGZpbHRlcjogZXZlcnl0aGluZyBpdCBob2xkcyBpcyBvdXJzIHRvIGluZGV4IGFuZCBzZXJ2ZVxuICAgICAgICBsZXQgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IFt7XG4gICAgICAgICAgICBzb3VyY2U6IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKSxcbiAgICAgICAgICAgIHZhbGlkV2luZG93OiBzZWxmPy52YWxpZFdpbmRvdyB8fCBGVUxMX1ZBTElEX1dJTkRPVyxcbiAgICAgICAgfV07XG4gICAgICAgIGlmIChzZWxmSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVGhpcyBzZXJ2ZXIgaXMgbm90IGluIHRoZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTsga2VlcGluZyBpdHMgZGF0YSBvbiBkaXNrIGJ1dCBubyBsb25nZXIgc3luY2hyb25pemluZyBpdGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGZJbmRleCArIDE7IGkgPCBlZmZlY3RpdmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBlZmZlY3RpdmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBvd25JbmRleGVzLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gRGlzam9pbnQtc2hhcmQgc291cmNlcyBuZXZlciB0YWxrIHRvIGVhY2ggb3RoZXI7IGEgcGFydGlhbCBvdmVybGFwIHN5bmNzIG9ubHlcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW50ZXJzZWN0aW9uIChzY2FucyBpZ25vcmUgdGhlIHJlc3QsIHdyaXRlcyBvbmx5IHNlbmQgbWF0Y2hpbmcga2V5cylcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVkUm91dGUgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmPy5yb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXJlZFJvdXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBBIGJvdW5kZWQtY2FjaGUgc2VydmVyIChub0Z1bGxTeW5jIG9uIG91ciBvd24gZW50cnkpIG11c3Qgbm90IGZ1bGwtc3luYyBmcm9tXG4gICAgICAgICAgICAgICAgLy8gQU5ZIHNvdXJjZSwgb3IgaXRzIGRpc2sgd291bGQgZmlsbCByZWdhcmRsZXNzIG9mIHRoZSBsaW1pdFxuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCh7IHNvdXJjZTogY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlKSwgdmFsaWRXaW5kb3c6IHNvdXJjZS52YWxpZFdpbmRvdywgcm91dGU6IHNoYXJlZFJvdXRlLCBub0Z1bGxTeW5jOiBzb3VyY2Uubm9GdWxsU3luYyB8fCBzZWxmPy5ub0Z1bGxTeW5jIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0b3JlID0gbmV3IEJsb2JTdG9yZShmb2xkZXIsIHNvdXJjZXMsIHtcbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkOiBrZXkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVzIGZvciBvdXIgb3duIHJvdXRpbmcgd3JpdGVzIEFORCByb3V0aW5nIGZpbGVzIHB1bGxlZCBpbiB2aWEgc3luY2hyb25pemF0aW9uXG4gICAgICAgICAgICAgICAgLy8gKG9ubHkgZXZlciBuZXdlciBvbmVzLCBzZWUgSUFyY2hpdmVzLnNldCkg4oCUIGVpdGhlciB3YXksIGFwcGx5IHRoZSBuZXcgY29uZmlnXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdm9pZCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBzZWxmPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgPSB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHJvdXRpbmdKU09OOiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSwgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlIH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhcnNlUm91dGluZ0RhdGEoZGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZGVkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgbG9hZGVkID0gbG9hZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBsb2FkZWQpO1xuICAgICAgICAvLyBNaXNzaW5nIGJ1Y2tldHMgYXJlIG5vdCBjYWNoZWQg4oCUIHRoZXkgY2FuIGJlIGNyZWF0ZWQgYXQgYW55IHRpbWUgKGd1YXJkaW5nIGFnYWluc3QgYVxuICAgICAgICAvLyBjb25jdXJyZW50IGNyZWF0ZSBoYXZpbmcgYWxyZWFkeSByZXBsYWNlZCBvdXIgZW50cnkpXG4gICAgICAgIHZvaWQgbG9hZGVkLnRoZW4oYnVja2V0ID0+IHtcbiAgICAgICAgICAgIGlmICghYnVja2V0ICYmIGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuLy8gUm91dGluZyByZWxvYWRzIGFyZSBzZXJpYWxpemVkIHBlciBidWNrZXQsIHNvIGNvbmN1cnJlbnQgd3JpdGVzL3N5bmNzIGNhbid0IHJlYnVpbGQgdGhlIHNhbWVcbi8vIHN0b3JlIHR3aWNlIGluIHBhcmFsbGVsXG5jb25zdCByb3V0aW5nUmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuZnVuY3Rpb24gc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IG5leHQgPSAocm91dGluZ1JlbG9hZHMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudCwgYnVja2V0TmFtZSwgY29uZmlnKSlcbiAgICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgUmVsb2FkaW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDpgLCBlKSk7XG4gICAgcm91dGluZ1JlbG9hZHMuc2V0KGtleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIC0gaXQgaXMgbmV2ZXIgcHVsbGVkIGZyb20gYW5vdGhlclxuICAgIC8vIHNvdXJjZSAoaXQgcmVhY2hlcyB1cyBleGNsdXNpdmVseSBhcyBhIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCB3aGljaCBsYW5kcyBvbiBkaXNrIGZpcnN0KVxuICAgIGxldCBkYXRhID0gYXdhaXQgbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLmdldChST1VUSU5HX0ZJTEUpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIGxldCByb3V0aW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBpZiAoIWNvbmZpZz8uZm9yY2UgJiYgSlNPTi5zdHJpbmdpZnkocm91dGluZykgPT09IGxvYWRlZC5yb3V0aW5nSlNPTikgcmV0dXJuO1xuICAgIGlmIChjb25maWc/LmZvcmNlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWJ1aWxkaW5nIHRoZSBzdG9yZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtjb25maWcucmVhc29uIHx8IFwiZm9yY2VkXCJ9KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSb3V0aW5nIGNvbmZpZyBjaGFuZ2VkIGZvciBidWNrZXQgJHtrZXl9LCByZWJ1aWxkaW5nIGl0cyBzdG9yZWApO1xuICAgIH1cbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpKSk7XG59XG5cbi8vIFBlci13cml0ZSBvcHRpb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFdSSVRFJ3MgdGltZSAoYW5kIHRoZSBrZXkncyByb3V0ZSksIG5vdCB0aGUgY3VycmVudFxuLy8gY29uZmlnOiB0aGUgd3JpdGUgdGltZSBpcyBzdGFtcGVkIGV4YWN0bHkgb25jZSAoYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGUpIGFuZFxuLy8gcHJvcGFnYXRlcyB3aXRoIHRoZSBkYXRhLCBzbyBldmVyeSBub2RlIHJlc29sdmVzIHRoZSBzYW1lIHNlbGYgZW50cnkgLSBhbmQgdGhlIHNhbWUgb3B0aW9ucy5cbmZ1bmN0aW9uIGdldFdyaXRlQ29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0LCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHsgZmFzdD86IGJvb2xlYW47IHdyaXRlRGVsYXk/OiBudW1iZXIgfSB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgcmV0dXJuIHsgZmFzdDogc2VsZj8uZmFzdCwgd3JpdGVEZWxheTogc2VsZj8ud3JpdGVEZWxheSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TXV0YWJsZShidWNrZXQ6IExvYWRlZEJ1Y2tldCwgZmlsZVBhdGg6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIGdldFJvdXRlKGZpbGVQYXRoKSk7XG4gICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICBpZiAoYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YnVja2V0LmFjY291bnR9LyR7YnVja2V0LmJ1Y2tldE5hbWV9IGlzIGltbXV0YWJsZSAoYXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0pIGFuZCAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvYCk7XG4gICAgfVxufVxuXG4vLyBXcm9uZy10YXJnZXQgcmVqZWN0aW9ucyBhcmUgcmFyZSBhbmQgaW1wb3J0YW50ICh0aGV5IEFSRSB0aGUgc3dpdGNob3ZlciBoYW5kb2ZmKSwgYnV0IGEgYnVyc3Qgb2Zcbi8vIHJhY2luZyB3cml0ZXMgYXQgYSBib3VuZGFyeSBtdXN0IG5vdCBmbG9vZCB0aGUgbG9nIC0gc28gYXQgbW9zdCBvbmUgbGluZSBhIG1pbnV0ZVxuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuLy8gUm91dGluZyB3cml0ZXMgYXJlIHNlcmlhbGl6ZWQgcGVyIGJ1Y2tldCwgc28gdHdvIGNvbmN1cnJlbnQgY3JlYXRlcyBjYW4ndCBib3RoIGJ1aWxkIGEgc3RvcmVcbi8vICh0aGUgbG9zZXIncyBzdG9yZSB3b3VsZCBsZWFrIHdpdGggaXRzIHN5bmMgbG9vcHMgcnVubmluZyBmb3JldmVyKVxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAvLyBWYWxpZGF0ZXMgYmVmb3JlIHN0b3JpbmcgYW55dGhpbmcsIHNvIGEgYmFkIGNvbmZpZyBjYW4ndCBicmljayB0aGUgYnVja2V0XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBjaGFuZ2VkIGNvbmZpZyBtdXN0IGNhcnJ5IGEgaGlnaGVyIHZlcnNpb24gdGhhbiB0aGUgb25lIGN1cnJlbnRseSBzdG9yZWQg4oCUIG90aGVyd2lzZSB0d29cbiAgICAvLyBjbGllbnRzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgYXQgdGhlIHNhbWUgdmVyc2lvbiB3b3VsZCBrZWVwIGNsb2JiZXJpbmcgZWFjaCBvdGhlci4gU2FtZVxuICAgIC8vIGNvbnRlbnQgYXQgYW55IHZlcnNpb24gaXMgYSBoYXJtbGVzcyBuby1vcCBhbmQgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShpbmNvbWluZykgIT09IGxvYWRlZC5yb3V0aW5nSlNPTiAmJiBnZXRDb25maWdWZXJzaW9uKGluY29taW5nKSA8PSBnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gKTtcbiAgICB9XG4gICAgLy8gUm91dGluZyB3cml0ZXMgYnlwYXNzIGZhc3QgbW9kZSAodGhlIGNvbmZpZyBtdXN0IGFwcGx5IGltbWVkaWF0ZWx5IGFuZCBzdXJ2aXZlIGEgY3Jhc2gpXG4gICAgLy8gYW5kIGlnbm9yZSBpbW11dGFibGUgKHRoZSByb3V0aW5nIGZpbGUgbXVzdCBhbHdheXMgc3RheSB1cGRhdGFibGUpLiBBbiBvbGRlciBsYXN0TW9kaWZpZWRcbiAgICAvLyBuby1vcHMgaW5zaWRlIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVsb2FkIGJlbG93IHNlZXMgbm8gY2hhbmdlLlxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICBsZXQgcnVuID0gKHJvdXRpbmdXcml0ZXMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCkgPT4gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQsIGJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICAvLyBUaGUgY2hhaW4gbXVzdCBzdXJ2aXZlIGEgZmFpbGVkIHdyaXRlLCBzbyB0aGUgc3RvcmVkIGxpbmsgc3dhbGxvd3MgdGhlIGVycm9yICh0aGUgY2FsbGVyXG4gICAgICAgIC8vIHN0aWxsIGdldHMgaXQgZnJvbSBydW4pXG4gICAgICAgIHJvdXRpbmdXcml0ZXMuc2V0KGtleSwgcnVuLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bjtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgLy8gVGhlIHdyaXRlIHRpbWUgaXMgZGV0ZXJtaW5lZCBleGFjdGx5IG9uY2UsIEhFUkUgYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGU7XG4gICAgLy8gaXQgcHJvcGFnYXRlcyBhcyBsYXN0TW9kaWZpZWQsIHNvIGV2ZXJ5IG5vZGUgZXZhbHVhdGVzIHRoZSBidWNrZXQgb3B0aW9ucyBhdCB0aGUgc2FtZSBpbnN0YW50XG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgLy8gT25seSBmcmVzaGx5LXN0YW1wZWQgd3JpdGVzIGFyZSBjaGVja2VkOiBhIHdyaXRlIHdpdGggYW4gZXhwbGljaXQgbGFzdE1vZGlmaWVkIGlzXG4gICAgLy8gc3luY2hyb25pemF0aW9uL2JhY2tmaWxsIChvbGQgZGF0YSBsZWdpdGltYXRlbHkgbGFuZHMgb24gc291cmNlcyB3aG9zZSB3aW5kb3cgaGFzIG1vdmVkIG9uKSxcbiAgICAvLyBidXQgYSBmcmVzaCB3cml0ZSByZWFjaGluZyB1cyBvdXRzaWRlIG91ciB3aW5kb3dzL3JvdXRlcyBtZWFucyB0aGUgY2xpZW50IHJlc29sdmVkIGl0c1xuICAgIC8vIHRhcmdldCBmcm9tIGEgc3RhbGUgdmlldyAtIGl0IG11c3QgcmUtcmVzb2x2ZSBhbmQgcmV0cnkgYXQgdGhlIGNvcnJlY3Qgc291cmNlLlxuICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbmZpZz8ubGFzdE1vZGlmaWVkICYmIGxvYWRlZC5zZWxmRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IGxvYWRlZC5zZWxmRW50cmllcy5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAtIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFICYmIHdyaXRlVGltZSA8PSB4LnZhbGlkV2luZG93WzFdICsgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UpO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSBldmVuIHdpdGggdGhlICR7V1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0V9bXMgZ3JhY2UgKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBUaGlzIHNlcnZlciBpcyBub3QgYSB2YWxpZCB3cml0ZSB0YXJnZXQgYXQgJHt3cml0ZVRpbWV9IGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgdmFsaWQgd2luZG93czogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSkuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0pIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShsb2FkZWQsIGZpbGVQYXRoLCB3cml0ZVRpbWUpO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoZmlsZVBhdGgsIGRhdGEsIHsgLi4uZ2V0V3JpdGVDb25maWcobG9hZGVkLCB3cml0ZVRpbWUsIHJvdXRlKSwgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXRDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IHByb2dyZXNzID0gYnVja2V0LnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6ICEhYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcixcbiAgICAgICAgLy8gVGhlIHJlbWFwcGVkIChpbnRlcnByZXRhdGlvbikgdmlldzogZ2V0Q29uZmlnIGlzIGhvdyBjbGllbnRzIGxlYXJuIG9mIGFuIGluLXByb2dyZXNzXG4gICAgICAgIC8vIGRlcGxveSB0YWtlb3Zlciwgc2luY2UgdGhlIHJlbWFwIGlzIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgcm91dGluZyBmaWxlIGl0c2VsZlxuICAgICAgICByZW1vdGVDb25maWc6IGFwcGx5RGVwbG95UmVtYXAoYnVja2V0LnJvdXRpbmcpLFxuICAgICAgICBpbmRleDogcHJvZ3Jlc3M/LmluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXM6IHByb2dyZXNzPy5zb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHByb2dyZXNzPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmc6IHByb2dyZXNzPy5zeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImRlcGxveSB0YWtlb3ZlciBzdGF0ZSBjaGFuZ2VkXCIgfSk7XG4gICAgfVxufVxuXG5vblRha2VvdmVyRXZlbnQoZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCA9PT0gXCJyZW1hcENoYW5nZWRcIikge1xuICAgICAgICAvLyBUaGUgcmVidWlsZCBhcHBsaWVzIHRoZSByZW1hcHBlZCB3aW5kb3dzLCBhbmQgc2NoZWR1bGVCb3VuZGFyeVNjYW5zIChwYXJ0IG9mIHRoZVxuICAgICAgICAvLyByZWJ1aWxkKSBzY2hlZHVsZXMgdGhlIGhhbmRvZmYgc2NhbnMgYXJvdW5kIHRoZSBuZXcgd2luZG93cycgc3RhcnRzXG4gICAgICAgIHZvaWQgcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gTG9hZGVkIGluIG1lbW9yeSAoY3JlYXRlZCBvciBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwKSwgc28gaXRzIHN5bmNocm9uaXphdGlvbiBpcyBydW5uaW5nXG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuLyoqIEV2ZXJ5IGJ1Y2tldCB0aGUgYWNjb3VudCBoYXMgb24gdGhpcyBzZXJ2ZXIsIGFjdGl2ZSBvciBub3QsIGVhY2ggd2l0aCBpdHMgY29uZmlndXJhdGlvbi5cbiAqICBJbmFjdGl2ZSBidWNrZXRzIGFyZSBpbnNwZWN0ZWQgc3RyYWlnaHQgZnJvbSBkaXNrIFdJVEhPVVQgbG9hZGluZyB0aGVtIC0gbG9hZGluZyB3b3VsZCBzdGFydFxuICogIHRoZWlyIHN5bmNocm9uaXphdGlvbiwgYW5kIG9sZCBpbnZhbGlkIGJ1Y2tldHMgbXVzdCBzdGF5IGluZXJ0ICh0aGVpciBwYXJzZSBlcnJvciBpcyByZXBvcnRlZFxuICogIGluc3RlYWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHM6IFNlcnZlckJ1Y2tldEluZm9bXSA9IFtdO1xuICAgIGZvciAobGV0IGJ1Y2tldE5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHBhcnNlUm91dGluZ0RhdGEoZGF0YSkgfSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiBmYWxzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRlbChmaWxlUGF0aCwgZ2V0V3JpdGVDb25maWcobG9hZGVkLCBEYXRlLm5vdygpLCBnZXRSb3V0ZShmaWxlUGF0aCkpKTtcbn1cblxuLy8g4pSA4pSAIGxvY2FsIElBcmNoaXZlcyBhY2Nlc3Mg4pSA4pSAXG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBUaGUgaW4tcHJvY2VzcyBJQXJjaGl2ZXMgZm9yIGEgYnVja2V0IGhvc3RlZCBieSBUSElTIHNlcnZlciDigJQgdXNlZCB3aGVuIGEgUmVtb3RlQ29uZmlnIHNvdXJjZVxuLy8gVVJMIHBvaW50cyBhdCBvdXJzZWx2ZXMsIHNvIHdlIGRvbid0IHRhbGsgdG8gb3Vyc2VsdmVzIG92ZXIgSFRUUFMuIE9uZSBzaW5nbGV0b24gcGVyIGJ1Y2tldC5cbmNsYXNzIEFyY2hpdmVzTG9jYWxCdWNrZXQgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1Y2tldCgpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgYnVja2V0LnN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIHNheSB0cnVlLCBtYXRjaGluZyB3aGF0IHRoZXkgYmVjb21lIG9uY2UgY3JlYXRlZCAodGhlIGRlZmF1bHQgc3RvcmUgdHlwZSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIGluZGV4KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IGFsbFNjYW5zQ29tcGxldGU6IHRydWUsIGluZGV4U2l6ZTogMCwgc291cmNlczogW10gfTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMoKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgZXhpc3RpbmcgPSBsb2NhbEFyY2hpdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0xvY2FsQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
779
+ /* _JS_SOURCE_HASH = "c6b4cf52a95405cdb5819c9b26b5a674d05e997863f73d7e48ae42be9dc399ad"; */
@@ -14,6 +14,10 @@ export declare class SourceWrapper {
14
14
  private reconnectRunning;
15
15
  private accessCache?;
16
16
  private constructor();
17
+ /** Config updates routinely just move a source's valid window (the last window extends
18
+ * forever, then gets reduced when a new entry is appended). The wrapper survives that: only
19
+ * the window changes, keeping the connection, pings, and latency history. */
20
+ updateValidWindow(validWindow: [number, number]): void;
17
21
  static create(config: HostedConfig | BackblazeConfig, options?: {
18
22
  background?: boolean;
19
23
  }): Promise<SourceWrapper>;
@@ -49,6 +49,16 @@ export class SourceWrapper {
49
49
  private background: boolean,
50
50
  ) { }
51
51
 
52
+ /** Config updates routinely just move a source's valid window (the last window extends
53
+ * forever, then gets reduced when a new entry is appended). The wrapper survives that: only
54
+ * the window changes, keeping the connection, pings, and latency history. */
55
+ public updateValidWindow(validWindow: [number, number]): void {
56
+ let old = this.config.validWindow;
57
+ if (old[0] === validWindow[0] && old[1] === validWindow[1]) return;
58
+ console.log(`Valid window changed for ${this.getDebugName()}: [${old.join(", ")}] -> [${validWindow.join(", ")}]`);
59
+ this.config.validWindow = validWindow;
60
+ }
61
+
52
62
  public static async create(config: HostedConfig | BackblazeConfig, options?: { background?: boolean }): Promise<SourceWrapper> {
53
63
  let wrapper = new SourceWrapper(config, options?.background !== false);
54
64
  if (config.type === "backblaze") {
@@ -47,3 +47,9 @@ Machines authenticate with their certs.ts identity (proving ownership of their m
47
47
  We look at the valid state windows and we make sure we never delay past the valid state window. In fact, if we are within five minutes of being invalid due to the valid state window, we flush the writes immediately. That way, when the next valid window starts running, the writes will be already on disk.
48
48
 
49
49
  We also do scans when we are coming up to the valid state window. If we are going to be the new valid state window, both before, a little bit after, and farther after. This helps the switch over be smoother so we get all of the trailing writes. These scans use our ability to ask for the changes since a certain time. We do the scan on the right write node. The write node is always the first node in order (with a valid state window and matching the route hash). Which might result in us having to scan multiple nodes if we require multiple nodes to fill the full route hash window.
50
+
51
+ # Smooth transitions
52
+
53
+ If the deploy system gives us enough notice about a change, or if the configuration is changed, but we have enough notice about the valid state changes (accepting the fact that the final window, which will usually trail to max safe number, will be instantaneously changed to stop earlier, but it should still be sometime earlier in the future. And so the transitionary point will still be of sufficient notice), THEN, all changes should go almost 100% smoothly with very little gap for any data loss. The only time which the data will be slightly incorrect is it might be possible that someone writes at the very end of a valid state window, and then they immediately try to read it, but then they read it from a different source because the valid state window has just ended. In that case, they may not read the write-back immediately. However, within a minute they should be able to read the write back because of the extra scans that we do on transitionary points.
54
+
55
+ We also shouldn't be doing any instantaneous internal destruction or closing of ports as long as we're given sufficient notice.
@@ -33,6 +33,7 @@ export type LoadedBucket = {
33
33
  selfEntries: HostedConfig[];
34
34
  self: HostedConfig | undefined;
35
35
  store: IBucketStore;
36
+ structureKey: string;
36
37
  };
37
38
  export declare function addExtraListenPort(port: number): void;
38
39
  export declare function getLoadedBucket(account: string, bucketName: string): Promise<LoadedBucket | undefined>;