sliftutils 1.8.2 → 1.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +19 -0
- package/misc/dist/getSecret.ts.cache +2 -2
- package/package.json +1 -1
- package/security/machines/dist/machines.ts.cache +2 -2
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +2 -2
- package/storage/dist/archiveHelpers.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +17 -5
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +16 -3
- package/storage/remoteStorage/createArchives.d.ts +19 -0
- package/storage/remoteStorage/createArchives.ts +155 -44
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +2 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +141 -50
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageLogs.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -1088,4 +1088,4 @@ class BlobStore {
|
|
|
1088
1088
|
}
|
|
1089
1089
|
exports.BlobStore = BlobStore;
|
|
1090
1090
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELGtFQUErRTtBQUMvRSw0Q0FHc0I7QUFDdEIsa0RBQW1FO0FBQ25FLGlEQUFtTjtBQUNuTiwyQ0FBNEM7QUFDNUMsdURBQXFEO0FBQ3JELHdEQUFxRDtBQUNyRCwrQ0FBNEM7QUFDNUMsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1Qyx1REFBNkQ7QUFDN0QsK0NBQTZFO0FBRTdFLHFnQkFBcWdCO0FBRXJnQixtTkFBbU47QUFDdE0sUUFBQSx1QkFBdUIsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN4RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsMkdBQTJHO0FBQzNHLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDO0FBQzdDLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTlDLG9NQUFvTTtBQUN2TCxRQUFBLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsbUtBQW1LO0FBQzVKLEtBQUssVUFBVSxnQkFBZ0I7SUFDbEMsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUZELDRDQUVDO0FBb0NELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsdUJBQXVCLENBQUMsT0FBZTtJQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsR0FBRyx5QkFBeUI7UUFBRSxPQUFPO0lBQ3hFLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJ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RSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkksQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztnQkFDekIsSUFBQSw2QkFBZSxFQUFDLHVCQUF1QixHQUFHLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6SixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0tBQWdLO0lBQ3hKLGFBQWE7UUFDakIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNkpBQTZKO0lBQ3JKLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFlO1FBQzVDLEtBQUssSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFBLDJCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQTNpQ0QsOEJBMmlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25GaWxlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uRmlsZVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IGxvZ011dGF0aW9uLCBsb2dTdG9yYWdlRXJyb3IsIGxvZ1N0b3JhZ2VXYXJuIH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuLy8gc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGFuIHVuZGVsZXRlIGNhcnJpZXMgbm8gZGF0YSAtIHRoaXMgc2luZ2xlIGlnbm9yZWQgYnl0ZSBzYXRpc2ZpZXMgdGhlIHdpcmVcbmNvbnN0IFVOREVMRVRFX1BMQUNFSE9MREVSID0gQnVmZmVyLmZyb20oWzFdKTtcblxuLy8gRGVsZXRpb24gaGlzdG9yeTogZGVsZXRlZCBmaWxlcyBrZWVwIHRoZWlyIGJ5dGVzIG9uIGRpc2sgKG1hcmtlZCBpbiB0aGUgaW5kZXgpIHVudGlsIHRoZSBoaXN0b3J5IG91dGdyb3dzIG1heChISVNUT1JZX01JTl9CWVRFUywgbGl2ZSBieXRlcyAqIGhpc3RvcnkgZmFjdG9yKSAtIHNlZSBTdG9yZVN5bmMuZW5mb3JjZUhpc3RvcnlMaW1pdFxuZXhwb3J0IGNvbnN0IEhJU1RPUllfTUlOX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBISVNUT1JZX0ZBQ1RPUiA9IDE7XG4vKiogVGhlIG11bHRpcGxlIG9mIGEgc3RvcmUncyBsaXZlIGJ5dGVzIGl0cyBkZWxldGlvbiBoaXN0b3J5IG1heSBncm93IHRvLiBBc3luYyBzbyBpdCBjYW4gbGF0ZXIgYmVjb21lIGR5bmFtaWMgYW5kIHVzZXItY29uZmlndXJhYmxlOyBmb3Igbm93IGl0IGlzIGEgY29uc3RhbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGlzdG9yeUZhY3RvcigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBISVNUT1JZX0ZBQ1RPUjtcbn1cblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGxvZ1N0b3JhZ2VFcnJvcihtZXNzYWdlKTtcbn1cblxuLy8gVGhlIGJ1Y2tldCBzdG9yZSwgYW5kIHRoZSBvbmx5IG9uZTogZXZlcnkgYnVja2V0IGEgc2VydmVyIGhvbGRzIGlzIHNlcnZlZCBieSB0aGVzZSwgb25lIHBlciBzdG9yZSBuYW1lIGluIGl0cyByb3V0aW5nIGNvbmZpZy4gSXRzIHNvdXJjZXMgYXJlIHBsYWluIElBcmNoaXZlcyAtIHRoZSBmaXJzdCBpcyBhbHdheXMgdGhlIHN0b3JlJ3Mgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIGNvbmZpZ3VyZWQgcGVlcnMgKHNlZSBjcmVhdGVTdG9yZVNvdXJjZSkgLSBzbyBcIm5vIHN5bmNocm9uaXphdGlvblwiIGlzIHNpbXBseSBhIHN0b3JlIHdpdGggbm8gcGVlcnMsIG5vdCBhIGRpZmZlcmVudCBraW5kIG9mIHN0b3JlLlxuZXhwb3J0IGNsYXNzIEJsb2JTdG9yZSB7XG4gICAgLy8g4pSA4pSAIHN0YXRlIOKUgOKUgFxuICAgIC8vIFNldCBvbmNlIHRoZSBzdG9yZSBpcyBzaHV0dGluZyBkb3duOyBldmVyeSBsb29wIGl0IG93bnMgKGFuZCBTdG9yZVN5bmMncyBtYWludGVuYW5jZSBsb29wcykgc3RvcHMgb24gaXRcbiAgICBwdWJsaWMgc3RvcHBlZCA9IHsgc3RvcDogZmFsc2UgfTtcbiAgICAvLyBXaGV0aGVyIGluaXQgaGFzIHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIGEgbmV3bHkgYWRkZWQgc291cmNlIGNhbiBzdGFydCBzY2FubmluZyBpbW1lZGlhdGVseVxuICAgIHB1YmxpYyBzeW5jU3RhcnRlZCA9IGZhbHNlO1xuICAgIC8qKiBJdHMgc291cmNlcywgaW4gY29uZmlnIG9yZGVyOiBzbG90IDAgaXMgYWx3YXlzIGl0cyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgcGVlcnMgaXQgc3luY2hyb25pemVzIHdpdGguIEZpbGxlZCBieSB1cGRhdGVTb3VyY2VzLCB3aGljaCBpcyBhbHNvIGhvdyB0aGV5IGNoYW5nZS4gVGhlIHN0b3JlIE9XTlMgdGhlbSAtIHdyaXRlcyBwaWNrIGFtb25nIHRoZW0sIHJlYWRzIHJlc29sdmUgaG9sZGVycyB0aHJvdWdoIHRoZW0gLSBhbmQgU3RvcmVTeW5jIG9ubHkgc2NhbnMgd2hhdGV2ZXIgaXMgaW4gaGVyZSBhdCB0aGUgdGltZS4gKi9cbiAgICBwdWJsaWMgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IFtdO1xuICAgIC8vIFVwbG9hZHMgaW1tdXRhYmlsaXR5IGFscmVhZHkgZGVjaWRlZCBhZ2FpbnN0OiB0aGUgY2xpZW50IGlzIG1pZC1zdHJlYW0gYnkgdGhlIHRpbWUgd2Uga25vdywgc28gaXQga2VlcHMgc2VuZGluZyBhbmQgZXZlcnkgcGFydCBpcyBkcm9wcGVkXG4gICAgcHJpdmF0ZSBkaXNjYXJkZWRVcGxvYWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBuZXh0RGlzY2FyZGVkVXBsb2FkID0gMTtcbiAgICAvLyBUaGUgcGVyc2lzdGVudCBpZGVudGl0aWVzIGJlaGluZCBJbmRleEVudHJ5LnNvdXJjZXNMaXN0SW5kZXggKHNlZSBTb3VyY2VzTGlzdClcbiAgICBwcml2YXRlIHNvdXJjZXNMaXN0OiBTb3VyY2VzTGlzdDtcbiAgICAvLyBQZXIgc2xvdDogdGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiB0aGF0IHNsb3QncyBVUkwsIGZpbGxlZCBieSByZWdpc3RlclNsb3QgYmVmb3JlIHRoZSBzbG90J3Mgc3luYyBydW5zXG4gICAgcHJpdmF0ZSBzbG90U291cmNlc0xpc3RJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgc2xvdFJlZ2lzdHJhdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIC8vIEV2ZXJ5IGZpbGUgd2Uga25vdyBvZiwgaW4gbWVtb3J5LCB3aXRoIGFuIGFwcGVuZC1vbmx5IGxvZyBvZiB0aGUgY2hhbmdlcyBiZWhpbmQgaXQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiBBIG5ldyBmaWxlIG5hbWUgZWFjaCB0aW1lIHRoZSBlbnRyeSBmb3JtYXQgY2hhbmdlcyBnZW5lcmF0aW9uOiB0aGUgcHJldmlvdXMgb25lcyBjYW5ub3QgYmUgcmVhZCwgYW5kIGEgc2NhbiByZWJ1aWxkcyB0aGUgaW5kZXggYW55d2F5LCBzbyB0aGV5IGFyZSBzaW1wbHkgbmV2ZXIgcmVhZCBhZ2Fpbi5cbiAgICBwcml2YXRlIGluZGV4OiBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT47XG4gICAgLyoqIEtlZXBpbmcgdGhlIGluZGV4IGluIGFncmVlbWVudCB3aXRoIHRoZSBzb3VyY2VzOiBzY2FubmluZywgcHVsbGluZywgcHVzaGluZywgYW5kIHRoZSBtYWludGVuYW5jZSB0aGF0IGZvbGxvd3MgZnJvbSBob2xkaW5nIGFuIGluZGV4IChkaXNrLWxpbWl0IGV2aWN0aW9uLCB0b21ic3RvbmUgZXhwaXJ5KS4gSXQgcmVhZHMgYW5kIHdyaXRlcyB0aGlzIHN0b3JlJ3MgaW5kZXggYW5kIHNvdXJjZXMgLSBpdCBkb2VzIG5vdCBvd24gdGhlbS4gKi9cbiAgICBwdWJsaWMgc3luYzogU3RvcmVTeW5jO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8vIFB1YmxpYyBmb3IgU3RvcmVTeW5jLCB3aGljaCBsb2dzIGl0IHdpdGggZXZlcnl0aGluZyBpdCBkb2VzXG4gICAgICAgIHB1YmxpYyBmb2xkZXI6IHN0cmluZyxcbiAgICAgICAgLyoqIFRoZSBuYW1lIHRoaXMgc3RvcmUgYW5zd2VycyB0byAoc2VlIENvbW1vbkNvbmZpZy5uYW1lKSAtIHRoZSBlbnRyaWVzIG9mIHRoZSByb3V0aW5nIGNvbmZpZyB0aGF0IGNhcnJ5IGl0IGFyZSB0aGUgb25lcyB0aGF0IGNvbmZpZ3VyZSBpdCwgYW5kIHRoZSByZXN0IGFyZSBpdHMgcGVlcnMuICovXG4gICAgICAgIHB1YmxpYyBzdG9yZU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc/OiB7XG4gICAgICAgICAgICAvKiogV2hldGhlciBhIGNvbmZpZyBlbnRyeSBpcyBUSElTIFNFUlZFUiAoc2FtZSBhY2NvdW50LCBzYW1lIGJ1Y2tldCwgb3VyIG93biBhZGRyZXNzKS4gSW5qZWN0ZWQgYmVjYXVzZSBhIHN0b3JlIGtub3dzIG5vdGhpbmcgYWJvdXQgc2VydmVycyAtIGl0IG9ubHkgbmVlZHMgdG8gdGVsbCBpdHMgb3duIGVudHJpZXMgYXBhcnQgZnJvbSBpdHMgcGVlcnMnLiBBYnNlbnQgbWVhbnMgbm90aGluZyBpcyB1cywgd2hpY2ggaXMgd2hhdCBhIGJhcmUgc3RvcmUgKG5vIHNlcnZlciBhcm91bmQgaXQpIHdhbnRzLiAqL1xuICAgICAgICAgICAgaXNTZWxmPzogKHNvdXJjZTogU291cmNlQ29uZmlnKSA9PiBib29sZWFuO1xuICAgICAgICAgICAgLyoqIEJ1aWxkcyBvbmUgb2YgaXRzIHNvdXJjZXMuIEluamVjdGVkIGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCBiZWNhdXNlIHRoZSBkZWxheSBpdCBpcyBjcmVhdGVkIHdpdGggaXMgdGhpcyBzdG9yZSdzIHBvbGljeS4gKi9cbiAgICAgICAgICAgIGNyZWF0ZVNvdXJjZT86IChjb25maWc6IHsgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnOyB3cml0ZURlbGF5OiBudW1iZXIgfSkgPT4gSUFyY2hpdmVzO1xuICAgICAgICAgICAgLyoqIEhhbmRzIGEgcnVubmluZyBzb3VyY2UgYSBjaGFuZ2VkIGNvbmZpZywgc28gYW4gZW5kcG9pbnQgd2UgYWxyZWFkeSB0YWxrIHRvIGlzIG5ldmVyIHJlYnVpbHQganVzdCBiZWNhdXNlIGEgZmxhZyBtb3ZlZC4gKi9cbiAgICAgICAgICAgIGFwcGx5U291cmNlPzogKHNvdXJjZTogSUFyY2hpdmVzLCBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCwgd3JpdGVEZWxheTogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEga2V5J3MgaW5kZXggZW50cnkgY2hhbmdlcyAob3VyIG93biB3cml0ZXMgQU5EIGZpbGVzIHB1bGxlZCBpbiB2aWEgc3luY2hyb25pemF0aW9uKSDigJQgaG93IHRoZSBzdG9yYWdlIHNlcnZlciBub3RpY2VzIHJvdXRpbmcgY29uZmlnIHVwZGF0ZXMuXG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZD86IChrZXk6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBDYWxsZWQgZXZlcnkgdGltZSB0aGlzIHN0b3JlIGFwcGxpZXMgYSByb3V0aW5nIGNvbmZpZyB0byBpdHNlbGYgKHN0YXJ0dXAsIGFuIG9wZXJhdG9yJ3Mgd3JpdGUsIGEgcGVlcidzIGNvcHkgYXJyaXZpbmcpIC0gdGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIHRoZSBzZXJ2ZXIgYXJtcyB3aW5kb3ctYm91bmRhcnkgc2NhbnMgZnJvbSBpdC4gKi9cbiAgICAgICAgICAgIG9uUm91dGluZ0FwcGxpZWQ/OiAocm91dGluZzogUmVtb3RlQ29uZmlnKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEFza3MgdGhlIGNsaWVudCB3aG9zZSByZXF1ZXN0IGNyZWF0ZWQgdGhpcyBzdG9yZSB3aGF0IHJvdXRpbmcgY29uZmlnIGl0IGludGVuZGVkIGZvciBvdXIgbmFtZS4gT25seSB1c2VkIHdoZW4gaW5pdCBmaW5kcyBOTyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXI6IGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBzbyB0aGUgcmVxdWVzdGVyIGhhcyB0aGF0IGNvbmZpZyAtIGFza2luZyBmb3IgaXQgbGF6aWx5IGlzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHBhc3NpbmcgdGhlIGNvbmZpZyBvbiBldmVyeSBjYWxsLCB3aXRob3V0IHRoZSBwZXItY2FsbCBraWxvYnl0ZXMuICovXG4gICAgICAgICAgICByZXF1ZXN0Um91dGluZ0NvbmZpZz86ICgpID0+IFByb21pc2U8UmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkPjtcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHdyaXRlIChcIm9yaWdpbmFsXCIpIGFuZCBldmVyeSB3cml0ZSB0aGF0IGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNvdXJjZXMgKFwiZmx1c2hlZFwiKS4gRmFzdCB3cml0ZXMgY29hbGVzY2UsIHNvIHRoZSB0d28gY291bnRzIGRpZmZlci5cbiAgICAgICAgICAgIG9uV3JpdGVDb3VudGVkPzogKGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyOiBcInN5bmMgZ2V0XCIgaXMgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSAodGhlIGJhY2tibGF6ZSBkb3dubG9hZCBiaWxsKSwgXCJzeW5jIHNldFwiIGlzIGJ5dGVzIHB1c2hlZCB0byBvbmUuIEluamVjdGVkIGJlY2F1c2Ugc3luYyB0cmFmZmljIG5ldmVyIHBhc3NlcyB0aHJvdWdoIHRoZSBBUEkgY29udHJvbGxlciwgc28gbm90aGluZyBlbHNlIGNhbiBjb3VudCBpdC4gKi9cbiAgICAgICAgICAgIG9uU3luY1RyYW5zZmVyPzogKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBSZXNvbHZlcyBhIHBlcnNpc3RlZCBzb3VyY2UgVVJMIChzZWUgQXJjaGl2ZXNTb3VyY2UudXJsKSB0byBhIGNhY2hlZCBJQXJjaGl2ZXMsIHNvIGVudHJpZXMgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBjb25maWd1cmVkIGNhbiBzdGlsbCBiZSByZWFkXG4gICAgICAgICAgICByZXNvbHZlU291cmNlVXJsPzogKHVybDogc3RyaW5nKSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzTGlzdCA9IG5ldyBTb3VyY2VzTGlzdChwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwic291cmNlc0xpc3QudHh0XCIpKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT4ocGF0aC5qb2luKGZvbGRlciwgXCJpbmRleFwiLCBcImJsb2JJbmRleDMubG9nXCIpKTtcbiAgICAgICAgdGhpcy5zeW5jID0gbmV3IFN0b3JlU3luYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZyA9IG5ldyBTdG9yZUNvbmZpZyhzdG9yZU5hbWUsIFtdKTtcbiAgICAgICAgdGhpcy5vd25EaXNrID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH1cblxuICAgIC8qKiBUaGlzIHN0b3JlJ3MgZm9sZGVyLCB1bndyYXBwZWQ6IHRoZSBzYW1lIGJ5dGVzIHNsb3QgMCBzZXJ2ZXMsIGJ1dCByZWFjaGVkIHdpdGhvdXQgaXRzIHdyaXRlIGRlbGF5LiBVc2VkIGZvciB0aGUgdHdvIHRoaW5ncyB0aGF0IGNhbm5vdCBnbyB0aHJvdWdoIGEgYnVmZmVyZWQgc291cmNlIC0gcmVhZGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIGJlZm9yZSB3ZSBoYXZlIGFueSBzb3VyY2VzLCBhbmQgc3RyZWFtaW5nIGEgbGFyZ2UgdXBsb2FkIHRoYXQgbXVzdCBub3Qgc2l0IGluIG1lbW9yeS4gKi9cbiAgICBwcml2YXRlIG93bkRpc2s6IEFyY2hpdmVzRGlzaztcblxuICAgIC8qKiBXaGF0IHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCB0byBiZS4gSXQgb3ducyB0aGlzOiB0aGUgcm91dGluZyBjb25maWcgaXMgYSBmaWxlIElOIHRoZSBzdG9yZSwgc28gdGhlIHN0b3JlIHJlYWRzIGl0LCBhcHBsaWVzIGl0IHRvIGl0c2VsZiwgYW5kIHJlLWFwcGxpZXMgaXQgd2hlbmV2ZXIgdGhlIGZpbGUgY2hhbmdlcyAtIGJ5IG91ciBvd24gd3JpdGUsIG9yIGJ5IGEgcGVlcidzIGNvcHkgYXJyaXZpbmcgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIHN0b3JlQ29uZmlnOiBTdG9yZUNvbmZpZztcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBsYXN0IGFwcGxpZWQsIHNvIGEgd3JpdGUgb2YgYW4gaWRlbnRpY2FsIChvciBvbGRlcikgb25lIGlzIG5vdCByZS1hcHBsaWVkXG4gICAgcHJpdmF0ZSBhcHBsaWVkUm91dGluZ1ZlcnNpb24gPSAtMTtcbiAgICAvLyAuLi5hbmQgdGhlIGNvbmZpZyBpdHNlbGYsIHNvIGEgcmVqZWN0aW9uIGNhbiBzYXkgZXhhY3RseSB3aGF0IHRoZSBzdG9yZSBJUyBydW5uaW5nIGluc3RlYWQgb2YgZ3Vlc3NpbmdcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyAjcmVnaW9uIE1haW4gaW50ZXJmYWNlXG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBDb25maWd1cmUgZmlyc3Q6IHRoZSBjb25maWcgZGVjaWRlcyB3aGF0IHRoZSBzb3VyY2VzIEFSRSwgYW5kIGV2ZXJ5dGhpbmcgYmVsb3cgaXMgcGVyIHNvdXJjZS4gV2l0aCBubyBjb25maWcgYXQgYWxsIHRoYXQgaXMganVzdCBvdXIgb3duIGRpc2ssIHdoaWNoIGlzIGVub3VnaCB0byBzZXJ2ZSBhbmQgdG8gYmUgd3JpdHRlbiB0by5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgLy8gTm8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyIGF0IGFsbCAtIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGlzIHN0b3JlIHdhcyBqdXN0IENSRUFURUQgYnkgYSByZXF1ZXN0LCBiZWZvcmUgYW55IGNvbmZpZyB3cml0ZSByZWFjaGVkIGl0LiBUaGUgcmVxdWVzdGVyIGtub3dzIGV4YWN0bHkgd2hhdCBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLCBzbyBhc2sgaXQuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGggJiYgdGhpcy5jb25maWc/LnJlcXVlc3RSb3V0aW5nQ29uZmlnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBwcm92aWRlZCA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3RSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgaW5pdGlhbGl6ZWQgd2l0aCBubyBjb25maWd1cmF0aW9uOyB0aGUgcmVxdWVzdGluZyBjbGllbnQgcHJvdmlkZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocHJvdmlkZWQpfSAtIGFkb3B0aW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmFpZ2h0IG9udG8gdGhlIGRpc2ssIG5vdCB0aHJvdWdoIHNldCgpOiBzZXQgd2FpdHMgZm9yIGluaXQsIHdoaWNoIGlzIHdoYXQgaXMgcnVubmluZyByaWdodCBub3dcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vd25EaXNrLnNldChST1VUSU5HX0ZJTEUsIEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhwcm92aWRlZCkpLCB7IGxhc3RNb2RpZmllZDogTWF0aC5yb3VuZChEYXRlLm5vdygpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dTdG9yYWdlV2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQXNraW5nIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBmb3IgdGhlIHJvdXRpbmcgY29uZmlnIG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQgLSBydW5uaW5nIHVuY29uZmlndXJlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclNsb3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWZ0ZXIgdGhlIHNsb3RzLCB3aGljaCBpcyB3aGF0IGluZGV4IGVudHJpZXMgbmFtZSBhcyB0aGVpciBob2xkZXJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3luYy5zdGFydCgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmUtcmVhZHMgdGhlIHJvdXRpbmcgY29uZmlnIG91dCBvZiB0aGlzIHN0b3JlIGFuZCBhcHBsaWVzIGl0IHRvIGl0c2VsZi4gQ2FsbGVkIGF0IHN0YXJ0dXAgYW5kXG4gICAgICogd2hlbmV2ZXIgdGhhdCBmaWxlIGNoYW5nZXMgaGVyZSAtIHdoaWNoIGlzIHRoZSBPTkUgbWVjaGFuaXNtOiBhIGNvbmZpZyB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yXG4gICAgICogYW5kIGEgY29uZmlnIHB1bGxlZCBvZmYgYSBwZWVyIGFyZSB0aGUgc2FtZSBldmVudCwgYSB3cml0ZSBvZiB0aGF0IHBhdGggaW50byB0aGlzIHN0b3JlLlxuICAgICAqXG4gICAgICogQSBzdG9yZSB3aXRoIG5vIHJvdXRpbmcgY29uZmlnIGNvbmZpZ3VyZXMgaXRzZWxmIGFzIGl0cyBvd24gZGlzaywgdmFsaWQgYWx3YXlzLCBmb3IgdGhlIHdob2xlXG4gICAgICoga2V5IHNwYWNlLiBUaGF0IGlzIGEgY29tcGxldGUsIHdvcmtpbmcgc3RvcmUgLSBpdCBqdXN0IGhhcyBub2JvZHkgdG8gc3luY2hyb25pemUgd2l0aCAtIGFuZCBpdFxuICAgICAqIGlzIHdoYXQgbGV0cyBhIHN0b3JlIGV4aXN0IGJlZm9yZSBpdCBoYXMgZXZlciBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGFwcGx5Um91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCB0aGlzLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIGxldCBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSA9IFtdO1xuICAgICAgICBsZXQgcGVlcnM6IFNvdXJjZUNvbmZpZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nPy5zb3VyY2VzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lICYmIHRoaXMuY29uZmlnPy5pc1NlbGY/Lihzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHNvdXJjZSBhcyBIb3N0ZWRDb25maWcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVlcnMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0aW5nICYmICFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nU3RvcmFnZVdhcm4oYFRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9KSBkb2VzIG5vdCBuYW1lIHRoaXMgc3RvcmUgKCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSkgYXMgb25lIG9mIG91cnMsIHNvIGl0IHN0YXlzIGEgZGlzay1vbmx5IHN0b3JlYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXZpb3VzVmVyc2lvbiA9IHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IHJvdXRpbmcgJiYgZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKSB8fCAtMTtcbiAgICAgICAgaWYgKG5ld1ZlcnNpb24gIT09IHByZXZpb3VzVmVyc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBhZG9wdGVkIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtwcmV2aW91c1ZlcnNpb259IC0+ICR7bmV3VmVyc2lvbn06ICR7ZW50cmllcy5sZW5ndGh9IGVudHIke2VudHJpZXMubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG9mIG91cnMgJHtKU09OLnN0cmluZ2lmeShlbnRyaWVzLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9LCAke3BlZXJzLmxlbmd0aH0gcGVlcihzKWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcudXBkYXRlKGVudHJpZXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZXModGhpcy5wbGFuU291cmNlcyhwZWVycykpO1xuICAgICAgICB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmcgPSByb3V0aW5nO1xuICAgICAgICBpZiAocm91dGluZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWc/Lm9uUm91dGluZ0FwcGxpZWQ/Lihyb3V0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBhcyB0aGlzIHN0b3JlIGhvbGRzIGl0LCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgZm9sZGVyOiB0aGUgc3RvcmUgbWF5IGJlIGNvbmZpZ3VyaW5nIGl0c2VsZiBiZWZvcmUgaXQgaGFzIHNjYW5uZWQgYW55dGhpbmcsIGFuZCB0aGlzIGZpbGUgaXMgd2hhdCBkZWNpZGVzIHdoYXQgYSBzY2FuIHdvdWxkIGV2ZW4gdGFsayB0b1xuICAgIHByaXZhdGUgYXN5bmMgcmVhZFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLm93bkRpc2suZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFVucGFyc2VhYmxlIHJlYWRzIGFzIFwibm8gY29uZmlnXCIgKHBhcnNlUm91dGluZ0RhdGEgbG9ncyBpdCkgLSBhIHN0b3JlIG11c3QgbmV2ZXIgYmUgdW5hYmxlIHRvIHN0YXJ0IGJlY2F1c2UgaXRzIG93biByb3V0aW5nIGZpbGUgaXMgdG9yblxuICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgaXMgcnVubmluZywgc28gYSBjb3B5IGZvdW5kIG9uIGEgcGVlciBpcyBvbmx5IHRha2VuIHdoZW4gaXQgaXMgZ2VudWluZWx5IG5ld2VyLiAtMSBtZWFucyBpdCBoYXMgbm9uZS4gKi9cbiAgICBwdWJsaWMgcm91dGluZ1ZlcnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEFwcGx5aW5nIGl0IHRvdWNoZXMgdGhlIHNvdXJjZXMsIHNvIGl0IGlzIHNlcmlhbGl6ZWQgYmVoaW5kIHdoYXRldmVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZyByYXRoZXIgdGhhbiBpbnRlcmxlYXZpbmcgd2l0aCBpdFxuICAgIHByaXZhdGUgcm91dGluZ0FwcGxpZXM6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwdWJsaWMgcmVhcHBseVJvdXRpbmdDb25maWcoKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5yb3V0aW5nQXBwbGllcy50aGVuKCgpID0+IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCkpO1xuICAgICAgICB0aGlzLnJvdXRpbmdBcHBsaWVzID0gbmV4dC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB2b2lkIG5leHQuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjsgaW5jbHVkZU1hcmtlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbnRlcm5hbDIoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWcucmFuZ2U7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIC8vIEEgbWFya2VkIGRlbGV0aW9uIHN0aWxsIGhhcyBpdHMgYnl0ZXMsIGFuZCB0aGUga2VwdCB2YWx1ZSBzYXlzIHdoZXJlIC0gc28gYW4gaW5jbHVkZU1hcmtlZCByZWFkIGlzIGEgbm9ybWFsIHJlYWQgdGhyb3VnaCB0aGUgbWFya2VkIGVudHJ5IChpdCBqdXN0IG11c3Qgbm90IFJFLUlOREVYIGFueXRoaW5nOiBzZWUgdGhlIG1hcmtlZFJlYWQgZ3VhcmRzIGJlbG93KVxuICAgICAgICBsZXQgbWFya2VkUmVhZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudHJ5ICYmIGNvbmZpZy5pbmNsdWRlTWFya2VkKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIG1hcmtlZFJlYWQgPSAhIWVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBoYXMgbm8gYnl0ZXMgLSB0aGUgdG9tYnN0b25lIElTIHRoZSBhbnN3ZXIsIHNvIGEgZmxhZy1jYWxsZXIgZ2V0cyBpdHMgdGltZSB3aXRoIGVtcHR5IGRhdGFcbiAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luYy5ub3RlQWNjZXNzKGtleSk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXM6IHRoZSBob2xkZXIgYW5zd2VyaW5nIFwiZGVsZXRlZFwiIChhIHRvbWJzdG9uZSwgd2l0aCBpdHMgd3JpdGUgdGltZSkgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIkkgbG9zdCB0aGUgZmlsZVwiIC0gdGhlIGZvcm1lciBpcyBhdXRob3JpdGF0aXZlIGFuZCBtdXN0IE5PVCBmYWxsIGJhY2sgdG8gb2xkZXIgY29waWVzLCB3aGljaCB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0aW9uIGZvciB0aGlzIHJlYWRcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UsIGludGVybmFsOiB0cnVlLCBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmICFhbnN3ZXIuZGF0YS5sZW5ndGggJiYgIShyYW5nZSAmJiBhbnN3ZXIuc2l6ZSkgJiYgYW5zd2VyLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYSByYW5nZWQgcmVhZCBvZiBhIHJlYWwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IChyYW5nZSBwYXN0IEVPRiksIHNvIG9ubHkgdW5yYW5nZWQgZW1wdGluZXNzIG1lYW5zIHRvbWJzdG9uZS9hYnNlbnRcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIChhbnN3ZXIuZGF0YS5sZW5ndGggfHwgcmFuZ2UgJiYgYW5zd2VyLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpLCBhbmQgYSBtYXJrZWQgcmVhZCBtdXN0IG5vdCByZS1pbmRleCBhbnl0aGluZyAtIGNhY2hpbmcgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGtleSBhcyBsaXZlXG4gICAgICAgICAgICBpZiAoIW1hcmtlZFJlYWQgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5LCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgY291bnRzIGFzIGFic2VudCAtIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodGhpcyByZWFkIGlzIHVucmFuZ2VkLCBzbyBlbXB0aW5lc3MgaXMgdW5hbWJpZ3VvdXMpXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiBhbnN3ZXIuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgbWFya2VkIHJlYWQgbXVzdCBub3QgcmUtaW5kZXggYW55dGhpbmcgLSBjYWNoaW5nIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRlZCBrZXkgYXMgbGl2ZVxuICAgICAgICAgICAgaWYgKCFtYXJrZWRSZWFkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS4gKE5ldmVyIGZvciBhIG1hcmtlZCByZWFkOiBwdXJnaW5nIHdvdWxkIGVyYXNlIHRoZSBkZWxldGlvbidzIHRvbWJzdG9uZS4pXG4gICAgICAgIGlmICghbWFya2VkUmVhZCkge1xuICAgICAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuOyB1bmRlbGV0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBwYXRoOiBrZXksIGRhdGEgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXB0eSB3cml0ZSByZWZ1c2VkOiBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gTWF0aC5yb3VuZChjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvd3Mvcm91dGVzLCBzbyB0aGV5IGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IChhbmQgaXQgbmV2ZXIgZmxvd3MgdGhyb3VnaCB2YWxpZGF0aW9uKSAtIGJ1dCBpdCBoYXMgYSBydWxlIG9mIGl0cyBvd24sIHdoaWNoIGlzIG91cnMgdG8gZW5mb3JjZSBiZWNhdXNlIHRoZSBmaWxlIGlzIG91cnNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy51bmRlbGV0ZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgdW5kZWxldGVkIChpdCBjYW5ub3QgYmUgZGVsZXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVuZGVsZXRlS2V5KGtleSwgd3JpdGVUaW1lLCBjb25maWcuaW50ZXJuYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBza2lwcyBldmVyeSBvdGhlciBjaGVjazogaXQgaXMgdGhlIGZpbGUgdGhhdCBERUZJTkVTIG91ciB3aW5kb3dzIGFuZCByb3V0ZXMsIHNvIGp1ZGdpbmcgaXQgYnkgdGhlIGNvbmZpZyBpdCBpcyBhYm91dCB0byByZXBsYWNlIGlzIGhvdyBhIHN0b3JlIGdldHMgc3R1Y2sgb24gYSBjb25maWcgaXQgY2FuIG5ldmVyIGJlIHRvbGQgdG8gbGVhdmVcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIEEgZGVsZXRpb24gbGFuZHMgaW4gZXhhY3RseSB0aGUgc2FtZSBwbGFjZSBhIHdyaXRlIHdvdWxkLCBzbyBpdCBpcyBqdWRnZWQgdGhlIHNhbWUgd2F5OiBvbmUgYWltZWQgYXQgYSBzaGFyZCB3ZSBkb24ndCBzZXJ2ZSBpcyBqdXN0IGFzIGludmlzaWJsZSBhcyBhIHdyaXRlIHRvIGl0XG4gICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCBnZXRSb3V0ZShrZXkpLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBkZWxldGlvbnMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgICAgIC8vIHNldEludGVybmFsIHRyZWF0cyBhbiBlbXB0eSBidWZmZXIgYXMgZXhhY3RseSBhIGRlbGV0aW9uOiBkaXNrIHJlbW92YWwgcGx1cyBhIHRvbWJzdG9uZSBpbmRleCBlbnRyeSwgbm8gZmFuLW91dFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlcyBhcmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHRvbWJzdG9uZSBpcyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZCBpcyBldmVudHVhbGx5IGV4cGlyZWRcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgLyoqIEEgbm9kZS1zaWRlIG1vdmU6IHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2xpZW50LiBEZWxpYmVyYXRlbHkganVzdCBnZXQyICsgc2V0ICsgZGVsIHJhdGhlciB0aGFuIGEgZGlzayByZW5hbWUsIHNvIHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBwYXNzZXMgRVZFUlkgcnVsZSBhIHNldCBwYXNzZXMgKHdpbmRvd3MsIHJvdXRlcywgaW1tdXRhYmlsaXR5LCBvbmx5LXRha2UtbGF0ZXN0LCBpbmRleCwgZmFuLW91dCB0byBwZWVycykgYW5kIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVzIGFzIGEgbm9ybWFsIHRvbWJzdG9uZSAtIGEgcmVuYW1lIHdvdWxkIGJ5cGFzcyBhbGwgb2YgaXQuIFRoZSBzZXQgc3RhbXBzIGZyZXNoLCBzbyB0aGUgbW92ZWQgZmlsZSBiZWF0cyBhbnkgdG9tYnN0b25lIGF0IGl0cyBuZXcgcGF0aC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Mih7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoeyBwYXRoOiBjb25maWcudG9QYXRoLCBkYXRhOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWwoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwibW92ZVwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGNvbmZpZy5mcm9tUGF0aCwgdG9QYXRoOiBjb25maWcudG9QYXRoLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkgcmV0dXJuIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfTtcbiAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgcHJlZml4OiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgcHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgLy8gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSBhdCBhbGwsIHdoaWNoIGlzIHdoYXQgYSBsaXN0aW5nIHdhbnRzOiBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlXG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gU2VlIEZpbmRDb25maWcuaW50ZXJuYWw6IGFuIGVudHJ5IGhlbGQgYnkgb25lIG9mIG91ciBPVEhFUiBzb3VyY2VzIGNhbm5vdCBiZSBzZXJ2ZWQgdG8gYSBwZWVyJ3MgaW50ZXJuYWwgcmVhZCwgc28gaXQgbXVzdCBub3QgYmUgbGlzdGVkIHRvIG9uZSBlaXRoZXJcbiAgICAgICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW5jbHVkZU1hcmtlZCkge1xuICAgICAgICAgICAgLy8gQSBrZXkgaXMgbGl2ZSBPUiBtYXJrZWQsIG5ldmVyIGJvdGgsIHNvIHRoaXMgY2Fubm90IGNvbGxpZGUgd2l0aCB0aGUgbG9vcCBhYm92ZVxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWFya2VkRW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCB7IHNoYWxsb3c6IGNvbmZpZy5zaGFsbG93LCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gQWxsIGZpbGVzIGNoYW5nZWQgYWZ0ZXIgY29uZmlnLnRpbWUg4oCUIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIGVudHJpZXM6IGEgY2FsbGVyIHJlYWRpbmcgYSBjaGFuZ2UgZmVlZCBoYXMgdG8gaGVhciBhYm91dCB0aGVtLCBhbmQgc2l6ZSAwIGlzIGhvdyB0aGUgZmVlZCBzYXlzIFwiZ29uZVwiIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gY29uZmlnLnJvdXRlcyBsZXRzIGEgc3RvcmUgc3luY2luZyBhIHBhcnRpYWwgc2hhcmQgYXNrIGZvciBqdXN0IGl0cyBzbGljZS5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgaW5Sb3V0ZXMgPSAoa2V5OiBzdHJpbmcpID0+ICFjb25maWcucm91dGVzIHx8IGNvbmZpZy5yb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFNlZSBDaGFuZ2VzQWZ0ZXJDb25maWcuaW50ZXJuYWwgKGRlbGV0aW9ucyBiZWxvdyBhcmUgYWx3YXlzIHJlcG9ydGVkIC0gdGhleSBhcmUgaW5kZXgtb25seSlcbiAgICAgICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lLCBzaXplOiAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5kZXgncyB0b3RhbHMgcGx1cyBhbnkgaW4tcHJvZ3Jlc3MgYmFja2dyb3VuZCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIGdldFN5bmNQcm9ncmVzcygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBtYXJrZWQ6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCwgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBtYXJrZWQ6IHRoaXMubWFya2VkVG90YWxzKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0b3RhbHMuc291cmNlcyxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogdGhpcy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiB0aGlzLnN5bmMuZ2V0QWN0aXZpdGllcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBnZXRTeW5jUHJvZ3Jlc3MncyB0b3RhbHMsIGJ1dCBsb2FkaW5nIHRoZSBpbmRleCBmaXJzdCwgc28gdGhleSBhcmUgbmV2ZXIgdGhlIHplcm9lcyBvZiBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgeWV0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYW1lZEluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5pbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LFxuICAgICAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHsgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgLi4udG90YWxzLnNsb3RzW2ldIH0pKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RvcmUncyBzb3VyY2VzLCBhcyB0aGUgY3VycmVudCByb3V0aW5nIGNvbmZpZyBzYXlzIHRoZXkgc2hvdWxkIGJlLiBUaGlzIGlzIHRoZSBPTkxZIHdheVxuICAgICAqIHRoZXkgYXJlIGV2ZXIgc2V0OiB0aGUgZmlyc3QgY2FsbCBwb3B1bGF0ZXMgYW4gZW1wdHkgc3RvcmUsIGV2ZXJ5IGxhdGVyIG9uZSBhcHBsaWVzIGEgY2hhbmdlIHRvXG4gICAgICogdGhlIHJ1bm5pbmcgb25lLiBXaW5kb3dzLCByb3V0ZXMgYW5kIGZsYWdzIG1vdmUgaW4gcGxhY2UsIGdlbnVpbmVseSBuZXcgZW5kcG9pbnRzIGFyZSBhZGRlZCBhbmRcbiAgICAgKiBzdGFydCBzY2FubmluZywgYW5kIGVuZHBvaW50cyB0aGF0IGFyZSBnb25lIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXNcbiAgICAgKiBkcm9wKS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgaXMgbmV2ZXIgcmVidWlsdCBmb3IgYSBjb25maWcgY2hhbmdlLiBJdHMgbmFtZSBkZWNpZGVzIGl0cyBmb2xkZXIgYW5kIGl0cyBpZGVudGl0eSwgYW5kXG4gICAgICogYSBjb25maWcgY2hhbmdlIGNhbm5vdCBjaGFuZ2UgZWl0aGVyIC0gc28gdGhlcmUgaXMgbm90aGluZyBhIGNoYW5nZSBjYW4gZG8gdG8gYSBzdG9yZSBleGNlcHRcbiAgICAgKiB0aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTb3VyY2VzKHNwZWNzOiBCbG9iU291cmNlU3BlY1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3BlY3MubGVuZ3RoIHx8IHNwZWNzWzBdLmlkZW50aXR5ICE9PSBcImRpc2tcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVTb3VyY2VzIGV4cGVjdHMgdGhlIGRpc2sgc291cmNlIGZpcnN0IChpZGVudGl0eSBcImRpc2tcIiksIGdvdCAke0pTT04uc3RyaW5naWZ5KHNwZWNzLm1hcCh4ID0+IHguaWRlbnRpdHkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbDogdGhlIGRpc2sgc2xvdCBoYXMgdG8gZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBtYXRjaGVkIGFnYWluc3QgaXRcbiAgICAgICAgICAgIGxldCBkaXNrID0gc3BlY3NbMF07XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZGlzay5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IGRpc2sudXJsLCB2YWxpZFdpbmRvd3M6IGRpc2sudmFsaWRXaW5kb3dzLCByb3V0ZTogZGlzay5yb3V0ZSwgbm9GdWxsU3luYzogZGlzay5ub0Z1bGxTeW5jLCBzb3VyY2VDb25maWc6IGRpc2suc291cmNlQ29uZmlnLCBpZGVudGl0eTogZGlzay5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvd3MgPSAoaTogbnVtYmVyLCB3aW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pID0+IHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgPT09IEpTT04uc3RyaW5naWZ5KHdpbmRvd3MpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93cyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkob2xkKX0gLT4gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3dzKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MgPSB3aW5kb3dzO1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3dzKDAsIHNwZWNzWzBdLnZhbGlkV2luZG93cyk7XG4gICAgICAgIC8vIExpdmUgc2xvdHMgcGFpciB3aXRoIHNwZWNzIGJ5IGlkZW50aXR5LiBFYWNoIGVuZHBvaW50IGlzIG5vdyBPTkUgc3BlYyBjYXJyeWluZyBhbGwgaXRzIHdpbmRvd3MsIHNvIHRoaXMgaXMgYSAxOjEgcGFpcmluZzsgYW55IGxlZnRvdmVyIGR1cGxpY2F0ZSBzbG90cyBmcm9tIGJlZm9yZSAoYW4gZW5kcG9pbnQgdGhhdCB1c2VkIHRvIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBzbG90cykgZ28gdW5tYXRjaGVkIGJlbG93IGFuZCBhcmUgY29sbGFwc2VkIGF3YXkuXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBTQU1FIGVuZHBvaW50IChzZWUgc291cmNlSWRlbnRpdHkpLCBzbyB3ZSBhcmUgYWxyZWFkeSBzeW5jaHJvbml6ZWQgd2l0aCBpdDogdGhlIHNsb3Qga2VlcHMgaXRzIGNvbm5lY3Rpb24sIGl0cyBjb21wbGV0ZWQgc2NhbnMsIGFuZCBpdHMgaW5kZXggZW50cmllcywgYW5kIG9ubHkgdGhlIHBvbGljeSBvbiBpdCBtb3Zlcy4gUmVjcmVhdGluZyBpdCBoZXJlIHdvdWxkIG1lYW4gcmVzY2FubmluZyB0aGUgZW5kcG9pbnQgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUgYSBmbGFnIGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93cyhzbG90LCBzcGVjLnZhbGlkV2luZG93cyk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zb3VyY2VzW3Nsb3RdO1xuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0ZSBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJvdXRlID0gc3BlYy5yb3V0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLCBrZWVwaW5nIHRoZSBzb3VyY2UgKHNvIGl0IGlzIG5vdCByZXNjYW5uZWQpOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGNhcnJpZXMgaXRzIGNvbmZpZyAoYW5kIGl0cyB3cml0ZSBkZWxheSkgaW50byBldmVyeXRoaW5nIGl0IGRvZXMsIHNvIGl0IGhhcyB0byBsZWFybiB0aGUgbmV3IG9uZSAtIHNlZSBhcHBseVNvdXJjZUNvbmZpZ1xuICAgICAgICAgICAgICAgIHNwZWMuYXBwbHlDb25maWc/LihleGlzdGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc291cmNlQ29uZmlnID0gc3BlYy5zb3VyY2VDb25maWc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IHNwZWMudXJsLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCByb3V0ZTogc3BlYy5yb3V0ZSwgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLCBpbnRlcm1lZGlhdGU6IHNwZWMuaW50ZXJtZWRpYXRlLCBzb3VyY2VDb25maWc6IHNwZWMuc291cmNlQ29uZmlnLCBpZGVudGl0eTogc3BlYy5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYSBnZW51aW5lbHkgbmV3IGVuZHBvaW50LCBzbyBpdCBpcyBzY2FubmVkIGZyb20gc2NyYXRjaGApO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSBzbG90IGlzIGRlYWQgdGhlIG1vbWVudCB0aGlzIHJldHVybnM7IGRyb3BwaW5nIHRoZSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgaXMgdGhlIHBhcnQgdGhhdCByZWFkcyB0aGUgaW5kZXgsIHNvIGl0IGZpbmlzaGVzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICB2b2lkIHRoaXMuc3luYy5yZW1vdmVTb3VyY2UoaSkuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYFJlbW92aW5nIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMucmVzY2FuQmFzZSgpO1xuICAgIH1cblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5ib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlLCBjb25maWcpO1xuICAgIH1cblxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSksIGFuZCByZWNvbmNpbGlhdGlvbiBjYXJyaWVzIHRoZW0gdG8gdGhlIG90aGVyIHNvdXJjZXMgLSB0aGVyZSBpcyBubyBkZWxheWVkLXdyaXRlIHN0YWdlIHRoZXkgY291bGQgcGFzcyB0aHJvdWdoLiBUaGUgd3JpdGUgaXRzZWxmIGlzIHZhbGlkYXRlZCBleGFjdGx5IGxpa2Ugc2V0J3MsIHJpZ2h0IGhlcmU6IHRoZSBjbGllbnQgaXMgYWJvdXQgdG8gc2VuZCB0aGUgd2hvbGUgZmlsZSwgc28gZXZlcnkgcmVhc29uIHRvIHJlZnVzZSBpdCBtdXN0IGJlIGZvdW5kIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZS5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnRMYXJnZVVwbG9hZChjb25maWc/OiB7IHBhdGg/OiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWc/LnBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCB3cml0ZVRpbWUgPSBNYXRoLnJvdW5kKGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnPy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkuIFRoZSBjbGllbnQgaXMgYWxyZWFkeSBzdHJlYW1pbmcsIHNvIHRoZSB1cGxvYWQgaXMgYWNjZXB0ZWQgYW5kIGV2ZXJ5IHBhcnQgZGlzY2FyZGVkIC0gdGhlIGFsdGVybmF0aXZlIGlzIHRocm93aW5nIGF0IGEgY2FsbGVyIHRoYXQgZGlkIG5vdGhpbmcgd3JvbmcuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGAke0RJU0NBUkRFRF9VUExPQURfUFJFRklYfSR7dGhpcy5uZXh0RGlzY2FyZGVkVXBsb2FkKyt9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnPy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBvZmZzZXQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmhhcyhjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcuZGF0YSwgY29uZmlnLm9mZnNldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gYSBuZXdlciB2YWx1ZSBjYW4gbGFuZCB3aGlsZSBhIGxvbmcgdXBsb2FkIGlzIHN0aWxsIHN0cmVhbWluZywgc28gdGhpcyBpcyByZS1jaGVja2VkIGhlcmUgcmF0aGVyIHRoYW4gb25seSBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGNvbmZpZy5wYXRoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBkaXNrLmdldEluZm8oY29uZmlnLnBhdGgpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGNvbmZpZy5wYXRoLCB7IHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0TGFyZ2VcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBjb25maWcucGF0aCwgc2l6ZTogaW5mby5zaXplLCB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gSW50ZXJuYWxzXG5cbiAgICAvKiogQnl0ZXMgb2YgcmVhZCBjYWNoZSB0aGUgZGlzayBtYXkgaG9sZDsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXQgKFN0b3JlU3luYyBlbmZvcmNlcyBpdCkuIFJlYWQgZnJvbSB0aGUgY29uZmlnIGluIGVmZmVjdCwgc28gcmFpc2luZyBvciByZW1vdmluZyB0aGUgbGltaXQgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2aWN0aW9uIHBhc3MuICovXG4gICAgcHVibGljIGdldCByZWFkZXJEaXNrTGltaXQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHdyaXRlIHRpbWUgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQsIG9yIDAgd2hlbiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBrZXkuIENvdW50cyBERUxFVElPTlMgdG9vOiBhIHdyaXRlIG9sZGVyIHRoYW4gdGhlIGRlbGV0aW9uIHRoYXQgcmVtb3ZlZCBpdCBtdXN0IG5vdCBicmluZyBpdCBiYWNrLiBUaGUgaW5kZXggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhIHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIGEgZGVsYXllZCBzb3VyY2UsIHNpbmNlIHRoZSBlbnRyeSBpcyByZWNvcmRlZCB3aGVuIHRoZSB3cml0ZSBpcyBhY2NlcHRlZCByYXRoZXIgdGhhbiB3aGVuIGl0IHJlYWNoZXMgc3RvcmFnZS4gKi9cbiAgICBwdWJsaWMgY3VycmVudFdyaXRlVGltZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnRpbWVPZihrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5pc0xpdmUoc291cmNlSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90LCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc2xvdCBuZXZlciBnb3QgdGhhdCBmYXIgKGEgc291cmNlIHJlbW92ZWQgYmVmb3JlIGl0cyByZWdpc3RyYXRpb24gcmVzb2x2ZWQpLiAqL1xuICAgIHB1YmxpYyBzbG90U291cmNlc0xpc3RJbmRleChzbG90OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgIH1cblxuICAgIC8vIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90IC0gb25seSB2YWxpZCBvbmNlIHRoZSBzbG90J3MgcmVnaXN0cmF0aW9uIHJlc29sdmVkIChpbml0IGFuZCB0aGUgc291cmNlJ3Mgc3luYyBsb29wIGd1YXJhbnRlZSB0aGF0IGJlZm9yZSBhbnkgaW5kZXhpbmcgaGFwcGVucylcbiAgICBwdWJsaWMgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldC4gU2xvdCAke3Nsb3R9ICgke3RoaXMuc291cmNlc1tzbG90XT8udXJsfSkgaGFzIG5vIHNvdXJjZXNMaXN0SW5kZXggKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGl2ZSBzbG90IGN1cnJlbnRseSBzZXJ2aW5nIGEgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4LCBvciB1bmRlZmluZWQgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhhdCBVUkwgYW55bW9yZS4gTGluZWFyLCBidXQgdGhlIHNvdXJjZXMgbGlzdCBpcyB0aW55IGFuZCB0aGlzIGlzIGFsd2F5cyBjdXJyZW50IChzbG90cyBkeWluZywgb3Igc2V2ZXJhbCBzbG90cyBzaGFyaW5nIG9uZSBVUkwgYWNyb3NzIHZhbGlkIHdpbmRvd3MsIG5lZWQgbm8gYm9va2tlZXBpbmcpLlxuICAgIHB1YmxpYyBzbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tpXSA9PT0gc291cmNlc0xpc3RJbmRleCAmJiB0aGlzLmlzTGl2ZShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgSUFyY2hpdmVzIGN1cnJlbnRseSBob2xkaW5nIGFuIGVudHJ5J3MgYnl0ZXM6IHRoZSBsaXZlIHNsb3Qgd2hlbiB0aGUgaG9sZGVyIGlzIHN0aWxsIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSByZXNvbHZlZCAoY2FjaGVkKSBzdHJhaWdodCBmcm9tIGl0cyBwZXJzaXN0ZWQgVVJMIC0gd2luZG93cy9yb3V0ZXMgZGVjaWRlIHdoZW4gYSBzb3VyY2UgaXMgc2Nhbm5lZCBvciB3cml0dGVuLCBidXQgZm9yIHJlYWRpbmcgYnl0ZXMgd2Uga25vdyBpdCBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2hcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cnlIb2xkZXIoZW50cnk6IEluZGV4RW50cnkpOiBQcm9taXNlPElBcmNoaXZlcyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmwoZW50cnkuc291cmNlc0xpc3RJbmRleCkgfHwgYXdhaXQgdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmxSZWxvYWRpbmcoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/LnJlc29sdmVTb3VyY2VVcmw/Lih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluZGV4LmxvYWQoKTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgKHNlZSBTdG9yZVN5bmMncyBzY2FuIGhhbmRsaW5nKSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlLCBzbyBpdCBpcyBjb3JyZWN0ZWQgb25jZSwgaGVyZVxuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuZ2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUpO1xuICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgIGlmIChyb3V0aW5nICYmIHJvdXRpbmcuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUsIHsgd3JpdGVUaW1lOiByb3V0aW5nLndyaXRlVGltZSwgc2l6ZTogcm91dGluZy5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBiYXNlU291cmNlc0xpc3RJbmRleCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgd2UgaG9sZC4gQSBkZWxldGVkIG9uZSBpcyBub3Qgb25lOiBpdCBpcyBhIHRvbWJzdG9uZSwgYW5kIG9ubHkgZ2V0RGVsZXRlZEVudHJ5IGtub3dzIGFib3V0IGl0LiAqL1xuICAgIHB1YmxpYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogSW5kZXhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIFdoZW4gYSBrZXkgd2FzIGRlbGV0ZWQsIGlmIGl0IHdhcy4gQSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlIHdpdGggYSB0aW1lIGF0dGFjaGVkIC0gdGhhdCB0aW1lIGlzIHdoYXQgbWFrZXMgaXQgcHJvcGFnYXRlIGFuZCB3aGF0IGV4cGlyZXMgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWRFbnRyeShrZXk6IHN0cmluZyk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZmlsZSB3ZSBob2xkLCBmb3IgdGhlIHBhc3NlcyB0aGF0IHdhbGsgdGhlbSBhbGwgKGxpc3RpbmdzLCBzY2FucywgcmVjb25jaWxpYXRpb24sIGV2aWN0aW9uKS4gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSAtIHNlZSBkZWxldGVkRW50cmllcy4gTGl2ZTogZGVsZXRpbmcgZW50cmllcyB3aGlsZSBpdGVyYXRpbmcgaXMgZXhwZWN0ZWQgaGVyZSwgYW5kIHNhZmUuICovXG4gICAgcHVibGljICppbmRleEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZGVsZXRpb24gd2Uga25vdyBvZi4gQSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSBmaWxlcywgd2hpY2ggaXMgd2hhdCBtYWtlcyBleHBpcmluZyB0aGVtIGNoZWFwLiAqL1xuICAgIHB1YmxpYyAqZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIE1BUktFRCBmb3IgZGVsZXRpb246IGl0cyBrZXB0IGluZGV4IHZhbHVlIHBsdXMgd2hlbiBpdCB3YXMgZGVsZXRlZC4gVW5kZWZpbmVkIHdoZW4gdGhlIGtleSBpcyBsaXZlLCBuZXZlciBleGlzdGVkLCBvciBpdHMgaGlzdG9yeSB3YXMgYWxyZWFkeSBkcm9wcGVkLiAqL1xuICAgIHB1YmxpYyBnZXRNYXJrZWRFbnRyeShrZXk6IHN0cmluZyk6IChJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfSkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lIHx8IHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi50b21ic3RvbmUudmFsdWUsIHdyaXRlVGltZTogdG9tYnN0b25lLnZhbHVlVGltZSB8fCB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0LCBkZWxldGVUaW1lOiB0b21ic3RvbmUudGltZSB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIG1hcmtlZCBmb3IgZGVsZXRpb24gLSB0aGUgZGVsZXRpb24gaGlzdG9yeSwgd2Fsa2VkIGJ5IHJldGVudGlvbiBhbmQgYnkgaW5jbHVkZU1hcmtlZCBsaXN0aW5ncy4gKi9cbiAgICBwdWJsaWMgKm1hcmtlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLnRvbWJzdG9uZS52YWx1ZSwgd3JpdGVUaW1lOiB0b21ic3RvbmUudmFsdWVUaW1lIHx8IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQsIGRlbGV0ZVRpbWU6IHRvbWJzdG9uZS50aW1lIH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBkZWxldGlvbiBoaXN0b3J5J3MgdG90YWxzOiBob3cgbWFueSBtYXJrZWQgZmlsZXMsIHRoZWlyIGJ5dGVzLCBhbmQgdGhlIGRlbGV0ZSB0aW1lIG9mIHRoZSBPTERFU1Qgb25lIC0gd2hpY2ggaXMgaG93IGZhciBiYWNrIHRoZSBoaXN0b3J5IHJlYWNoZXMuICovXG4gICAgcHVibGljIG1hcmtlZFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgb2xkZXN0RGVsZXRlVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBpZiAob2xkZXN0RGVsZXRlVGltZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LmRlbGV0ZVRpbWUgPCBvbGRlc3REZWxldGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgb2xkZXN0RGVsZXRlVGltZSA9IGVudHJ5LmRlbGV0ZVRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIG9sZGVzdERlbGV0ZVRpbWUgfTtcbiAgICB9XG5cbiAgICAvKiogUGh5c2ljYWxseSByZW1vdmVzIGEgbWFya2VkIGZpbGUncyBieXRlcyBmcm9tIG91ciBkaXNrIGFuZCBkcm9wcyBpdHMga2VwdCB2YWx1ZSwgbGVhdmluZyBhIHBsYWluIHRvbWJzdG9uZSB0aGF0IGFnZXMgb3V0IG5vcm1hbGx5IC0gcmV0ZW50aW9uIGNhbGxpbmcgdGltZSBvbiB0aGUgb2xkZXN0IGhpc3RvcnkuICovXG4gICAgcHVibGljIGFzeW5jIGRyb3BNYXJrZWRIaXN0b3J5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub3duRGlzay5kZWwoa2V5KTtcbiAgICAgICAgdGhpcy5pbmRleC5kcm9wVmFsdWUoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogU2VlIFNldENvbmZpZy51bmRlbGV0ZTogZmxpcHMgYSBtYXJrZWQgZGVsZXRpb24gYmFjayB0byBsaXZlIChmcmVzaCB3cml0ZSB0aW1lLCBzbyB0aGUgcmVzdG9yZSBvdXRyYW5rcyB0aGUgZGVsZXRpb24gZXZlcnl3aGVyZSBpdCBwcm9wYWdhdGVkKSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrLCBzbyByZWFkcyBqdXN0IHdvcmsgYWdhaW4uIEludGVybmFsIHJlc3RvcmVzIGFyZSBhIHBlZXIncyBwcm9wYWdhdGlvbiBhbmQgdG9sZXJhdGUgaGF2aW5nIG5vdGhpbmcgdG8gcmVzdG9yZSAodGhpcyBub2RlIG1heSBuZXZlciBoYXZlIGhlbGQgdGhlIGZpbGUpOyBhIGNhbGxlcidzIHJlc3RvcmUgdGhyb3dzIGluc3RlYWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyB1bmRlbGV0ZUtleShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIGludGVybmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBtYXJrZWQgPSB0aGlzLmdldE1hcmtlZEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC51bm1hcmsoa2V5LCB3cml0ZVRpbWUpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxpdmU6IHVuZGVsZXRlIGlzIGlkZW1wb3RlbnQgKHJldHJpZXMgYW5kIHBlZXIgcHJvcGFnYXRpb24gYm90aCByZS1zZW5kIGl0KVxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGhhcyBub3RoaW5nIHRvIHJlc3RvcmUgaGVyZSAtIHRoaXMgbm9kZSBtYXkgbmV2ZXIgaGF2ZSBoZWxkIHRoZSBmaWxlYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlbGV0ZSBmYWlsZWQgLSBub3RoaW5nIHRvIHJlc3RvcmUuIENhbm5vdCB1bmRlbGV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGl0IGhhcyBubyBtYXJrZWQgZGVsZXRpb24gdG8gcmVzdG9yZSAtIGl0IHdhcyBuZXZlciBkZWxldGVkIGhlcmUke3RoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSkgJiYgXCIsIG9yIGl0cyBkZWxldGlvbiBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQgKGEgcGxhaW4gdG9tYnN0b25lIHJlbWFpbnMsIGJ1dCB0aGUgYnl0ZXMgYXJlIGdvbmUpXCIgfHwgXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGVkICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogdGhlIGluZGV4IGVudHJ5ICgke21hcmtlZD8uc2l6ZX0gYnl0ZXMsIGRlbGV0ZWQgJHttYXJrZWQgJiYgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChtYXJrZWQuZGVsZXRlVGltZSl9KSBpcyBsaXZlIGFnYWluIGFzIG9mICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrYCk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwidW5kZWxldGVcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHNpemU6IG1hcmtlZD8uc2l6ZSwgd3JpdGVUaW1lLCBpbnRlcm5hbCB9KTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgaWYgKGludGVybmFsKSByZXR1cm47XG4gICAgICAgIC8vIFBlZXJzIG1hcmtlZCB0aGVpciBvd24gY29waWVzIHdoZW4gdGhlIGRlbGV0aW9uIHByb3BhZ2F0ZWQsIHNvIHRoZSByZXN0b3JlIHByb3BhZ2F0ZXMgdGhlIHNhbWUgd2F5LiBTdHJhaWdodCBwYXN0IGFueSB3cml0ZSBkZWxheSAtIGEgYnVmZmVyZWQgdW5kZWxldGUgY291bGQgYmUgcmVhZCBiYWNrIGFzIGl0cyBwbGFjZWhvbGRlciBieXRlLlxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICBmb3IgKGxldCBpIG9mIHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKCkpIHtcbiAgICAgICAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyh0aGlzLnNvdXJjZXNbaV0ucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBPbmx5IG91ciBvd24gc2VydmVycyB1bmRlcnN0YW5kIHRoZSBmbGFnIC0gYSByYXcgc291cmNlIChiYWNrYmxhemUpIHdvdWxkIHN0b3JlIHRoZSBwbGFjZWhvbGRlciBieXRlIGFzIHRoZSBmaWxlLiBUaGVpciBvbGRlciBjb3B5IGlzIHJlLXB1c2hlZCBieSByZWNvbmNpbGlhdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tpXS5zb3VyY2VDb25maWc/LnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHB1c2ggPSB1bndyYXBEZWxheWVkKHRoaXMuc291cmNlc1tpXS5zb3VyY2UpLnNldChrZXksIFVOREVMRVRFX1BMQUNFSE9MREVSLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCB1bmRlbGV0ZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQmFja2dyb3VuZCB1bmRlbGV0ZSBvZiAke2tleX0gb24gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZCAoaXRzIHNjYW4gb2YgdXMgcmUtZmluZHMgdGhlIGZpbGUgYW55d2F5KTogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmaWxlcyB3ZSBob2xkLCBkZWxldGlvbnMgZXhjbHVkZWQuICovXG4gICAgcHVibGljIGluZGV4U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5zaXplO1xuICAgIH1cblxuICAgIC8qKiBUb3RhbHMgb3ZlciB0aGUgZmlsZXMgd2UgaG9sZCwgYnJva2VuIGRvd24gYnkgdGhlIHNsb3QgaG9sZGluZyBlYWNoIChlbnRyaWVzIGNhbiBuYW1lIGEgc291cmNlIHRoYXQgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQsIHdoaWNoIGNvdW50cyB0b3dhcmRzIHRoZSB0b3RhbCBidXQgbm8gc2xvdCkuICovXG4gICAgcHVibGljIGluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzbG90czogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzbG90cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gKHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfSkpO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc2xvdHMgfTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIGZpbGUsIGFzIG9mIGl0cyB3cml0ZSB0aW1lLiBSZXR1cm5zIGZhbHNlLCBoYXZpbmcgY2hhbmdlZCBub3RoaW5nLCB3aGVuIHdlIGFscmVhZHkga25vdyBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IC0gdGhlIGluZGV4IGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcywgd2hpY2hldmVyIHBhdGggdGhlIHdyaXRlIGNhbWUgaW4gYnkuICovXG4gICAgcHVibGljIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5zZXQoa2V5LCB7IHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSwgZW50cnkud3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgbGFuZGluZyBoZXJlIC0gd3JpdHRlbiBieSBhbiBvcGVyYXRvciwgb3IgcHVsbGVkIG9mZiBhIHBlZXIgYnkgc3luY2hyb25pemF0aW9uIC0gaXMgaG93IHRoaXMgc3RvcmUgbGVhcm5zIHdoYXQgaXQgaXMgbWVhbnQgdG8gYmVcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIERFTEVUSU9OLCBhcyBvZiBpdHMgdGltZTogdGhlIGtleSBzdG9wcyBleGlzdGluZyBoZXJlLCBhbmQgdGhlIHRvbWJzdG9uZSBpcyB3aGF0IG1ha2VzIHRoYXQgZmFjdCBwcm9wYWdhdGUgYW5kIHJlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZS4gU2FtZSBvcmRlcmluZyBydWxlIGFzIHNldEluZGV4RW50cnkuICovXG4gICAgcHVibGljIHNldEluZGV4RGVsZXRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LmRlbGV0ZShrZXksIHdyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgYSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZC4gTk9UIGEgZGVsZXRpb246IGl0IHNheXMgbm90aGluZyBoYXBwZW5lZCB0byB0aGUgZmlsZSwgb25seSB0aGF0IHdlIG5vIGxvbmdlciBrbm93IGFueXRoaW5nIGFib3V0IGl0IC0gZm9yIGFuIGVudHJ5IHdob3NlIGhvbGRlciB0dXJuZWQgb3V0IG5vdCB0byBoYXZlIGl0LCBhbmQgZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBldmVyeW9uZSBoYXMgaGVhcmQuICovXG4gICAgcHVibGljIHB1cmdlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4LnB1cmdlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqIENvdW50cyBhIHN5bmNocm9uaXphdGlvbiB0cmFuc2ZlciBpbiB0aGUgc2VydmVyJ3MgYWNjZXNzIHN0YXRpc3RpY3MgKHNlZSBnZXRTdG9yZSdzIHdpcmluZyk6IFwic3luYyBnZXRcIiBmb3IgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSwgXCJzeW5jIHNldFwiIGZvciBieXRlcyBwdXNoZWQgdG8gb25lLiAqL1xuICAgIHB1YmxpYyBub3RlU3luY1RyYW5zZmVyKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogb3BlcmF0aW9uLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGgsIHNpemU6IGJ5dGVzIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25TeW5jVHJhbnNmZXI/LihvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IFdyaXRlIHJlamVjdGVkOiB0aGlzIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9IERhdGEgd3JpdHRlbiB0byBhIHN0b3JlIHdpdGggbm8gY29uZmlndXJhdGlvbiBlbnRyeSB3b3VsZCBuZXZlciBiZSBzY2FubmVkIG9yIHJlY29uY2lsZWQsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBzaWxlbnRseSBsb3NlIGl0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeSAtIG9yLCBpZiB0aGlzIHN0b3JlIGlzIGdlbnVpbmVseSBtZWFudCB0byB0YWtlIHRoaXMgd3JpdGUsIHdyaXRlIHRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZyB3aXRoIGFuIGVudHJ5IG5hbWluZyBpdCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleSwgRGF0ZS5ub3coKSwgcm91dGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RhbXBlZCB3cml0ZSBwaWNrZWQgaXRzIG93biB0aW1lLCBzbyBubyB3aW5kb3cgY2FuIGp1ZGdlIGl0ICh0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN5bmNocm9uaXplZCB3cml0ZSkgLSBidXQgdGhlIFJPVVRFIGlzIG5vdCBhIG1hdHRlciBvZiB0aW1pbmcsIGFuZCBhIHN0YW1wZWQgd3JpdGUgdG8gdGhlIHdyb25nIHNoYXJkIGlzIGV4YWN0bHkgYXMgaW52aXNpYmxlIGFzIGEgZnJlc2ggb25lXG4gICAgICAgIGlmICh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHJldHVybjtcbiAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBzdGFtcGVkIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSByb3V0ZSB3ZSBzZXJ2ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSByZWplY3RlZCAtIG5vdCBhIHBhcnNlYWJsZSBjb25maWcuIFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogdGhlIGRhdGEgaXMgbm90IGEgdmFsaWQgeyB2ZXJzaW9uPywgc291cmNlczogWy4uLl0gfSBKU09OIGNvbmZpZyAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocm91dGluZyk7XG4gICAgICAgIGxldCBpbmNvbWluZyA9IGdldENvbmZpZ1ZlcnNpb24ocm91dGluZyk7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5yb3V0aW5nVmVyc2lvbigpO1xuICAgICAgICBpZiAoaW5jb21pbmcgPj0gY3VycmVudCkgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIHdyaXRlIHJlZnVzZWQgLSB0aGUgdmVyc2lvbiBpcyBub3QgbmV3ZXIuIFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogaXRzIHZlcnNpb24gKCR7aW5jb21pbmd9KSBpcyBvbGRlciB0aGFuIHRoZSBvbmUgdGhpcyBzdG9yZSBpcyBydW5uaW5nICgke2N1cnJlbnR9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoICh1bnN0YW1wZWQpIHdyaXRlIG11c3QgbGFuZCBvbiB0aGUgbm9kZSB0aGUgY29uZmlnIGN1cnJlbnRseSBwb2ludHMgYXQ6IHRoZSBtYXJrZXJzIHRlbGwgdGhlIGNsaWVudCBpdHMgY29uZmlnIGlzIHN0YWxlLCBzbyBpdCByZS1yZXNvbHZlcyBhbmQgcmV0cmllcyBhZ2FpbnN0IHRoZSByaWdodCBub2RlIGluc3RlYWQgb2YgdXMgc2lsZW50bHkgYWNjZXB0aW5nIGRhdGEgd2Ugd2VyZSBuZXZlciBtZWFudCB0byBob2xkLlxuICAgIHByaXZhdGUgYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBXcml0ZSByZWplY3RlZDogd3JpdGUgdGltZSBpcyBvdXRzaWRlIG91ciB2YWxpZCB3aW5kb3dzLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogaXRzIHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9ICgke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0pIGlzIG91dHNpZGUgZXZlcnkgdmFsaWQgd2luZG93IG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAod2luZG93czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0sIGZvbGRlciAke3RoaXMuZm9sZGVyfSkgLSBhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXNzZXJ0TXV0YWJsZShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXcml0ZSByZWplY3RlZCAtIGltbXV0YWJsZSBzdG9yZSBhbmQgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuIEF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9LCAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFscmVhZHkgZXhpc3RzIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSByZWplY3RlZCAtIG91dHNpZGUgZXZlcnkgY29uZmlndXJlZCB3aW5kb3cvcm91dGUuIFdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZDogbmV2ZXIgZ29lcyB0byBPVEhFUiBzb3VyY2VzIC0gdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlLCBhbmQgY2hhc2luZyBPVVIgcmVtb3RlIGhvbGRlcnMgd2hpbGUgYW5zd2VyaW5nIGl0IGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSAtIGJ1dCB0aGUgSU5ERVggc3RpbGwgZ2F0ZXMsIGJlY2F1c2UgaXQgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aDogYSBtYXJrZWQgZGVsZXRpb24ga2VlcHMgaXRzIGJ5dGVzIG9uIGRpc2sgYXMgaGlzdG9yeSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSwgc28gdGhlIGRpc2sgYWxvbmUgd291bGQgaGFwcGlseSBzZXJ2ZSBhIERFTEVURUQgZmlsZSBhcyBsaXZlLiBJbmRleCBzYXlzIGxpdmUgLT4gdGhlIGRpc2sgcHJvdmlkZXMgdGhlIGJ5dGVzIChwYXN0IGFueSB3cml0ZSBkZWxheSwgc28gYSBmYXN0IHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIG1lbW9yeSBpcyBpbnZpc2libGUgaGVyZTsgdGhlIGNhbGxlciByZS1maW5kcyBpdCBvbmNlIGl0IGZsdXNoZXMpLiBJbmRleCBzYXlzIGRlbGV0ZWQgLT4gdGhlIHRvbWJzdG9uZSBpcyB0aGUgYW5zd2VyLCBuZXZlciB0aGUgZGlzay4gTm8gd2luZG93IG9yIHJvdXRlIGNoZWNrcy4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEludGVybmFsMihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgaWYgKCF0aGlzLmdldEluZGV4RW50cnkoa2V5KSkge1xuICAgICAgICAgICAgLy8gRGVsZXRlZCwgb3IgbmV2ZXIgaGVyZTogYSBmbGFnLWNhbGxlciAoYSBwZWVyIHN0b3JlJ3Mgc3luY2hyb25pemF0aW9uKSBuZWVkcyB0byBzZWUgb3VyIGRlbGV0aW9ucywgbm90IGp1c3Qgb3VyIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5nZXQyKGtleSwgeyByYW5nZTogY29uZmlnLnJhbmdlIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH07XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgd3JpdGU6IHRoZSBsb2NhbCBkaXNrIHBsdXMgb3VyIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAtIHRoZSBwdXNoaW5nIHN0b3JlIG93bnMgcHJvcGFnYXRpb24sIGFuZCBmYW5uaW5nIGl0cyBwdXNoZXMgYmFjayBvdXQgaXMgaG93IHdyaXRlIGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE9ubHktdGFrZS1sYXRlc3Qgc3RpbGwgYXBwbGllcyBoZXJlLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgc2V0SW50ZXJuYWwoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIGJ5dGVzIHN0YXkgb24gb3VyIGRpc2sgYXMgZGVsZXRpb24gaGlzdG9yeSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSAtIHRoZSBtYXJrZWQgaW5kZXggZW50cnkgaXMgdGhlIHdob2xlIG9mIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwiZGVsXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0XCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBkYXRhLmxlbmd0aCwgd3JpdGVUaW1lOiBjb25maWcubGFzdE1vZGlmaWVkLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgLy8gQSBkb3duLWNhY2hlIHB1bGxzIHRoZSBieXRlcyBvZmYgYSBzb3VyY2UgZXhhY3RseSBsaWtlIHN5bmNocm9uaXphdGlvbiBkb2VzLCBzbyBpdCBjb3VudHMgKGFuZCBsb2dzKSB0aGUgc2FtZSB3YXlcbiAgICAgICAgdGhpcy5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCByZXN1bHQuZGF0YS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaGFyZWQgZW5naW5lIG9mIHNldCBhbmQgZGVsOiBhbiBlbXB0eSBidWZmZXIgaXMgZXhhY3RseSBhIGRlbGV0aW9uIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGUgZW1wdHktYnVmZmVyIHJlamVjdGlvbiBsaXZlcyBpbiBzZXQgKHRoZSBwdWJsaWMgQVBJKSwgbm90IGluIHRoaXMgbWFjaGluZXJ5XG4gICAgcHJpdmF0ZSBhc3luYyBzZXRPckRlbGV0ZShrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJvcmlnaW5hbFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWcubGFzdE1vZGlmaWVkO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYXN0IHdyaXRlcyBhcmUgbm90IGhhbmRsZWQgaGVyZTogYSBzb3VyY2UgdGhhdCB3YXMgY29uZmlndXJlZCB3aXRoIGEgd3JpdGUgZGVsYXkgYnVmZmVycyB0aGVtIGl0c2VsZiAoc2VlIEFyY2hpdmVzRGVsYXllZCksIHNvIHRoaXMgd3JpdGUgbGFuZHMgaW4gbWVtb3J5IGFuZCByZXR1cm5zLCBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUuIFRoZSBpbmRleCBpcyB1cGRhdGVkIGVpdGhlciB3YXksIHNvIHRoZSB3cml0ZSBpcyBpbW1lZGlhdGVseSB2aXNpYmxlIHRvIHJlYWRlcnMgb2YgdGhpcyBzdG9yZS5cbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIE1hdGgucm91bmQobGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluc3RhbnQgZXZlcnkgZGVsYXllZCB3cml0ZSBtdXN0IGJlIG9uIGl0cyBzb3VyY2U6IHRoZSBlbmQgb2Ygb3VyIG93biB3cml0ZSB3aW5kb3cgdGhhdCBjb250YWlucyBub3csIG1pbnVzIHRoZSBmbHVzaCBtYXJnaW4gKHNvIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSBmaW5kcyB0aGUgZGF0YSBvbiBoYW5kb2ZmKS4gVGhlIExBVEVTVCBlbmQgYW1vbmcgY292ZXJpbmcgd2luZG93cyAtIG92ZXJsYXBwaW5nIHdpbmRvd3MgaGFuZCBvZmYgYXQgdGhlIGxhc3Qgb25lLiBObyB3aW5kb3cgY29udGFpbnMgbm93IChhbiBpbmVydCBzdG9yZSwgb3IgYSBtb21lbnQgYmV0d2VlbiBvdXIgd2luZG93cykgLT4gMCwgaS5lLiBub3RoaW5nIG1heSBiZSBkZWxheWVkIGF0IGFsbC4gKi9cbiAgICBwdWJsaWMgd3JpdGVGbHVzaERlYWRsaW5lKCk6IG51bWJlciB7XG4gICAgICAgIC8vIEJlZm9yZSB1cGRhdGVTb3VyY2VzIGhhcyBydW4gdGhlcmUgaXMgbm90aGluZyB0byBob2xkIGEgd3JpdGUgYW55d2F5LCBhbmQgbm90aGluZyBtYXkgYmUgZGVsYXllZFxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5zb3VyY2VzWzBdLnZhbGlkV2luZG93cykge1xuICAgICAgICAgICAgaWYgKHdbMF0gPD0gbm93ICYmIG5vdyA8IHdbMV0pIGVuZCA9IE1hdGgubWF4KGVuZCwgd1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmQpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gZW5kIC0gV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb25maWc/Lmlnbm9yZVdpbmRvdyAmJiAhd2luZG93c0FjY2VwdFdyaXRlcyh0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIHNvdXJjZSAodGhlIGZpcnN0IHdyaXRhYmxlIG9uZSkgcGx1cyBldmVyeSByb3V0ZS1tYXRjaGluZyBwZWVyLiBFYWNoIHNvdXJjZSBkZWNpZGVzIGZvciBpdHNlbGYgaG93IGxvbmcgaXQgaG9sZHMgdGhlIHdyaXRlIGJlZm9yZSBpdCBoaXRzIHN0b3JhZ2UgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpIC0gaGVyZSB0aGV5IGFsbCBqdXN0IGdldCB3cml0dGVuLlxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVUb1NvdXJjZXMoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBORVZFUiBzeW5jaHJvbml6ZWQgYmV0d2VlbiBzdG9yYWdlIG5vZGVzOiB0aGUgd3JpdGVyIHdyaXRlcyBpdCBkaXJlY3RseSB0byBlYWNoIG5vZGUsIHNvIHdlIHN0b3JlIGl0IG9uIG91ciBvd24gZGlzayBvbmx5IChubyB2YWxpZC13aW5kb3cgZmlsdGVyIC0gcm91dGluZy92YWxpZCB3aW5kb3dzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIHRoZSBmaWxlIGRlZmluaW5nIHRoZW0pIGFuZCBuZXZlciBmb3J3YXJkIGl0IHRvIG90aGVyIHNvdXJjZXMuXG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwiZmx1c2hlZFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBpc1JvdXRpbmcgPSBrZXkgPT09IFJPVVRJTkdfRklMRTtcbiAgICAgICAgbGV0IHdyaXRhYmxlID0gdGhpcy5nZXRXcml0YWJsZVNvdXJjZXMoeyBpZ25vcmVXaW5kb3c6IGlzUm91dGluZyB9KTtcbiAgICAgICAgbGV0IGZpcnN0ID0gd3JpdGFibGUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIChldmVyeSBzb3VyY2UncyB2YWxpZCB3aW5kb3cgaXMgaW4gdGhlIHBhc3QpLCBzbyB3cml0ZXMgY2Fubm90IGJlIHN0b3JlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdXIgb3duIChmaXJzdCkgc291cmNlIGJsb2NrcyB0aGUgd3JpdGUuIERvd25zdHJlYW0gc291cmNlcyBhcmUgd3JpdHRlbiBpbiB0aGUgYmFja2dyb3VuZDogYSBkb3duIGRvd25zdHJlYW0gc291cmNlIG11c3Qgbm90IGZhaWwgb3Igc3RhbGwgd3JpdGVzLCBhbmQgcmVjb25jaWxpYXRpb24gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgU1RBWSBvbiBvdXIgZGlzaywgYXMgZGVsZXRpb24gaGlzdG9yeTogdGhlIGluZGV4IG1hcmtzIHRoZSBrZXkgZGVsZXRlZCAoa2VlcGluZyBpdHMgdmFsdWUgLSBzZWUgVHJhbnNhY3Rpb25GaWxlLmRlbGV0ZSksIHJlYWRzIHN0b3AgZmluZGluZyBpdCwgYW5kIHRoZSByZXRlbnRpb24gcGFzcyBwaHlzaWNhbGx5IHJlbW92ZXMgdGhlIG9sZGVzdCBoaXN0b3J5IG9uY2UgaXQgb3V0Z3Jvd3MgaXRzIGJ1ZGdldCAoc2VlIFN0b3JlU3luYy5lbmZvcmNlSGlzdG9yeUxpbWl0KS4gVGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGxvY2FsIGRlbGV0aW9uLlxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZSwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChmaXJzdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogZGF0YS5sZW5ndGggPT09IDAgJiYgXCJkZWxcIiB8fCBcInNldFwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGtleSwgc2l6ZTogZGF0YS5sZW5ndGgsIHdyaXRlVGltZSB9KTtcbiAgICAgICAgaWYgKGlzUm91dGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBEZWxldGlvbnMgZGlkIG5vdCBjb25zdW1lIHRoZSBmaXJzdCBzbG90IChub3RoaW5nIGlzIHdyaXR0ZW4gYW55d2hlcmUgbG9jYWxseSksIHNvIGl0IHJlY2VpdmVzIHRoZSBwcm9wYWdhdGVkIGRlbGV0aW9uIGxpa2UgdGhlIHJlc3QgLSBleGNlcHQgc2xvdCAwLCBvdXIgb3duIGRpc2ssIHdob3NlIGJ5dGVzIEFSRSB0aGUgaGlzdG9yeSBiZWluZyBrZXB0XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCAmJiBmaXJzdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGFibGUudW5zaGlmdChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYEJhY2tncm91bmQgd3JpdGUgb2YgJHtrZXl9IHRvIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTbG90IDAgaXMgYWx3YXlzIHRoaXMgc3RvcmUncyBvd24gZm9sZGVyIChzZWUgcGxhblNvdXJjZXMpLCBzbyB0aGUgZGlzayBpcyBrbm93biB3aXRob3V0IHNlYXJjaGluZyBmb3IgaXQgLSBhbmQgaXQgaXMgdGhlIHVud3JhcHBlZCBvbmUsIHBhc3QgYW55IHdyaXRlIGRlbGF5XG4gICAgcHJpdmF0ZSBnZXREaXNrU291cmNlKCk6IHsgZGlzazogQXJjaGl2ZXNEaXNrOyBzb3VyY2VJbmRleDogbnVtYmVyIH0ge1xuICAgICAgICByZXR1cm4geyBkaXNrOiB0aGlzLm93bkRpc2ssIHNvdXJjZUluZGV4OiAwIH07XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBldmVyeXRoaW5nIHN0aWxsIGhlbGQgYnkgYSBkZWxheWVkIHNvdXJjZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkuIGZvcmNlIGFsc28gd3JpdGVzIHdoYXQgaXNuJ3QgZHVlIHlldCAtIHNodXRkb3duIGNhbm5vdCBsZWF2ZSB3cml0ZXMgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hEZWxheWVkV3JpdGVzKGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCB7IHNvdXJjZSB9IG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGRlbGF5ZWQgPSBhc0RlbGF5ZWQoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghZGVsYXllZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBkZWxheWVkLmZsdXNoKGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
|
|
1091
|
-
/* _JS_SOURCE_HASH = "
|
|
1091
|
+
/* _JS_SOURCE_HASH = "3b5a24f7b8fec94c5ea3e0acfd4bfaf35a3b67e053b2a8cee7abe47993d4b8e2"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -101,4 +101,4 @@ async function getDiskInfo(folder) {
|
|
|
101
101
|
}
|
|
102
102
|
exports.getDiskInfo = getDiskInfo;
|
|
103
103
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0RGlzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1Y2tldERpc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQUVwQixpREFBZ0U7QUFDaEUsaURBQXdEO0FBRXhELHFRQUFxUTtBQUVyUSx3TUFBd007QUFDeE0sTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDO0FBRWxDLHVUQUF1VDtBQUN2VCxTQUFnQixlQUFlLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxVQUFrQjtJQUM3RSxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxxQ0FBc0IsR0FBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRkQsMENBRUM7QUFFRCxLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQWM7SUFDdkMsSUFBSSxDQUFDO1FBQ0QsT0FBTyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsSUFBSyxDQUF1QixDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUQsTUFBTSxDQUFDLENBQUM7SUFDWixDQUFDO0FBQ0wsQ0FBQztBQUlELCtFQUErRTtBQUN4RSxLQUFLLFVBQVUsdUJBQXVCLENBQUMsT0FBZTtJQUN6RCxJQUFJLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLElBQUEscUNBQXNCLEdBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hGLElBQUksS0FBSyxHQUFrQixFQUFFLENBQUM7SUFDOUIsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELEtBQUssSUFBSSxV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QUFFRCxpRkFBaUY7QUFDMUUsS0FBSyxVQUFVLG9CQUFvQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUMxRSxPQUFPLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFGRCxvREFFQztBQVFNLEtBQUssVUFBVSxXQUFXLENBQUMsTUFBYztJQUM1QyxJQUFJLEtBQUssR0FBRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDbEQsT0FBTztRQUNILFVBQVU7UUFDViwwRkFBMEY7UUFDMUYsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUztRQUMzQyxTQUFTLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUztLQUMxRCxDQUFDO0FBQ04sQ0FBQztBQVZELGtDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgcGFyc2VSb3V0aW5nRGF0YSB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZyB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuXG4vLyBUaGUgb24tZGlzayBsYXlvdXQsIGFuZCB3aGF0IGNhbiBiZSBsZWFybmVkIGZyb20gaXQgd2l0aG91dCBvcGVuaW5nIGEgc3RvcmUuIFRoZSBsYXlvdXQgSVMgdGhlIHN0YXRlOiA8YWNjb3VudD4vPG5hbWU+LzxidWNrZXQ+IGlzIGEgc3RvcmUsIGFuZCB0aGUgc2V0IG9mIGZvbGRlcnMgaXMgdGhlIHNldCBvZiBzdG9yZXMgdGhpcyBzZXJ2ZXIgaGFzIC0gdGhlcmUgaXMgbm8gc2VwYXJhdGUgcmVjb3JkIG9mIHRoZW0gdG8gZmFsbCBvdXQgb2Ygc3RlcC5cblxuLy8gRXZlcnl0aGluZyB0aGlzIHNlcnZlciBzdG9yZXMgZm9yIGJ1Y2tldHMuIFwiYnVja2V0czNcIiBiZWNhdXNlIHRoZSBsYXlvdXQgdW5kZXIgaXQgY2hhbmdlZCBzaGFwZSAtIHRoZSBwcmV2aW91cyBnZW5lcmF0aW9ucyBuYW1lZCBmb2xkZXJzIGFmdGVyIHRoZSByb3V0ZSwgd2hpY2ggbWVhbnQgcmUtcm91dGluZyByZW5hbWVkIHRoZSBzdG9yYWdlLlxuY29uc3QgQlVDS0VUU19GT0xERVIgPSBcImJ1Y2tldHM0XCI7XG5cbi8qKiBBIHN0b3JlJ3MgZm9sZGVyLCBmcm9tIHRoZSBvbmx5IHRocmVlIHRoaW5ncyB0aGF0IGlkZW50aWZ5IGl0LiBUaGUgbmFtZSBpcyB0aGUgY29uZmlnIGVudHJ5J3MgbmFtZSBhbmQgbm90aGluZyBlbHNlOiB0aGUgc2FtZSBuYW1lIGlzIHRoZSBzYW1lIHN0b3JhZ2UsIHdoYXRldmVyIGl0cyB3aW5kb3cgb3Igcm91dGUgc2F5LCBhbmQgYSBkaWZmZXJlbnQgbmFtZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSBldmVuIGZvciB0aGUgc2FtZSBVUkwuIE5vdGhpbmcgYWJvdXQgYSBmb2xkZXIgY2hhbmdlcyB3aGVuIHRoZSByb3V0aW5nIGRvZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKG5hbWU6IHN0cmluZywgYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgQlVDS0VUU19GT0xERVIsIGFjY291bnQsIG5hbWUsIGJ1Y2tldE5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkRGlyZWN0b3J5KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiBbXTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JlRm9sZGVyID0geyBhY2NvdW50OiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBmb2xkZXI6IHN0cmluZyB9O1xuXG4vKiogRXZlcnkgc3RvcmUgdGhpcyBzZXJ2ZXIgaG9sZHMgZm9yIGFuIGFjY291bnQsIGZvdW5kIGJ5IHdhbGtpbmcgdGhlIGRpc2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEFjY291bnRTdG9yZUZvbGRlcnMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTdG9yZUZvbGRlcltdPiB7XG4gICAgbGV0IGFjY291bnRGb2xkZXIgPSBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgQlVDS0VUU19GT0xERVIsIGFjY291bnQpO1xuICAgIGxldCBmb3VuZDogU3RvcmVGb2xkZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IG5hbWUgb2YgYXdhaXQgcmVhZERpcmVjdG9yeShhY2NvdW50Rm9sZGVyKSkge1xuICAgICAgICBmb3IgKGxldCBidWNrZXROYW1lIG9mIGF3YWl0IHJlYWREaXJlY3RvcnkocGF0aC5qb2luKGFjY291bnRGb2xkZXIsIG5hbWUpKSkge1xuICAgICAgICAgICAgZm91bmQucHVzaCh7IGFjY291bnQsIG5hbWUsIGJ1Y2tldE5hbWUsIGZvbGRlcjogZ2V0QnVja2V0Rm9sZGVyKG5hbWUsIGFjY291bnQsIGJ1Y2tldE5hbWUpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuLyoqIEV2ZXJ5IHN0b3JlIHRoaXMgc2VydmVyIGhvbGRzIGZvciBPTkUgYnVja2V0IC0gb25lIHBlciBuYW1lIGl0IGhhcyBldmVyIGJlZW4gZ2l2ZW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEJ1Y2tldFN0b3JlRm9sZGVycyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RvcmVGb2xkZXJbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgbGlzdEFjY291bnRTdG9yZUZvbGRlcnMoYWNjb3VudCkpLmZpbHRlcih4ID0+IHguYnVja2V0TmFtZSA9PT0gYnVja2V0TmFtZSk7XG59XG5cbi8qKiBUaGUgcm91dGluZyBmaWxlIGlzIG91cnMsIG9uIG91ciBvd24gZGlzaywgYXQgYSBwYXRoIHdlIGtub3cgLSBzbyBpdCBpcyByZWFkIGRpcmVjdGx5LiBHb2luZyB0aHJvdWdoIGFuIEFyY2hpdmVzRGlzayB3b3VsZCBjb25zdHJ1Y3QgYSB3aG9sZSBzdG9yZSAoaGFuZGxlIGNhY2hlIHN3ZWVwIGxvb3AsIHVwbG9hZHMtZm9sZGVyIGNsZWFudXApIGp1c3QgdG8gcmVhZCBvbmUgZmlsZS4gKi9cbmZ1bmN0aW9uIGdldFJvdXRpbmdGaWxlUGF0aChmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmb2xkZXIsIFwiZmlsZXNcIiwgUk9VVElOR19GSUxFKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGZpbGVQYXRoID0gZ2V0Um91dGluZ0ZpbGVQYXRoKGZvbGRlcik7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgICAvLyBSb3VuZGVkIGxpa2UgZXZlcnkgdGltZSBBcmNoaXZlc0Rpc2sgcmVwb3J0cyAoc2VlIGl0cyBnZXQyKSAtIHN1Yi1taWxsaXNlY29uZCBtdGltZSBkaWdpdHMgY2FuJ3Qgcm91bmQtdHJpcCB0aHJvdWdoIHV0aW1lcywgc28gdGhleSBhcmUgbm9pc2UsIG5vdCBvcmRlcmluZ1xuICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IE1hdGgucm91bmQoc3RhdHMubXRpbWVNcykgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbi8qKiBUaGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcgYXMgdGhpcyBzZXJ2ZXIgaG9sZHMgaXQ6IHRoZSBuZXdlc3QgY29weSBhbW9uZyBpdHMgc3RvcmVzLiBFYWNoIHN0b3JlIGtlZXBzIGl0cyBvd24sIGFuZCB0aGV5IGNvbnZlcmdlIC0gc28gd2hlbiB0aGV5IGRpc2FncmVlLCB0aGUgb25lIHdyaXR0ZW4gbW9zdCByZWNlbnRseSBpcyB0aGUgb25lIHRoYXQgaGFzIGhlYXJkIHRoZSBtb3N0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWROZXdlc3RSb3V0aW5nRmlsZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IG5ld2VzdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHN0b3JlIG9mIGF3YWl0IGxpc3RCdWNrZXRTdG9yZUZvbGRlcnMoYWNjb3VudCwgYnVja2V0TmFtZSkpIHtcbiAgICAgICAgbGV0IGZpbGUgPSBhd2FpdCByZWFkUm91dGluZ0ZpbGUoc3RvcmUuZm9sZGVyKTtcbiAgICAgICAgaWYgKCFmaWxlKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5ld2VzdCAmJiBmaWxlLndyaXRlVGltZSA8PSBuZXdlc3Qud3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgbmV3ZXN0ID0geyBkYXRhOiBmaWxlLmRhdGEsIHdyaXRlVGltZTogZmlsZS53cml0ZVRpbWUsIHNpemU6IGZpbGUuZGF0YS5sZW5ndGgsIG5hbWU6IHN0b3JlLm5hbWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld2VzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBuZXdlc3QgPSBhd2FpdCByZWFkTmV3ZXN0Um91dGluZ0ZpbGUoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFuZXdlc3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnNlUm91dGluZ0RhdGEobmV3ZXN0LmRhdGEpO1xufVxuXG4vKiogV2hhdCBhbiBhbm9ueW1vdXMgVVJMIHJlYWQgb2YgdGhlIHJvdXRpbmcgZmlsZSBnZXRzOiB0aGUgc2FtZSBuZXdlc3QgY29weS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0aW5nRmlsZVJlc3VsdChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCByZWFkTmV3ZXN0Um91dGluZ0ZpbGUoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldERpc2tJbmZvID0ge1xuICAgIHRvdGFsQnl0ZXM6IG51bWJlcjtcbiAgICBmcmVlQnl0ZXM6IG51bWJlcjtcbiAgICB1c2VkQnl0ZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREaXNrSW5mbyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8QnVja2V0RGlza0luZm8+IHtcbiAgICBsZXQgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0ZnMoZm9sZGVyKTtcbiAgICBsZXQgYmxvY2tTaXplID0gTnVtYmVyKHN0YXRzLmJzaXplKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IE51bWJlcihzdGF0cy5ibG9ja3MpICogYmxvY2tTaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIC8vIE1hdGNoZXMgdGhlIHNlcnZlcidzIG93biBsb3ctc3BhY2UgY2hlY2s6IHdoYXQgYW4gdW5wcml2aWxlZ2VkIHByb2Nlc3MgY2FuIGFjdHVhbGx5IHVzZVxuICAgICAgICBmcmVlQnl0ZXM6IE51bWJlcihzdGF0cy5iYXZhaWwpICogYmxvY2tTaXplLFxuICAgICAgICB1c2VkQnl0ZXM6IHRvdGFsQnl0ZXMgLSBOdW1iZXIoc3RhdHMuYmZyZWUpICogYmxvY2tTaXplLFxuICAgIH07XG59XG4iXX0=
|
|
104
|
-
/* _JS_SOURCE_HASH = "
|
|
104
|
+
/* _JS_SOURCE_HASH = "da0c1e463bc89d5a383b72d34f3448ded776646892b7dbef5788e0db75caa65f"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -52,4 +52,4 @@ function CertTrustModal(props) {
|
|
|
52
52
|
preact_1.default.createElement("button", { onClick: props.onClose }, "Close"))));
|
|
53
53
|
}
|
|
54
54
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFRydXN0TW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZXJ0VHJ1c3RNb2RhbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1EQUFrRDtBQUNsRCw2Q0FBa0M7QUFFbEMsNGFBQTRhO0FBRTVhLG9IQUFvSDtBQUNwSCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBRXpDLFNBQWdCLGtCQUFrQixDQUFDLFNBQWlCO0lBQ2hELElBQUksSUFBQSxhQUFNLEdBQUU7UUFBRSxPQUFPO0lBQ3JCLElBQUksTUFBYyxDQUFDO0lBQ25CLElBQUksQ0FBQztRQUNELE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLE9BQU87SUFDWCxDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU87SUFDdkMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtRQUNiLGdCQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvQixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsK0dBQStHO0lBQ25ILENBQUMsQ0FBQztJQUNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLCtCQUFDLGNBQWMsSUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBbkJELGdEQW1CQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQThDO0lBQ2xFLHVIQUF1SDtJQUN2SCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQztJQUM5QyxPQUFPLHdDQUFLLFNBQVMsRUFBRSxpQkFBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2FBQ2pFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7UUFFekUsd0NBQUssU0FBUyxFQUFFLGlCQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM5RTs7Z0JBQXVDLDZDQUFPLEtBQUssQ0FBQyxNQUFNLENBQVE7b0JBQU87WUFDekUscVFBRU07WUFDTixzQ0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxFQUFDLFlBQVk7O2dCQUFPLEtBQUssQ0FBQyxNQUFNOzZDQUErQjtZQUNyRyx3Q0FBSyxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztnQkFDbEQsMkNBQVEsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLFlBQWdCLENBQzVDLENBQ0osQ0FDSixDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwcmVhY3QgZnJvbSBcInByZWFjdFwiO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5cbi8vIFNob3duIGluIHRoZSBicm93c2VyIHdoZW4gd2UgY2FuJ3QgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBhIHN0b3JhZ2Ugc2VydmVyIC0gbW9zdCBvZnRlbiBiZWNhdXNlIGl0IHNlcnZlcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIChzZWUgLS1zZWxmU2lnbmVkKSB0aGF0IHRoaXMgYnJvd3NlciBoYXMgbm90IGFjY2VwdGVkIHlldC4gR2l2ZXMgdGhlIHVzZXIgYSBsaW5rIHRvIHRoZSBzZXJ2ZXIsIHdoZXJlIHRoZSBicm93c2VyIGxldHMgdGhlbSBhY2NlcHQgdGhlIGNlcnRpZmljYXRlICh0aGUgP3RydXN0Q2VydD0xIHBhZ2UsIHNlZSBhY2Nlc3NQYWdlLnRzeCk7IG9uY2UgYWNjZXB0ZWQsIHRoZSBhcHAncyBvd24gYmFja2dyb3VuZCBjb25uZWN0aW9uIHRvIHRoYXQgc2VydmVyIHN0YXJ0cyB3b3JraW5nLiBBIG5vLW9wIGluIE5vZGUuXG5cbi8vIE9uZSBtb2RhbCBwZXIgc2VydmVyIG9yaWdpbiwgc28gcmVwZWF0ZWQgY29ubmVjdGlvbiBmYWlsdXJlcyAodGhlcmUgYXJlIG1hbnksIG9uIGEgcmV0cnkgbG9vcCkgbmV2ZXIgc3RhY2sgbW9kYWxzXG5jb25zdCBzaG93bkZvck9yaWdpbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0NlcnRUcnVzdE1vZGFsKHNlcnZlclVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzTm9kZSgpKSByZXR1cm47XG4gICAgbGV0IG9yaWdpbjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIG9yaWdpbiA9IG5ldyBVUkwoc2VydmVyVXJsKS5vcmlnaW47XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNob3duRm9yT3JpZ2luLmhhcyhvcmlnaW4pKSByZXR1cm47XG4gICAgc2hvd25Gb3JPcmlnaW4uYWRkKG9yaWdpbik7XG5cbiAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgbGV0IGNsb3NlID0gKCkgPT4ge1xuICAgICAgICBwcmVhY3QucmVuZGVyKG51bGwsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgLy8gTGVhdmUgaXQgaW4gc2hvd25Gb3JPcmlnaW46IHRoZSB1c2VyIGRpc21pc3NlZCBpdCwgc28gZG9uJ3QgcmUtcG9wIGl0IG9uIHRoZSBuZXh0IGZhaWx1cmUgb2YgdGhlIHNhbWUgc2VydmVyXG4gICAgfTtcbiAgICBwcmVhY3QucmVuZGVyKDxDZXJ0VHJ1c3RNb2RhbCBvcmlnaW49e29yaWdpbn0gb25DbG9zZT17Y2xvc2V9IC8+LCBjb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBDZXJ0VHJ1c3RNb2RhbChwcm9wczogeyBvcmlnaW46IHN0cmluZzsgb25DbG9zZTogKCkgPT4gdm9pZCB9KSB7XG4gICAgLy8gTG9hZGluZyB0aGlzIHBhZ2UgYXQgYWxsIG1lYW5zIHRoZSBicm93c2VyIGFjY2VwdGVkIHRoZSBjZXJ0aWZpY2F0ZTsgdGhlIHBhZ2UgdGhlbiB0ZWxscyB0aGUgdXNlciB0aGV5IGNhbiBjb21lIGJhY2tcbiAgICBsZXQgdHJ1c3RVcmwgPSBwcm9wcy5vcmlnaW4gKyBcIi8/dHJ1c3RDZXJ0PTFcIjtcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2Nzcy5maXhlZC5wb3MoMCwgMCkuZmlsbEJvdGguekluZGV4KDIxNDc0ODM2NDcpXG4gICAgICAgIC5oYm94KDApLmp1c3RpZnlDb250ZW50KFwiY2VudGVyXCIpLmFsaWduSXRlbXMoXCJjZW50ZXJcIikuaHNsYSgwLCAwLCAwLCAwLjUpXG4gICAgfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDEyKS5wYWQyKDI0KS5tYXhXaWR0aCg0ODApLmhzbCgwLCAwLCAxMDApLmJvcmRlclJhZGl1cyg4KX0+XG4gICAgICAgICAgICA8ZGl2PkNhbid0IHJlYWNoIHRoZSBzdG9yYWdlIHNlcnZlciBhdCA8Y29kZT57cHJvcHMub3JpZ2lufTwvY29kZT4uPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIElmIHRoaXMgc2VydmVyIHVzZXMgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSwgdGhlIGJyb3dzZXIgYmxvY2tzIHRoZSBjb25uZWN0aW9uIHVudGlsIHlvdSBhY2NlcHQgaXQuIE9wZW4gdGhlIHNlcnZlciBiZWxvdywgYWNjZXB0IHRoZSBjZXJ0aWZpY2F0ZSB3YXJuaW5nLCB0aGVuIHJldHVybiB0byB0aGlzIHBhZ2UgLSBpdCB3aWxsIGNvbm5lY3QgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGEgaHJlZj17dHJ1c3RVcmx9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj5PcGVuIHtwcm9wcy5vcmlnaW59IGFuZCB0cnVzdCBpdHMgY2VydGlmaWNhdGU8L2E+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzLmhib3goOCkuanVzdGlmeUNvbnRlbnQoXCJmbGV4LWVuZFwiKX0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtwcm9wcy5vbkNsb3NlfT5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2Pjtcbn1cbiJdfQ==
|
|
55
|
-
/* _JS_SOURCE_HASH = "
|
|
55
|
+
/* _JS_SOURCE_HASH = "1635b5c83e18a8b25ddaaf59304ef04ce72a3da66ac0ac714090745126d1a7d1"; */
|