sliftutils 1.7.102 → 1.7.104

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.
Files changed (32) hide show
  1. package/index.d.ts +223 -7
  2. package/package.json +2 -2
  3. package/storage/IArchives.d.ts +18 -0
  4. package/storage/IArchives.ts +14 -0
  5. package/storage/StreamingLogs.d.ts +77 -0
  6. package/storage/StreamingLogs.ts +412 -0
  7. package/storage/TransactionFile.d.ts +12 -6
  8. package/storage/TransactionFile.ts +44 -12
  9. package/storage/dist/IArchives.ts.cache +2 -2
  10. package/storage/dist/StreamingLogs.ts.cache +397 -0
  11. package/storage/dist/TransactionFile.ts.cache +41 -9
  12. package/storage/remoteStorage/ArchivesRemote.ts +3 -3
  13. package/storage/remoteStorage/blobStore.d.ts +28 -0
  14. package/storage/remoteStorage/blobStore.ts +117 -11
  15. package/storage/remoteStorage/createArchives.d.ts +40 -1
  16. package/storage/remoteStorage/createArchives.ts +84 -0
  17. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
  18. package/storage/remoteStorage/dist/blobStore.ts.cache +122 -12
  19. package/storage/remoteStorage/dist/createArchives.ts.cache +87 -3
  20. package/storage/remoteStorage/dist/storageController.ts.cache +40 -3
  21. package/storage/remoteStorage/dist/storageLogs.ts.cache +109 -0
  22. package/storage/remoteStorage/dist/storageServerState.ts.cache +18 -4
  23. package/storage/remoteStorage/dist/storeSync.ts.cache +43 -2
  24. package/storage/remoteStorage/spec.md +4 -0
  25. package/storage/remoteStorage/storageController.d.ts +10 -0
  26. package/storage/remoteStorage/storageController.ts +37 -3
  27. package/storage/remoteStorage/storageLogs.d.ts +29 -0
  28. package/storage/remoteStorage/storageLogs.ts +96 -0
  29. package/storage/remoteStorage/storageServerState.ts +16 -2
  30. package/storage/remoteStorage/storeSync.d.ts +1 -0
  31. package/storage/remoteStorage/storeSync.ts +38 -0
  32. package/yarn.lock +4 -4
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.BlobStore = exports.WINDOW_END_FLUSH_MARGIN = void 0;
6
+ //exports.BlobStore = exports.getHistoryFactor = exports.HISTORY_MIN_BYTES = exports.WINDOW_END_FLUSH_MARGIN = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const caching_1 = require("socket-function/src/caching");
9
9
  const misc_1 = require("socket-function/src/misc");
@@ -23,6 +23,16 @@ exports.WINDOW_END_FLUSH_MARGIN = misc_1.timeInMinute * 5;
23
23
  const WRONG_TARGET_LOG_THROTTLE = 60 * 1000;
24
24
  // Marks an upload id that never reached the disk, so it can never collide with one ArchivesDisk handed out
25
25
  const DISCARDED_UPLOAD_PREFIX = "discarded_";
26
+ // set refuses empty buffers, and an undelete carries no data - this single ignored byte satisfies the wire
27
+ const UNDELETE_PLACEHOLDER = Buffer.from([1]);
28
+ // Deletion history: deleted files keep their bytes on disk (marked in the index) until the history outgrows max(HISTORY_MIN_BYTES, live bytes * history factor) - see StoreSync.enforceHistoryLimit
29
+ exports.HISTORY_MIN_BYTES = 10 * 1024 * 1024 * 1024;
30
+ const HISTORY_FACTOR = 1;
31
+ /** The multiple of a store's live bytes its deletion history may grow to. Async so it can later become dynamic and user-configurable; for now it is a constant. */
32
+ async function getHistoryFactor() {
33
+ return HISTORY_FACTOR;
34
+ }
35
+ exports.getHistoryFactor = getHistoryFactor;
26
36
  let lastWrongTargetLog = 0;
27
37
  function logWrongTargetRejection(message) {
28
38
  if (Date.now() - lastWrongTargetLog < WRONG_TARGET_LOG_THROTTLE)
@@ -216,6 +226,12 @@ class BlobStore {
216
226
  let range = config.range;
217
227
  // Not in the index means it does not exist here: the index IS the answer, and scanning heals it on its own schedule. An entry whose holder is no longer in the source list is still valid - getEntryHolder resolves the persisted URL directly, and get2's fallback loop covers a holder that is gone entirely.
218
228
  let entry = this.getIndexEntry(key);
229
+ // A marked deletion still has its bytes, and the kept value says where - so an includeMarked read is a normal read through the marked entry (it just must not RE-INDEX anything: see the markedRead guards below)
230
+ let markedRead = false;
231
+ if (!entry && config.includeMarked) {
232
+ entry = this.getMarkedEntry(key);
233
+ markedRead = !!entry;
234
+ }
219
235
  if (!entry) {
220
236
  if (!config.includeTombstones)
221
237
  return undefined;
@@ -246,8 +262,8 @@ class BlobStore {
246
262
  }
247
263
  }
248
264
  if (result) {
249
- // Ranged reads can't populate a cache (they're partial)
250
- if (this.slotForSourcesListIndex(entry.sourcesListIndex) !== 0 && !range) {
265
+ // Ranged reads can't populate a cache (they're partial), and a marked read must not re-index anything - caching would resurrect the deleted key as live
266
+ if (!markedRead && this.slotForSourcesListIndex(entry.sourcesListIndex) !== 0 && !range) {
251
267
  await this.cacheRead(key, result);
252
268
  }
253
269
  return result;
@@ -276,7 +292,10 @@ class BlobStore {
276
292
  }
277
293
  if (!fallback)
278
294
  continue;
279
- await this.cacheRead(key, fallback);
295
+ // A marked read must not re-index anything - caching would resurrect the deleted key as live
296
+ if (!markedRead) {
297
+ await this.cacheRead(key, fallback);
298
+ }
280
299
  let data = fallback.data;
281
300
  if (range) {
282
301
  data = data.subarray(Math.min(range.start, data.length), Math.min(range.end, data.length));
@@ -285,8 +304,10 @@ class BlobStore {
285
304
  }
286
305
  if (holderError)
287
306
  throw holderError;
288
- // The holder answered "not there" and no other source has it either: the entry was stale. Forgotten rather than deleted - nothing happened to this file, we were simply wrong about holding it, and saying otherwise would push a deletion out to everyone else.
289
- this.purgeIndexEntry(key);
307
+ // The holder answered "not there" and no other source has it either: the entry was stale. Forgotten rather than deleted - nothing happened to this file, we were simply wrong about holding it, and saying otherwise would push a deletion out to everyone else. (Never for a marked read: purging would erase the deletion's tombstone.)
308
+ if (!markedRead) {
309
+ this.purgeIndexEntry(key);
310
+ }
290
311
  return undefined;
291
312
  }
292
313
  async set(config) {
@@ -304,6 +325,13 @@ class BlobStore {
304
325
  else {
305
326
  this.assertWriteTarget(key, route, config.lastModified);
306
327
  }
328
+ if (config.undelete) {
329
+ if (key === remoteConfig_1.ROUTING_FILE) {
330
+ throw new Error(`The routing config ${JSON.stringify(remoteConfig_1.ROUTING_FILE)} cannot be undeleted (it cannot be deleted in the first place)`);
331
+ }
332
+ await this.undeleteKey(key, writeTime, config.internal);
333
+ return;
334
+ }
307
335
  if (key !== remoteConfig_1.ROUTING_FILE && this.storeConfig.all().length) {
308
336
  if (config.forceSetImmutable) {
309
337
  if (!config.lastModified) {
@@ -391,6 +419,14 @@ class BlobStore {
391
419
  continue;
392
420
  infos.set(key, { path: key, createTime: entry.writeTime, size: entry.size });
393
421
  }
422
+ if (config.includeMarked) {
423
+ // A key is live OR marked, never both, so this cannot collide with the loop above
424
+ for (let [key, entry] of this.markedEntries()) {
425
+ if (!key.startsWith(prefix))
426
+ continue;
427
+ infos.set(key, { path: key, createTime: entry.writeTime, size: entry.size });
428
+ }
429
+ }
394
430
  let files = (0, ArchivesDisk_1.applyFindInfoShape)(Array.from(infos.values()), prefix, { shallow: config.shallow, type: config.type });
395
431
  (0, misc_1.sort)(files, x => x.path);
396
432
  return files;
@@ -427,6 +463,7 @@ class BlobStore {
427
463
  let totals = this.namedIndexTotals();
428
464
  return {
429
465
  index: { fileCount: totals.fileCount, byteCount: totals.byteCount },
466
+ marked: this.markedTotals(),
430
467
  sources: totals.sources,
431
468
  readerDiskLimit: this.readerDiskLimit,
432
469
  syncing: this.sync.getActivities(),
@@ -693,6 +730,75 @@ class BlobStore {
693
730
  yield [key, { writeTime: tombstone.time, changedAt: tombstone.changedAt }];
694
731
  }
695
732
  }
733
+ /** A file MARKED for deletion: its kept index value plus when it was deleted. Undefined when the key is live, never existed, or its history was already dropped. */
734
+ getMarkedEntry(key) {
735
+ let tombstone = this.index.getDeleted(key);
736
+ if (!tombstone || tombstone.value === undefined)
737
+ return undefined;
738
+ return { ...tombstone.value, writeTime: tombstone.valueTime || tombstone.time, changedAt: tombstone.changedAt, deleteTime: tombstone.time };
739
+ }
740
+ /** Every file marked for deletion - the deletion history, walked by retention and by includeMarked listings. */
741
+ *markedEntries() {
742
+ for (let [key, tombstone] of this.index.deletedEntries()) {
743
+ if (tombstone.value === undefined)
744
+ continue;
745
+ yield [key, { ...tombstone.value, writeTime: tombstone.valueTime || tombstone.time, changedAt: tombstone.changedAt, deleteTime: tombstone.time }];
746
+ }
747
+ }
748
+ /** The deletion history's totals: how many marked files, their bytes, and the delete time of the OLDEST one - which is how far back the history reaches. */
749
+ markedTotals() {
750
+ let fileCount = 0;
751
+ let byteCount = 0;
752
+ let oldestDeleteTime;
753
+ for (let [, entry] of this.markedEntries()) {
754
+ fileCount++;
755
+ byteCount += entry.size;
756
+ if (oldestDeleteTime === undefined || entry.deleteTime < oldestDeleteTime) {
757
+ oldestDeleteTime = entry.deleteTime;
758
+ }
759
+ }
760
+ return { fileCount, byteCount, oldestDeleteTime };
761
+ }
762
+ /** Physically removes a marked file's bytes from our disk and drops its kept value, leaving a plain tombstone that ages out normally - retention calling time on the oldest history. */
763
+ async dropMarkedHistory(key) {
764
+ await this.ownDisk.del(key);
765
+ this.index.dropValue(key);
766
+ }
767
+ /** See SetConfig.undelete: flips a marked deletion back to live (fresh write time, so the restore outranks the deletion everywhere it propagated) - the bytes never left the disk, so reads just work again. Internal restores are a peer's propagation and tolerate having nothing to restore (this node may never have held the file); a caller's restore throws instead. */
768
+ async undeleteKey(key, writeTime, internal) {
769
+ var _a, _b, _c;
770
+ let marked = this.getMarkedEntry(key);
771
+ if (!this.index.unmark(key, writeTime)) {
772
+ // Already live: undelete is idempotent (retries and peer propagation both re-send it)
773
+ if (this.getIndexEntry(key))
774
+ return;
775
+ if (internal) {
776
+ console.log(`Undelete of ${JSON.stringify(key)} (store ${this.folder}) has nothing to restore here - this node may never have held the file`);
777
+ return;
778
+ }
779
+ throw new Error(`Cannot undelete ${JSON.stringify(key)} (store ${this.folder}): it has no marked deletion to restore - it was never deleted here${this.getDeletedEntry(key) && ", or its deletion history was already dropped (a plain tombstone remains, but the bytes are gone)" || ""}`);
780
+ }
781
+ console.log(`Undeleted ${JSON.stringify(key)} (store ${this.folder}): the index entry (${marked === null || marked === void 0 ? void 0 : marked.size} bytes, deleted ${marked && new Date(marked.deleteTime).toISOString()}) is live again as of ${new Date(writeTime).toISOString()} - the bytes never left the disk`);
782
+ (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.onIndexChanged) === null || _b === void 0 ? void 0 : _b.call(_a, key);
783
+ if (internal)
784
+ return;
785
+ // Peers marked their own copies when the deletion propagated, so the restore propagates the same way. Straight past any write delay - a buffered undelete could be read back as its placeholder byte.
786
+ let route = (0, remoteConfig_1.getRoute)(key);
787
+ for (let i of this.getWritableSources()) {
788
+ if (i === 0)
789
+ continue;
790
+ if (!(0, remoteConfig_1.routeContains)(this.sources[i].route, route))
791
+ continue;
792
+ // Only our own servers understand the flag - a raw source (backblaze) would store the placeholder byte as the file. Their older copy is re-pushed by reconciliation instead.
793
+ if (((_c = this.sources[i].sourceConfig) === null || _c === void 0 ? void 0 : _c.type) !== "remote")
794
+ continue;
795
+ let push = (0, ArchivesDelayed_2.unwrapDelayed)(this.sources[i].source).set(key, UNDELETE_PLACEHOLDER, { lastModified: writeTime, undelete: true, noChecks: true, internal: true });
796
+ void push.catch((e) => {
797
+ var _a;
798
+ console.error(`Background undelete of ${key} on sync source ${this.sources[i].source.getDebugName()} failed (its scan of us re-finds the file anyway): ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
799
+ });
800
+ }
801
+ }
696
802
  /** How many files we hold, deletions excluded. */
697
803
  indexSize() {
698
804
  return this.index.size;
@@ -852,8 +958,7 @@ class BlobStore {
852
958
  if (config.lastModified < await this.currentWriteTime(key))
853
959
  return;
854
960
  if (data.length === 0) {
855
- // A deletion stores nothing on our own source - the tombstone is the whole of it
856
- await this.sources[0].source.del(key);
961
+ // The bytes stay on our disk as deletion history (see writeToSources) - the marked index entry is the whole of the deletion
857
962
  this.setIndexDeleted(key, config.lastModified);
858
963
  return;
859
964
  }
@@ -864,6 +969,8 @@ class BlobStore {
864
969
  async cacheRead(key, result) {
865
970
  await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
866
971
  this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
972
+ // A down-cache pulls the bytes off a source exactly like synchronization does, so it counts (and logs) the same way
973
+ this.noteSyncTransfer("sync get", key, result.data.length);
867
974
  }
868
975
  // The shared engine of set and del: an empty buffer is exactly a deletion here, which is why the empty-buffer rejection lives in set (the public API), not in this machinery
869
976
  async setOrDelete(key, data, config) {
@@ -918,8 +1025,7 @@ class BlobStore {
918
1025
  }
919
1026
  // Only our own (first) source blocks the write. Downstream sources are written in the background: a down downstream source must not fail or stall writes, and reconciliation re-sends anything they missed once they come back.
920
1027
  if (data.length === 0) {
921
- // A deletion stores nothing on our own source - the tombstone is the whole of it
922
- await this.sources[first].source.del(key);
1028
+ // The bytes STAY on our disk, as deletion history: the index marks the key deleted (keeping its value - see TransactionFile.delete), reads stop finding it, and the retention pass physically removes the oldest history once it outgrows its budget (see StoreSync.enforceHistoryLimit). The marked index entry is the whole of the local deletion.
923
1029
  this.setIndexDeleted(key, writeTime);
924
1030
  }
925
1031
  else {
@@ -929,6 +1035,10 @@ class BlobStore {
929
1035
  if (isRouting)
930
1036
  return;
931
1037
  let route = (0, remoteConfig_1.getRoute)(key);
1038
+ // Deletions did not consume the first slot (nothing is written anywhere locally), so it receives the propagated deletion like the rest - except slot 0, our own disk, whose bytes ARE the history being kept
1039
+ if (data.length === 0 && first !== 0) {
1040
+ writable.unshift(first);
1041
+ }
932
1042
  for (let i of writable) {
933
1043
  if (!(0, remoteConfig_1.routeContains)(this.sources[i].route, route))
934
1044
  continue;
@@ -961,5 +1071,5 @@ class BlobStore {
961
1071
  }
962
1072
  }
963
1073
  exports.BlobStore = BlobStore;
964
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQW9DN0MsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BbUJQO1FBdEJNLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBbUJiO1FBNUNMLGNBQWM7UUFDZCwwR0FBMEc7UUFDbkcsWUFBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFD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UztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQS83QkQsOEJBKzdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVzU3luY1N0YXR1cywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBGaW5kQ29uZmlnLCBIb3N0ZWRDb25maWcsIFJlbW90ZUNvbmZpZywgU291cmNlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsIEZVTExfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrLCBhcHBseUZpbmRJbmZvU2hhcGUgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZywgZ2V0Q29uZmlnVmVyc2lvbiwgc291cmNlSWRlbnRpdHksIHNvdXJjZVBlcnNpc3RlbnRVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IHNlbGVjdEVudHJ5QXQgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcbmltcG9ydCB7IHNvdXJjZVdyaXRlRGVsYXkgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uRmlsZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvbkZpbGVcIjtcbmltcG9ydCB7IFNvdXJjZXNMaXN0IH0gZnJvbSBcIi4vc291cmNlc0xpc3RcIjtcbmltcG9ydCB7IFN0b3JlU3luYyB9IGZyb20gXCIuL3N0b3JlU3luY1wiO1xuaW1wb3J0IHsgU3RvcmVDb25maWcgfSBmcm9tIFwiLi9zdG9yZUNvbmZpZ1wiO1xuaW1wb3J0IHsgYXNEZWxheWVkLCB1bndyYXBEZWxheWVkIH0gZnJvbSBcIi4vQXJjaGl2ZXNEZWxheWVkXCI7XG5cbi8vIFRoZSBzdG9yYWdlIGVuZ2luZSBvZiB0aGUgcmVtb3RlIHN0b3JhZ2Ugc2VydmVyLiBEYXRhIGxpdmVzIGluIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzIChhdCBtaW5pbXVtIGFuIEFyY2hpdmVzRGlzaywgdGhlIGxvY2FsIGRpc2spOyBCbG9iU3RvcmUga2VlcHMgYW4gaW5kZXggb2YgZXZlcnkgZmlsZSAocGF0aCwgbGFzdCBtb2RpZmllZCB0aW1lLCBzaXplLCBhbmQgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YSkgaW4gYSBCdWxrRGF0YWJhc2UyLCBhbmQgYW5zd2VycyBldmVyeSByZWFkIGZyb20gaXQgKHNlZSBBcmNoaXZlc1NvdXJjZSBpbiBJQXJjaGl2ZXMudHMpLiBLZWVwaW5nIHRoYXQgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXMgaXMgU3RvcmVTeW5jJ3Mgam9iLCBub3QgdGhpcyBmaWxlJ3M7IHdoYXQgbGl2ZXMgaGVyZSBpcyB0aGUgaW5kZXggaXRzZWxmLCByZWFkcywgd3JpdGVzLCBhbmQgdGhlIHZhbGlkYXRpb24gYSB3cml0ZSBoYXMgdG8gcGFzcy5cblxuLy8gRmFzdCB3cml0ZXMgYXJlIG5ldmVyIGRlbGF5ZWQgcGFzdCBvdXIgb3duIHZhbGlkIHdpbmRvdywgYW5kIHdpdGhpbiB0aGlzIG1hcmdpbiBvZiB0aGUgd2luZG93J3MgZW5kIHRoZXkgd3JpdGUgdGhyb3VnaCBpbW1lZGlhdGVseSAtIHNvIHdoZW4gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIHRha2VzIG92ZXIsIHRoZSB3cml0ZXMgYXJlIGFscmVhZHkgb24gZGlza1xuZXhwb3J0IGNvbnN0IFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOID0gdGltZUluTWludXRlICogNTtcbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG4vLyBNYXJrcyBhbiB1cGxvYWQgaWQgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrLCBzbyBpdCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIG9uZSBBcmNoaXZlc0Rpc2sgaGFuZGVkIG91dFxuY29uc3QgRElTQ0FSREVEX1VQTE9BRF9QUkVGSVggPSBcImRpc2NhcmRlZF9cIjtcblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuXG4vLyBUaGUgYnVja2V0IHN0b3JlLCBhbmQgdGhlIG9ubHkgb25lOiBldmVyeSBidWNrZXQgYSBzZXJ2ZXIgaG9sZHMgaXMgc2VydmVkIGJ5IHRoZXNlLCBvbmUgcGVyIHN0b3JlIG5hbWUgaW4gaXRzIHJvdXRpbmcgY29uZmlnLiBJdHMgc291cmNlcyBhcmUgcGxhaW4gSUFyY2hpdmVzIC0gdGhlIGZpcnN0IGlzIGFsd2F5cyB0aGUgc3RvcmUncyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgY29uZmlndXJlZCBwZWVycyAoc2VlIGNyZWF0ZVN0b3JlU291cmNlKSAtIHNvIFwibm8gc3luY2hyb25pemF0aW9uXCIgaXMgc2ltcGx5IGEgc3RvcmUgd2l0aCBubyBwZWVycywgbm90IGEgZGlmZmVyZW50IGtpbmQgb2Ygc3RvcmUuXG5leHBvcnQgY2xhc3MgQmxvYlN0b3JlIHtcbiAgICAvLyDilIDilIAgc3RhdGUg4pSA4pSAXG4gICAgLy8gU2V0IG9uY2UgdGhlIHN0b3JlIGlzIHNodXR0aW5nIGRvd247IGV2ZXJ5IGxvb3AgaXQgb3ducyAoYW5kIFN0b3JlU3luYydzIG1haW50ZW5hbmNlIGxvb3BzKSBzdG9wcyBvbiBpdFxuICAgIHB1YmxpYyBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuICAgIC8vIFdoZXRoZXIgaW5pdCBoYXMgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgYSBuZXdseSBhZGRlZCBzb3VyY2UgY2FuIHN0YXJ0IHNjYW5uaW5nIGltbWVkaWF0ZWx5XG4gICAgcHVibGljIHN5bmNTdGFydGVkID0gZmFsc2U7XG4gICAgLyoqIEl0cyBzb3VyY2VzLCBpbiBjb25maWcgb3JkZXI6IHNsb3QgMCBpcyBhbHdheXMgaXRzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBwZWVycyBpdCBzeW5jaHJvbml6ZXMgd2l0aC4gRmlsbGVkIGJ5IHVwZGF0ZVNvdXJjZXMsIHdoaWNoIGlzIGFsc28gaG93IHRoZXkgY2hhbmdlLiBUaGUgc3RvcmUgT1dOUyB0aGVtIC0gd3JpdGVzIHBpY2sgYW1vbmcgdGhlbSwgcmVhZHMgcmVzb2x2ZSBob2xkZXJzIHRocm91Z2ggdGhlbSAtIGFuZCBTdG9yZVN5bmMgb25seSBzY2FucyB3aGF0ZXZlciBpcyBpbiBoZXJlIGF0IHRoZSB0aW1lLiAqL1xuICAgIHB1YmxpYyBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW107XG4gICAgLy8gVXBsb2FkcyBpbW11dGFiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGFnYWluc3Q6IHRoZSBjbGllbnQgaXMgbWlkLXN0cmVhbSBieSB0aGUgdGltZSB3ZSBrbm93LCBzbyBpdCBrZWVwcyBzZW5kaW5nIGFuZCBldmVyeSBwYXJ0IGlzIGRyb3BwZWRcbiAgICBwcml2YXRlIGRpc2NhcmRlZFVwbG9hZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIG5leHREaXNjYXJkZWRVcGxvYWQgPSAxO1xuICAgIC8vIFRoZSBwZXJzaXN0ZW50IGlkZW50aXRpZXMgYmVoaW5kIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCAoc2VlIFNvdXJjZXNMaXN0KVxuICAgIHByaXZhdGUgc291cmNlc0xpc3Q6IFNvdXJjZXNMaXN0O1xuICAgIC8vIFBlciBzbG90OiB0aGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIHRoYXQgc2xvdCdzIFVSTCwgZmlsbGVkIGJ5IHJlZ2lzdGVyU2xvdCBiZWZvcmUgdGhlIHNsb3QncyBzeW5jIHJ1bnNcbiAgICBwcml2YXRlIHNsb3RTb3VyY2VzTGlzdEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSBzbG90UmVnaXN0cmF0aW9uczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgLy8gRXZlcnkgZmlsZSB3ZSBrbm93IG9mLCBpbiBtZW1vcnksIHdpdGggYW4gYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBjaGFuZ2VzIGJlaGluZCBpdCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuIEEgbmV3IGZpbGUgbmFtZSBlYWNoIHRpbWUgdGhlIGVudHJ5IGZvcm1hdCBjaGFuZ2VzIGdlbmVyYXRpb246IHRoZSBwcmV2aW91cyBvbmVzIGNhbm5vdCBiZSByZWFkLCBhbmQgYSBzY2FuIHJlYnVpbGRzIHRoZSBpbmRleCBhbnl3YXksIHNvIHRoZXkgYXJlIHNpbXBseSBuZXZlciByZWFkIGFnYWluLlxuICAgIHByaXZhdGUgaW5kZXg6IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPjtcbiAgICAvKiogS2VlcGluZyB0aGUgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXM6IHNjYW5uaW5nLCBwdWxsaW5nLCBwdXNoaW5nLCBhbmQgdGhlIG1haW50ZW5hbmNlIHRoYXQgZm9sbG93cyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGRpc2stbGltaXQgZXZpY3Rpb24sIHRvbWJzdG9uZSBleHBpcnkpLiBJdCByZWFkcyBhbmQgd3JpdGVzIHRoaXMgc3RvcmUncyBpbmRleCBhbmQgc291cmNlcyAtIGl0IGRvZXMgbm90IG93biB0aGVtLiAqL1xuICAgIHB1YmxpYyBzeW5jOiBTdG9yZVN5bmM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gUHVibGljIGZvciBTdG9yZVN5bmMsIHdoaWNoIGxvZ3MgaXQgd2l0aCBldmVyeXRoaW5nIGl0IGRvZXNcbiAgICAgICAgcHVibGljIGZvbGRlcjogc3RyaW5nLFxuICAgICAgICAvKiogVGhlIG5hbWUgdGhpcyBzdG9yZSBhbnN3ZXJzIHRvIChzZWUgQ29tbW9uQ29uZmlnLm5hbWUpIC0gdGhlIGVudHJpZXMgb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoYXQgY2FycnkgaXQgYXJlIHRoZSBvbmVzIHRoYXQgY29uZmlndXJlIGl0LCBhbmQgdGhlIHJlc3QgYXJlIGl0cyBwZWVycy4gKi9cbiAgICAgICAgcHVibGljIHN0b3JlTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8qKiBXaGV0aGVyIGEgY29uZmlnIGVudHJ5IGlzIFRISVMgU0VSVkVSIChzYW1lIGFjY291bnQsIHNhbWUgYnVja2V0LCBvdXIgb3duIGFkZHJlc3MpLiBJbmplY3RlZCBiZWNhdXNlIGEgc3RvcmUga25vd3Mgbm90aGluZyBhYm91dCBzZXJ2ZXJzIC0gaXQgb25seSBuZWVkcyB0byB0ZWxsIGl0cyBvd24gZW50cmllcyBhcGFydCBmcm9tIGl0cyBwZWVycycuIEFic2VudCBtZWFucyBub3RoaW5nIGlzIHVzLCB3aGljaCBpcyB3aGF0IGEgYmFyZSBzdG9yZSAobm8gc2VydmVyIGFyb3VuZCBpdCkgd2FudHMuICovXG4gICAgICAgICAgICBpc1NlbGY/OiAoc291cmNlOiBTb3VyY2VDb25maWcpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAvKiogQnVpbGRzIG9uZSBvZiBpdHMgc291cmNlcy4gSW5qZWN0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiwgYW5kIGJlY2F1c2UgdGhlIGRlbGF5IGl0IGlzIGNyZWF0ZWQgd2l0aCBpcyB0aGlzIHN0b3JlJ3MgcG9saWN5LiAqL1xuICAgICAgICAgICAgY3JlYXRlU291cmNlPzogKGNvbmZpZzogeyBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7IHdyaXRlRGVsYXk6IG51bWJlciB9KSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgICAgICAvKiogSGFuZHMgYSBydW5uaW5nIHNvdXJjZSBhIGNoYW5nZWQgY29uZmlnLCBzbyBhbiBlbmRwb2ludCB3ZSBhbHJlYWR5IHRhbGsgdG8gaXMgbmV2ZXIgcmVidWlsdCBqdXN0IGJlY2F1c2UgYSBmbGFnIG1vdmVkLiAqL1xuICAgICAgICAgICAgYXBwbHlTb3VyY2U/OiAoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb24pIOKAlCBob3cgdGhlIHN0b3JhZ2Ugc2VydmVyIG5vdGljZXMgcm91dGluZyBjb25maWcgdXBkYXRlcy5cbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkPzogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIENhbGxlZCBldmVyeSB0aW1lIHRoaXMgc3RvcmUgYXBwbGllcyBhIHJvdXRpbmcgY29uZmlnIHRvIGl0c2VsZiAoc3RhcnR1cCwgYW4gb3BlcmF0b3IncyB3cml0ZSwgYSBwZWVyJ3MgY29weSBhcnJpdmluZykgLSB0aGUgc3RvcmUgaXMgdGhlIG9uZSB0aGF0IGtub3dzIHdoZW4gYSBjb25maWcgbGFuZGVkLCBhbmQgdGhlIHNlcnZlciBhcm1zIHdpbmRvdy1ib3VuZGFyeSBzY2FucyBmcm9tIGl0LiAqL1xuICAgICAgICAgICAgb25Sb3V0aW5nQXBwbGllZD86IChyb3V0aW5nOiBSZW1vdGVDb25maWcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQXNrcyB0aGUgY2xpZW50IHdob3NlIHJlcXVlc3QgY3JlYXRlZCB0aGlzIHN0b3JlIHdoYXQgcm91dGluZyBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLiBPbmx5IHVzZWQgd2hlbiBpbml0IGZpbmRzIE5PIGNvbmZpZ3VyYXRpb24gaW4gb3VyIGZvbGRlcjogYSBzdG9yZSBvbmx5IGV2ZXIgZXhpc3RzIGJlY2F1c2UgYSBjb25maWcgbmFtZXMgaXQsIHNvIHRoZSByZXF1ZXN0ZXIgaGFzIHRoYXQgY29uZmlnIC0gYXNraW5nIGZvciBpdCBsYXppbHkgaXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgcGFzc2luZyB0aGUgY29uZmlnIG9uIGV2ZXJ5IGNhbGwsIHdpdGhvdXQgdGhlIHBlci1jYWxsIGtpbG9ieXRlcy4gKi9cbiAgICAgICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnPzogKCkgPT4gUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgLy8gRXZlcnkgYWNjZXB0ZWQgd3JpdGUgKFwib3JpZ2luYWxcIikgYW5kIGV2ZXJ5IHdyaXRlIHRoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcyAoXCJmbHVzaGVkXCIpLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSwgc28gdGhlIHR3byBjb3VudHMgZGlmZmVyLlxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ/OiAoa2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQSBzeW5jaHJvbml6YXRpb24gdHJhbnNmZXI6IFwic3luYyBnZXRcIiBpcyBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlICh0aGUgYmFja2JsYXplIGRvd25sb2FkIGJpbGwpLCBcInN5bmMgc2V0XCIgaXMgYnl0ZXMgcHVzaGVkIHRvIG9uZS4gSW5qZWN0ZWQgYmVjYXVzZSBzeW5jIHRyYWZmaWMgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSBjb250cm9sbGVyLCBzbyBub3RoaW5nIGVsc2UgY2FuIGNvdW50IGl0LiAqL1xuICAgICAgICAgICAgb25TeW5jVHJhbnNmZXI/OiAob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJTbG90KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFmdGVyIHRoZSBzbG90cywgd2hpY2ggaXMgd2hhdCBpbmRleCBlbnRyaWVzIG5hbWUgYXMgdGhlaXIgaG9sZGVyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEluZGV4KCk7XG4gICAgICAgIHRoaXMuc3luY1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlLXJlYWRzIHRoZSByb3V0aW5nIGNvbmZpZyBvdXQgb2YgdGhpcyBzdG9yZSBhbmQgYXBwbGllcyBpdCB0byBpdHNlbGYuIENhbGxlZCBhdCBzdGFydHVwIGFuZFxuICAgICAqIHdoZW5ldmVyIHRoYXQgZmlsZSBjaGFuZ2VzIGhlcmUgLSB3aGljaCBpcyB0aGUgT05FIG1lY2hhbmlzbTogYSBjb25maWcgd3JpdHRlbiBieSBhbiBvcGVyYXRvclxuICAgICAqIGFuZCBhIGNvbmZpZyBwdWxsZWQgb2ZmIGEgcGVlciBhcmUgdGhlIHNhbWUgZXZlbnQsIGEgd3JpdGUgb2YgdGhhdCBwYXRoIGludG8gdGhpcyBzdG9yZS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgd2l0aCBubyByb3V0aW5nIGNvbmZpZyBjb25maWd1cmVzIGl0c2VsZiBhcyBpdHMgb3duIGRpc2ssIHZhbGlkIGFsd2F5cywgZm9yIHRoZSB3aG9sZVxuICAgICAqIGtleSBzcGFjZS4gVGhhdCBpcyBhIGNvbXBsZXRlLCB3b3JraW5nIHN0b3JlIC0gaXQganVzdCBoYXMgbm9ib2R5IHRvIHN5bmNocm9uaXplIHdpdGggLSBhbmQgaXRcbiAgICAgKiBpcyB3aGF0IGxldHMgYSBzdG9yZSBleGlzdCBiZWZvcmUgaXQgaGFzIGV2ZXIgaGVhcmQgb2YgYSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhcHBseVJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByb3V0aW5nID0gYXdhaXQgdGhpcy5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICBsZXQgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcbiAgICAgICAgbGV0IHBlZXJzOiBTb3VyY2VDb25maWdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygcm91dGluZz8uc291cmNlcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSAmJiB0aGlzLmNvbmZpZz8uaXNTZWxmPy4oc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChzb3VyY2UgYXMgSG9zdGVkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlZXJzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGluZyAmJiAhZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0pIGRvZXMgbm90IG5hbWUgdGhpcyBzdG9yZSAoJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9KSBhcyBvbmUgb2Ygb3Vycywgc28gaXQgc3RheXMgYSBkaXNrLW9ubHkgc3RvcmVgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJldmlvdXNWZXJzaW9uID0gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgICAgIGxldCBuZXdWZXJzaW9uID0gcm91dGluZyAmJiBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpIHx8IC0xO1xuICAgICAgICBpZiAobmV3VmVyc2lvbiAhPT0gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGFkb3B0ZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke3ByZXZpb3VzVmVyc2lvbn0gLT4gJHtuZXdWZXJzaW9ufTogJHtlbnRyaWVzLmxlbmd0aH0gZW50ciR7ZW50cmllcy5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gb2Ygb3VycyAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0sICR7cGVlcnMubGVuZ3RofSBwZWVyKHMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZy51cGRhdGUoZW50cmllcyk7XG4gICAgICAgIHRoaXMudXBkYXRlU291cmNlcyh0aGlzLnBsYW5Tb3VyY2VzKHBlZXJzKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgICAgdGhpcy5hcHBsaWVkUm91dGluZyA9IHJvdXRpbmc7XG4gICAgICAgIGlmIChyb3V0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZz8ub25Sb3V0aW5nQXBwbGllZD8uKHJvdXRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGFzIHRoaXMgc3RvcmUgaG9sZHMgaXQsIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBmb2xkZXI6IHRoZSBzdG9yZSBtYXkgYmUgY29uZmlndXJpbmcgaXRzZWxmIGJlZm9yZSBpdCBoYXMgc2Nhbm5lZCBhbnl0aGluZywgYW5kIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgd2hhdCBhIHNjYW4gd291bGQgZXZlbiB0YWxrIHRvXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMub3duRGlzay5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJZ25vcmluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0IGNvdWxkIG5vdCBiZSBwYXJzZWQgKCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBpcyBydW5uaW5nLCBzbyBhIGNvcHkgZm91bmQgb24gYSBwZWVyIGlzIG9ubHkgdGFrZW4gd2hlbiBpdCBpcyBnZW51aW5lbHkgbmV3ZXIuIC0xIG1lYW5zIGl0IGhhcyBub25lLiAqL1xuICAgIHB1YmxpYyByb3V0aW5nVmVyc2lvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQXBwbHlpbmcgaXQgdG91Y2hlcyB0aGUgc291cmNlcywgc28gaXQgaXMgc2VyaWFsaXplZCBiZWhpbmQgd2hhdGV2ZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nIHJhdGhlciB0aGFuIGludGVybGVhdmluZyB3aXRoIGl0XG4gICAgcHJpdmF0ZSByb3V0aW5nQXBwbGllczogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHB1YmxpYyByZWFwcGx5Um91dGluZ0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJvdXRpbmdBcHBsaWVzLnRoZW4oKCkgPT4gdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKSk7XG4gICAgICAgIHRoaXMucm91dGluZ0FwcGxpZXMgPSBuZXh0LmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHZvaWQgbmV4dC5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEludGVybmFsMihjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZy5yYW5nZTtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBBIGRlbGV0aW9uIGhhcyBubyBieXRlcyAtIHRoZSB0b21ic3RvbmUgSVMgdGhlIGFuc3dlciwgc28gYSBmbGFnLWNhbGxlciBnZXRzIGl0cyB0aW1lIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jLm5vdGVBY2Nlc3Moa2V5KTtcbiAgICAgICAgbGV0IGhvbGRlckFyY2hpdmVzID0gYXdhaXQgdGhpcy5nZXRFbnRyeUhvbGRlcihlbnRyeSk7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob2xkZXJFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChob2xkZXJBcmNoaXZlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBpbmNsdWRlVG9tYnN0b25lczogdGhlIGhvbGRlciBhbnN3ZXJpbmcgXCJkZWxldGVkXCIgKGEgdG9tYnN0b25lLCB3aXRoIGl0cyB3cml0ZSB0aW1lKSBtdXN0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIFwiSSBsb3N0IHRoZSBmaWxlXCIgLSB0aGUgZm9ybWVyIGlzIGF1dGhvcml0YXRpdmUgYW5kIG11c3QgTk9UIGZhbGwgYmFjayB0byBvbGRlciBjb3BpZXMsIHdoaWNoIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRpb24gZm9yIHRoaXMgcmVhZFxuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCBob2xkZXJBcmNoaXZlcy5nZXQyKGtleSwgeyByYW5nZSwgaW50ZXJuYWw6IHRydWUsIGluY2x1ZGVUb21ic3RvbmVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgIWFuc3dlci5kYXRhLmxlbmd0aCAmJiAhKHJhbmdlICYmIGFuc3dlci5zaXplKSAmJiBhbnN3ZXIud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBhIHJhbmdlZCByZWFkIG9mIGEgcmVhbCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgKHJhbmdlIHBhc3QgRU9GKSwgc28gb25seSB1bnJhbmdlZCBlbXB0aW5lc3MgbWVhbnMgdG9tYnN0b25lL2Fic2VudFxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgKGFuc3dlci5kYXRhLmxlbmd0aCB8fCByYW5nZSAmJiBhbnN3ZXIuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geyBkYXRhOiBhbnN3ZXIuZGF0YSwgd3JpdGVUaW1lOiBhbnN3ZXIud3JpdGVUaW1lLCBzaXplOiBhbnN3ZXIuc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBob2xkZXJFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gUmFuZ2VkIHJlYWRzIGNhbid0IHBvcHVsYXRlIGEgY2FjaGUgKHRoZXkncmUgcGFydGlhbClcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpICE9PSAwICYmICFyYW5nZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIC0gZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgc291cmNlJ3MgY29weSB3b3VsZCBzeW5jaHJvbml6ZSBpdCBiZXR3ZWVuIG5vZGVzIHRocm91Z2ggdGhlIHJlYWQgcGF0aCwgd2hpY2ggaXQgbmV2ZXIgaXNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaG9sZGVyIGlzIGRvd24gb3IgbG9zdCB0aGUgZmlsZS4gQU5ZIG90aGVyIHNvdXJjZSdzIGNvcHkgYmVhdHMgbm8gdmFsdWUgLSBldmVuIGFuIE9MREVSIG9uZSAtIGFuZCBpdCdzIGNvcGllZCBvbnRvIG91ciBkaXNrIHNvIHRoZSBuZXh0IHJlYWQgZG9lc24ndCBkZXBlbmQgb24gbHVjay5cbiAgICAgICAgbGV0IGhvbGRlclNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGhvbGRlclNsb3QgfHwgIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmYWxsYmFjazogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGFuc3dlciA9IGF3YWl0IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0MihrZXksIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBjb3VudHMgYXMgYWJzZW50IC0gYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh0aGlzIHJlYWQgaXMgdW5yYW5nZWQsIHNvIGVtcHRpbmVzcyBpcyB1bmFtYmlndW91cylcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIGFuc3dlci5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2spIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS5cbiAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHBhdGg6IGtleSwgZGF0YSB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93cy9yb3V0ZXMsIHNvIHRoZXkgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgKGFuZCBpdCBuZXZlciBmbG93cyB0aHJvdWdoIHZhbGlkYXRpb24pIC0gYnV0IGl0IGhhcyBhIHJ1bGUgb2YgaXRzIG93biwgd2hpY2ggaXMgb3VycyB0byBlbmZvcmNlIGJlY2F1c2UgdGhlIGZpbGUgaXMgb3Vyc1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgZXhlbXB0IGZvciB0aGUgc2FtZSByZWFzb24gaXQgc2tpcHMgZXZlcnkgb3RoZXIgY2hlY2s6IGl0IGlzIHRoZSBmaWxlIHRoYXQgREVGSU5FUyBvdXIgd2luZG93cyBhbmQgcm91dGVzLCBzbyBqdWRnaW5nIGl0IGJ5IHRoZSBjb25maWcgaXQgaXMgYWJvdXQgdG8gcmVwbGFjZSBpcyBob3cgYSBzdG9yZSBnZXRzIHN0dWNrIG9uIGEgY29uZmlnIGl0IGNhbiBuZXZlciBiZSB0b2xkIHRvIGxlYXZlXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldE9yRGVsZXRlKGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICAvLyBBIGRlbGV0aW9uIGxhbmRzIGluIGV4YWN0bHkgdGhlIHNhbWUgcGxhY2UgYSB3cml0ZSB3b3VsZCwgc28gaXQgaXMganVkZ2VkIHRoZSBzYW1lIHdheTogb25lIGFpbWVkIGF0IGEgc2hhcmQgd2UgZG9uJ3Qgc2VydmUgaXMganVzdCBhcyBpbnZpc2libGUgYXMgYSB3cml0ZSB0byBpdFxuICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgZ2V0Um91dGUoa2V5KSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZGVsZXRpb25zIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCBkZWxldGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgZ2V0Um91dGUoa2V5KSk7XG4gICAgICAgICAgICAvLyBzZXRJbnRlcm5hbCB0cmVhdHMgYW4gZW1wdHkgYnVmZmVyIGFzIGV4YWN0bHkgYSBkZWxldGlvbjogZGlzayByZW1vdmFsIHBsdXMgYSB0b21ic3RvbmUgaW5kZXggZW50cnksIG5vIGZhbi1vdXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZXMgYXJlIHdyaXRlcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSB0b21ic3RvbmUgaXMgb3JkZXJlZCBieSB3cml0ZSB0aW1lIGxpa2UgYW55IG90aGVyIHdyaXRlLCBwcm9wYWdhdGVzIHRocm91Z2ggc3luY2hyb25pemF0aW9uLCBhbmQgaXMgZXZlbnR1YWxseSBleHBpcmVkXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgIH1cblxuICAgIC8qKiBBIG5vZGUtc2lkZSBtb3ZlOiB0aGUgYnl0ZXMgbmV2ZXIgdHJhdmVsIHRocm91Z2ggdGhlIGNsaWVudC4gRGVsaWJlcmF0ZWx5IGp1c3QgZ2V0MiArIHNldCArIGRlbCByYXRoZXIgdGhhbiBhIGRpc2sgcmVuYW1lLCBzbyB0aGUgZGVzdGluYXRpb24gd3JpdGUgcGFzc2VzIEVWRVJZIHJ1bGUgYSBzZXQgcGFzc2VzICh3aW5kb3dzLCByb3V0ZXMsIGltbXV0YWJpbGl0eSwgb25seS10YWtlLWxhdGVzdCwgaW5kZXgsIGZhbi1vdXQgdG8gcGVlcnMpIGFuZCB0aGUgZGVsZXRpb24gcHJvcGFnYXRlcyBhcyBhIG5vcm1hbCB0b21ic3RvbmUgLSBhIHJlbmFtZSB3b3VsZCBieXBhc3MgYWxsIG9mIGl0LiBUaGUgc2V0IHN0YW1wcyBmcmVzaCwgc28gdGhlIG1vdmVkIGZpbGUgYmVhdHMgYW55IHRvbWJzdG9uZSBhdCBpdHMgbmV3IHBhdGguICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7IGZyb21QYXRoOiBzdHJpbmc7IHRvUGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IGNvbmZpZy50b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gUk9VVElOR19GSUxFIHx8IGNvbmZpZy50b1BhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgbW92ZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIHNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldCh7IHBhdGg6IGNvbmZpZy50b1BhdGgsIGRhdGE6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbCh7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhjb25maWc6IHsgcGF0aDogc3RyaW5nOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSByZXR1cm4geyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9O1xuICAgICAgICBpZiAoIWNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWRlbGV0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBwcmVmaXg6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBwcmVmaXggPSBjb25maWcucHJlZml4O1xuICAgICAgICBsZXQgaW5mb3MgPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICAvLyBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIGF0IGFsbCwgd2hpY2ggaXMgd2hhdCBhIGxpc3Rpbmcgd2FudHM6IGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCB7IHNoYWxsb3c6IGNvbmZpZy5zaGFsbG93LCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gQWxsIGZpbGVzIGNoYW5nZWQgYWZ0ZXIgY29uZmlnLnRpbWUg4oCUIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIGVudHJpZXM6IGEgY2FsbGVyIHJlYWRpbmcgYSBjaGFuZ2UgZmVlZCBoYXMgdG8gaGVhciBhYm91dCB0aGVtLCBhbmQgc2l6ZSAwIGlzIGhvdyB0aGUgZmVlZCBzYXlzIFwiZ29uZVwiIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gY29uZmlnLnJvdXRlcyBsZXRzIGEgc3RvcmUgc3luY2luZyBhIHBhcnRpYWwgc2hhcmQgYXNrIGZvciBqdXN0IGl0cyBzbGljZS5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgaW5Sb3V0ZXMgPSAoa2V5OiBzdHJpbmcpID0+ICFjb25maWcucm91dGVzIHx8IGNvbmZpZy5yb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUsIHNpemU6IDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbmRleCdzIHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCwgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBzb3VyY2VzOiB0b3RhbHMuc291cmNlcyxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogdGhpcy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiB0aGlzLnN5bmMuZ2V0QWN0aXZpdGllcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBnZXRTeW5jUHJvZ3Jlc3MncyB0b3RhbHMsIGJ1dCBsb2FkaW5nIHRoZSBpbmRleCBmaXJzdCwgc28gdGhleSBhcmUgbmV2ZXIgdGhlIHplcm9lcyBvZiBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgeWV0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYW1lZEluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5pbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LFxuICAgICAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHsgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgLi4udG90YWxzLnNsb3RzW2ldIH0pKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RvcmUncyBzb3VyY2VzLCBhcyB0aGUgY3VycmVudCByb3V0aW5nIGNvbmZpZyBzYXlzIHRoZXkgc2hvdWxkIGJlLiBUaGlzIGlzIHRoZSBPTkxZIHdheVxuICAgICAqIHRoZXkgYXJlIGV2ZXIgc2V0OiB0aGUgZmlyc3QgY2FsbCBwb3B1bGF0ZXMgYW4gZW1wdHkgc3RvcmUsIGV2ZXJ5IGxhdGVyIG9uZSBhcHBsaWVzIGEgY2hhbmdlIHRvXG4gICAgICogdGhlIHJ1bm5pbmcgb25lLiBXaW5kb3dzLCByb3V0ZXMgYW5kIGZsYWdzIG1vdmUgaW4gcGxhY2UsIGdlbnVpbmVseSBuZXcgZW5kcG9pbnRzIGFyZSBhZGRlZCBhbmRcbiAgICAgKiBzdGFydCBzY2FubmluZywgYW5kIGVuZHBvaW50cyB0aGF0IGFyZSBnb25lIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXNcbiAgICAgKiBkcm9wKS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgaXMgbmV2ZXIgcmVidWlsdCBmb3IgYSBjb25maWcgY2hhbmdlLiBJdHMgbmFtZSBkZWNpZGVzIGl0cyBmb2xkZXIgYW5kIGl0cyBpZGVudGl0eSwgYW5kXG4gICAgICogYSBjb25maWcgY2hhbmdlIGNhbm5vdCBjaGFuZ2UgZWl0aGVyIC0gc28gdGhlcmUgaXMgbm90aGluZyBhIGNoYW5nZSBjYW4gZG8gdG8gYSBzdG9yZSBleGNlcHRcbiAgICAgKiB0aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTb3VyY2VzKHNwZWNzOiBCbG9iU291cmNlU3BlY1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3BlY3MubGVuZ3RoIHx8IHNwZWNzWzBdLmlkZW50aXR5ICE9PSBcImRpc2tcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVTb3VyY2VzIGV4cGVjdHMgdGhlIGRpc2sgc291cmNlIGZpcnN0IChpZGVudGl0eSBcImRpc2tcIiksIGdvdCAke0pTT04uc3RyaW5naWZ5KHNwZWNzLm1hcCh4ID0+IHguaWRlbnRpdHkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbDogdGhlIGRpc2sgc2xvdCBoYXMgdG8gZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBtYXRjaGVkIGFnYWluc3QgaXRcbiAgICAgICAgICAgIGxldCBkaXNrID0gc3BlY3NbMF07XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZGlzay5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IGRpc2sudXJsLCB2YWxpZFdpbmRvd3M6IGRpc2sudmFsaWRXaW5kb3dzLCByb3V0ZTogZGlzay5yb3V0ZSwgbm9GdWxsU3luYzogZGlzay5ub0Z1bGxTeW5jLCBzb3VyY2VDb25maWc6IGRpc2suc291cmNlQ29uZmlnLCBpZGVudGl0eTogZGlzay5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvd3MgPSAoaTogbnVtYmVyLCB3aW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pID0+IHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgPT09IEpTT04uc3RyaW5naWZ5KHdpbmRvd3MpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93cyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkob2xkKX0gLT4gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3dzKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MgPSB3aW5kb3dzO1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3dzKDAsIHNwZWNzWzBdLnZhbGlkV2luZG93cyk7XG4gICAgICAgIC8vIExpdmUgc2xvdHMgcGFpciB3aXRoIHNwZWNzIGJ5IGlkZW50aXR5LiBFYWNoIGVuZHBvaW50IGlzIG5vdyBPTkUgc3BlYyBjYXJyeWluZyBhbGwgaXRzIHdpbmRvd3MsIHNvIHRoaXMgaXMgYSAxOjEgcGFpcmluZzsgYW55IGxlZnRvdmVyIGR1cGxpY2F0ZSBzbG90cyBmcm9tIGJlZm9yZSAoYW4gZW5kcG9pbnQgdGhhdCB1c2VkIHRvIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBzbG90cykgZ28gdW5tYXRjaGVkIGJlbG93IGFuZCBhcmUgY29sbGFwc2VkIGF3YXkuXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBTQU1FIGVuZHBvaW50IChzZWUgc291cmNlSWRlbnRpdHkpLCBzbyB3ZSBhcmUgYWxyZWFkeSBzeW5jaHJvbml6ZWQgd2l0aCBpdDogdGhlIHNsb3Qga2VlcHMgaXRzIGNvbm5lY3Rpb24sIGl0cyBjb21wbGV0ZWQgc2NhbnMsIGFuZCBpdHMgaW5kZXggZW50cmllcywgYW5kIG9ubHkgdGhlIHBvbGljeSBvbiBpdCBtb3Zlcy4gUmVjcmVhdGluZyBpdCBoZXJlIHdvdWxkIG1lYW4gcmVzY2FubmluZyB0aGUgZW5kcG9pbnQgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUgYSBmbGFnIGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93cyhzbG90LCBzcGVjLnZhbGlkV2luZG93cyk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zb3VyY2VzW3Nsb3RdO1xuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0ZSBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJvdXRlID0gc3BlYy5yb3V0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLCBrZWVwaW5nIHRoZSBzb3VyY2UgKHNvIGl0IGlzIG5vdCByZXNjYW5uZWQpOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGNhcnJpZXMgaXRzIGNvbmZpZyAoYW5kIGl0cyB3cml0ZSBkZWxheSkgaW50byBldmVyeXRoaW5nIGl0IGRvZXMsIHNvIGl0IGhhcyB0byBsZWFybiB0aGUgbmV3IG9uZSAtIHNlZSBhcHBseVNvdXJjZUNvbmZpZ1xuICAgICAgICAgICAgICAgIHNwZWMuYXBwbHlDb25maWc/LihleGlzdGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc291cmNlQ29uZmlnID0gc3BlYy5zb3VyY2VDb25maWc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IHNwZWMudXJsLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCByb3V0ZTogc3BlYy5yb3V0ZSwgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLCBpbnRlcm1lZGlhdGU6IHNwZWMuaW50ZXJtZWRpYXRlLCBzb3VyY2VDb25maWc6IHNwZWMuc291cmNlQ29uZmlnLCBpZGVudGl0eTogc3BlYy5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYSBnZW51aW5lbHkgbmV3IGVuZHBvaW50LCBzbyBpdCBpcyBzY2FubmVkIGZyb20gc2NyYXRjaGApO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSBzbG90IGlzIGRlYWQgdGhlIG1vbWVudCB0aGlzIHJldHVybnM7IGRyb3BwaW5nIHRoZSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgaXMgdGhlIHBhcnQgdGhhdCByZWFkcyB0aGUgaW5kZXgsIHNvIGl0IGZpbmlzaGVzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICB2b2lkIHRoaXMuc3luYy5yZW1vdmVTb3VyY2UoaSkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLnJlc2NhbkJhc2UoKTtcbiAgICB9XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcykuICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMuYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBMYXJnZSB1cGxvYWRzIHN0cmVhbSBvbnRvIHRoZSBsb2NhbCBkaXNrIHNvdXJjZSBkaXJlY3RseSAodGhleSBtYXkgbm90IGZpdCBpbiBtZW1vcnkpLCBhbmQgcmVjb25jaWxpYXRpb24gY2FycmllcyB0aGVtIHRvIHRoZSBvdGhlciBzb3VyY2VzIC0gdGhlcmUgaXMgbm8gZGVsYXllZC13cml0ZSBzdGFnZSB0aGV5IGNvdWxkIHBhc3MgdGhyb3VnaC4gVGhlIHdyaXRlIGl0c2VsZiBpcyB2YWxpZGF0ZWQgZXhhY3RseSBsaWtlIHNldCdzLCByaWdodCBoZXJlOiB0aGUgY2xpZW50IGlzIGFib3V0IHRvIHNlbmQgdGhlIHdob2xlIGZpbGUsIHNvIGV2ZXJ5IHJlYXNvbiB0byByZWZ1c2UgaXQgbXVzdCBiZSBmb3VuZCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoY29uZmlnPzogeyBwYXRoPzogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnPy5wYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgcm91dGUsIGNvbmZpZz8ubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpLiBUaGUgY2xpZW50IGlzIGFscmVhZHkgc3RyZWFtaW5nLCBzbyB0aGUgdXBsb2FkIGlzIGFjY2VwdGVkIGFuZCBldmVyeSBwYXJ0IGRpc2NhcmRlZCAtIHRoZSBhbHRlcm5hdGl2ZSBpcyB0aHJvd2luZyBhdCBhIGNhbGxlciB0aGF0IGRpZCBub3RoaW5nIHdyb25nLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBgJHtESVNDQVJERURfVVBMT0FEX1BSRUZJWH0ke3RoaXMubmV4dERpc2NhcmRlZFVwbG9hZCsrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRlZFVwbG9hZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgb2Zmc2V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5oYXMoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLmRhdGEsIGNvbmZpZy5vZmZzZXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBkaXNrLCBzb3VyY2VJbmRleCB9ID0gdGhpcy5nZXREaXNrU291cmNlKCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KSAtIGEgbmV3ZXIgdmFsdWUgY2FuIGxhbmQgd2hpbGUgYSBsb25nIHVwbG9hZCBpcyBzdGlsbCBzdHJlYW1pbmcsIHNvIHRoaXMgaXMgcmUtY2hlY2tlZCBoZXJlIHJhdGhlciB0aGFuIG9ubHkgYXQgdGhlIHN0YXJ0XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShjb25maWcucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRpc2suZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcucGF0aCwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGxldCBpbmZvID0gYXdhaXQgZGlzay5nZXRJbmZvKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShjb25maWcucGF0aCwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBJbnRlcm5hbHNcblxuICAgIC8qKiBCeXRlcyBvZiByZWFkIGNhY2hlIHRoZSBkaXNrIG1heSBob2xkOyBzZWUgQ29tbW9uQ29uZmlnLnJlYWRlckRpc2tMaW1pdCAoU3RvcmVTeW5jIGVuZm9yY2VzIGl0KS4gUmVhZCBmcm9tIHRoZSBjb25maWcgaW4gZWZmZWN0LCBzbyByYWlzaW5nIG9yIHJlbW92aW5nIHRoZSBsaW1pdCB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZpY3Rpb24gcGFzcy4gKi9cbiAgICBwdWJsaWMgZ2V0IHJlYWRlckRpc2tMaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZUNvbmZpZy5jdXJyZW50KCkucmVhZGVyRGlza0xpbWl0O1xuICAgIH1cblxuICAgIC8qKiBUaGUgd3JpdGUgdGltZSBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdCwgb3IgMCB3aGVuIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgdGhlIGtleS4gQ291bnRzIERFTEVUSU9OUyB0b286IGEgd3JpdGUgb2xkZXIgdGhhbiB0aGUgZGVsZXRpb24gdGhhdCByZW1vdmVkIGl0IG11c3Qgbm90IGJyaW5nIGl0IGJhY2suIFRoZSBpbmRleCBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gZm9yIGEgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gYSBkZWxheWVkIHNvdXJjZSwgc2luY2UgdGhlIGVudHJ5IGlzIHJlY29yZGVkIHdoZW4gdGhlIHdyaXRlIGlzIGFjY2VwdGVkIHJhdGhlciB0aGFuIHdoZW4gaXQgcmVhY2hlcyBzdG9yYWdlLiAqL1xuICAgIHB1YmxpYyBjdXJyZW50V3JpdGVUaW1lKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgudGltZU9mKGtleSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xpdmUoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmlzTGl2ZShzb3VyY2VJbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyU2xvdChzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIGxldCByZWdpc3RyYXRpb24gPSB0aGlzLnNvdXJjZXNMaXN0LmVuc3VyZSh0aGlzLnNvdXJjZXNbc2xvdF0udXJsKS50aGVuKGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XSA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XSA9IHJlZ2lzdHJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgICB9XG5cbiAgICAvKiogVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzbG90IG5ldmVyIGdvdCB0aGF0IGZhciAoYSBzb3VyY2UgcmVtb3ZlZCBiZWZvcmUgaXRzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCkuICovXG4gICAgcHVibGljIHNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3Q6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgfVxuXG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QgLSBvbmx5IHZhbGlkIG9uY2UgdGhlIHNsb3QncyByZWdpc3RyYXRpb24gcmVzb2x2ZWQgKGluaXQgYW5kIHRoZSBzb3VyY2UncyBzeW5jIGxvb3AgZ3VhcmFudGVlIHRoYXQgYmVmb3JlIGFueSBpbmRleGluZyBoYXBwZW5zKVxuICAgIHB1YmxpYyBzb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNsb3Q6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHNsb3QgJHtzbG90fSAoJHt0aGlzLnNvdXJjZXNbc2xvdF0/LnVybH0pIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZXNMaXN0SW5kZXggeWV0IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxpdmUgc2xvdCBjdXJyZW50bHkgc2VydmluZyBhIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY29uZmlndXJlZCBzb3VyY2UgaGFzIHRoYXQgVVJMIGFueW1vcmUuIExpbmVhciwgYnV0IHRoZSBzb3VyY2VzIGxpc3QgaXMgdGlueSBhbmQgdGhpcyBpcyBhbHdheXMgY3VycmVudCAoc2xvdHMgZHlpbmcsIG9yIHNldmVyYWwgc2xvdHMgc2hhcmluZyBvbmUgVVJMIGFjcm9zcyB2YWxpZCB3aW5kb3dzLCBuZWVkIG5vIGJvb2trZWVwaW5nKS5cbiAgICBwdWJsaWMgc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbaV0gPT09IHNvdXJjZXNMaXN0SW5kZXggJiYgdGhpcy5pc0xpdmUoaSkpIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIElBcmNoaXZlcyBjdXJyZW50bHkgaG9sZGluZyBhbiBlbnRyeSdzIGJ5dGVzOiB0aGUgbGl2ZSBzbG90IHdoZW4gdGhlIGhvbGRlciBpcyBzdGlsbCBjb25maWd1cmVkLCBvdGhlcndpc2UgcmVzb2x2ZWQgKGNhY2hlZCkgc3RyYWlnaHQgZnJvbSBpdHMgcGVyc2lzdGVkIFVSTCAtIHdpbmRvd3Mvcm91dGVzIGRlY2lkZSB3aGVuIGEgc291cmNlIGlzIHNjYW5uZWQgb3Igd3JpdHRlbiwgYnV0IGZvciByZWFkaW5nIGJ5dGVzIHdlIGtub3cgaXQgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoXG4gICAgcHVibGljIGFzeW5jIGdldEVudHJ5SG9sZGVyKGVudHJ5OiBJbmRleEVudHJ5KTogUHJvbWlzZTxJQXJjaGl2ZXMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpIHx8IGF3YWl0IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsUmVsb2FkaW5nKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5yZXNvbHZlU291cmNlVXJsPy4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5sb2FkKCk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgU3RvcmVTeW5jJ3Mgc2NhbiBoYW5kbGluZyksIGFuZCBhIGxvYWRlZCBidWNrZXQgYWx3YXlzIGhhcyBpdCB0aGVyZSAtIGEgcGVyc2lzdGVkIGVudHJ5IHBvaW50aW5nIGVsc2V3aGVyZSBpcyBzdGFsZSwgc28gaXQgaXMgY29ycmVjdGVkIG9uY2UsIGhlcmVcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmdldEluZGV4RW50cnkoUk9VVElOR19GSUxFKTtcbiAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICBpZiAocm91dGluZyAmJiByb3V0aW5nLnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoUk9VVElOR19GSUxFLCB7IHdyaXRlVGltZTogcm91dGluZy53cml0ZVRpbWUsIHNpemU6IHJvdXRpbmcuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogYmFzZVNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIHdlIGhvbGQuIEEgZGVsZXRlZCBvbmUgaXMgbm90IG9uZTogaXQgaXMgYSB0b21ic3RvbmUsIGFuZCBvbmx5IGdldERlbGV0ZWRFbnRyeSBrbm93cyBhYm91dCBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmluZGV4LmdldChrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBXaGVuIGEga2V5IHdhcyBkZWxldGVkLCBpZiBpdCB3YXMuIEEgZGVsZXRpb24gaXMgYW4gYWJzZW5jZSB3aXRoIGEgdGltZSBhdHRhY2hlZCAtIHRoYXQgdGltZSBpcyB3aGF0IG1ha2VzIGl0IHByb3BhZ2F0ZSBhbmQgd2hhdCBleHBpcmVzIGl0LiAqL1xuICAgIHB1YmxpYyBnZXREZWxldGVkRW50cnkoa2V5OiBzdHJpbmcpOiB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuaW5kZXguZ2V0RGVsZXRlZChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgd2UgaG9sZCwgZm9yIHRoZSBwYXNzZXMgdGhhdCB3YWxrIHRoZW0gYWxsIChsaXN0aW5ncywgc2NhbnMsIHJlY29uY2lsaWF0aW9uLCBldmljdGlvbikuIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgLSBzZWUgZGVsZXRlZEVudHJpZXMuIExpdmU6IGRlbGV0aW5nIGVudHJpZXMgd2hpbGUgaXRlcmF0aW5nIGlzIGV4cGVjdGVkIGhlcmUsIGFuZCBzYWZlLiAqL1xuICAgIHB1YmxpYyAqaW5kZXhFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgSW5kZXhFbnRyeV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXguZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGRlbGV0aW9uIHdlIGtub3cgb2YuIEEgbXVjaCBzbWFsbGVyIHdhbGsgdGhhbiB0aGUgZmlsZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXMgZXhwaXJpbmcgdGhlbSBjaGVhcC4gKi9cbiAgICBwdWJsaWMgKmRlbGV0ZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGZpbGVzIHdlIGhvbGQsIGRlbGV0aW9ucyBleGNsdWRlZC4gKi9cbiAgICBwdWJsaWMgaW5kZXhTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnNpemU7XG4gICAgfVxuXG4gICAgLyoqIFRvdGFscyBvdmVyIHRoZSBmaWxlcyB3ZSBob2xkLCBicm9rZW4gZG93biBieSB0aGUgc2xvdCBob2xkaW5nIGVhY2ggKGVudHJpZXMgY2FuIG5hbWUgYSBzb3VyY2UgdGhhdCBpcyBubyBsb25nZXIgY29uZmlndXJlZCwgd2hpY2ggY291bnRzIHRvd2FyZHMgdGhlIHRvdGFsIGJ1dCBubyBzbG90KS4gKi9cbiAgICBwdWJsaWMgaW5kZXhUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNsb3RzOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB7XG4gICAgICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IHNsb3RzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAoeyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5maWxlQ291bnQrKztcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzbG90cyB9O1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgZmlsZSwgYXMgb2YgaXRzIHdyaXRlIHRpbWUuIFJldHVybnMgZmFsc2UsIGhhdmluZyBjaGFuZ2VkIG5vdGhpbmcsIHdoZW4gd2UgYWxyZWFkeSBrbm93IHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgLSB0aGUgaW5kZXggY2Fubm90IGJlIG1hZGUgdG8gZ28gYmFja3dhcmRzLCB3aGljaGV2ZXIgcGF0aCB0aGUgd3JpdGUgY2FtZSBpbiBieS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZywgZW50cnk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgc291cmNlc0xpc3RJbmRleDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnNldChrZXksIHsgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogZW50cnkuc291cmNlc0xpc3RJbmRleCB9LCBlbnRyeS53cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBsYW5kaW5nIGhlcmUgLSB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yLCBvciBwdWxsZWQgb2ZmIGEgcGVlciBieSBzeW5jaHJvbml6YXRpb24gLSBpcyBob3cgdGhpcyBzdG9yZSBsZWFybnMgd2hhdCBpdCBpcyBtZWFudCB0byBiZVxuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgREVMRVRJT04sIGFzIG9mIGl0cyB0aW1lOiB0aGUga2V5IHN0b3BzIGV4aXN0aW5nIGhlcmUsIGFuZCB0aGUgdG9tYnN0b25lIGlzIHdoYXQgbWFrZXMgdGhhdCBmYWN0IHByb3BhZ2F0ZSBhbmQgcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLiBTYW1lIG9yZGVyaW5nIHJ1bGUgYXMgc2V0SW5kZXhFbnRyeS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhEZWxldGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguZGVsZXRlKGtleSwgd3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRm9yZ2V0cyBhIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkLiBOT1QgYSBkZWxldGlvbjogaXQgc2F5cyBub3RoaW5nIGhhcHBlbmVkIHRvIHRoZSBmaWxlLCBvbmx5IHRoYXQgd2Ugbm8gbG9uZ2VyIGtub3cgYW55dGhpbmcgYWJvdXQgaXQgLSBmb3IgYW4gZW50cnkgd2hvc2UgaG9sZGVyIHR1cm5lZCBvdXQgbm90IHRvIGhhdmUgaXQsIGFuZCBmb3IgYSB0b21ic3RvbmUgb2xkIGVub3VnaCB0aGF0IGV2ZXJ5b25lIGhhcyBoZWFyZC4gKi9cbiAgICBwdWJsaWMgcHVyZ2VJbmRleEVudHJ5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5kZXgucHVyZ2Uoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogQ291bnRzIGEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyIGluIHRoZSBzZXJ2ZXIncyBhY2Nlc3Mgc3RhdGlzdGljcyAoc2VlIGdldFN0b3JlJ3Mgd2lyaW5nKTogXCJzeW5jIGdldFwiIGZvciBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlLCBcInN5bmMgc2V0XCIgZm9yIGJ5dGVzIHB1c2hlZCB0byBvbmUuICovXG4gICAgcHVibGljIG5vdGVTeW5jVHJhbnNmZXIob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25TeW5jVHJhbnNmZXI/LihvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH0gRGF0YSB3cml0dGVuIHRvIGEgc3RvcmUgd2l0aCBubyBjb25maWd1cmF0aW9uIGVudHJ5IHdvdWxkIG5ldmVyIGJlIHNjYW5uZWQgb3IgcmVjb25jaWxlZCwgc28gYWNjZXB0aW5nIGl0IHdvdWxkIHNpbGVudGx5IGxvc2UgaXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5IC0gb3IsIGlmIHRoaXMgc3RvcmUgaXMgZ2VudWluZWx5IG1lYW50IHRvIHRha2UgdGhpcyB3cml0ZSwgd3JpdGUgdGhlIGJ1Y2tldCdzIHJvdXRpbmcgY29uZmlnIHdpdGggYW4gZW50cnkgbmFtaW5nIGl0IG9uIHRoaXMgc2VydmVyLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5LCBEYXRlLm5vdygpLCByb3V0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzdGFtcGVkIHdyaXRlIHBpY2tlZCBpdHMgb3duIHRpbWUsIHNvIG5vIHdpbmRvdyBjYW4ganVkZ2UgaXQgKHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIGEgc3luY2hyb25pemVkIHdyaXRlKSAtIGJ1dCB0aGUgUk9VVEUgaXMgbm90IGEgbWF0dGVyIG9mIHRpbWluZywgYW5kIGEgc3RhbXBlZCB3cml0ZSB0byB0aGUgd3Jvbmcgc2hhcmQgaXMgZXhhY3RseSBhcyBpbnZpc2libGUgYXMgYSBmcmVzaCBvbmVcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkgcmV0dXJuO1xuICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHN0YW1wZWQgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHJvdXRlIHdlIHNlcnZlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc3RvcmUgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHJvdXRpbmcpO1xuICAgICAgICBsZXQgaW5jb21pbmcgPSBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucm91dGluZ1ZlcnNpb24oKTtcbiAgICAgICAgaWYgKGluY29taW5nID49IGN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byB3cml0ZSAke1JPVVRJTkdfRklMRX0gdG8gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0cyB2ZXJzaW9uICgke2luY29taW5nfSkgaXMgb2xkZXIgdGhhbiB0aGUgb25lIHRoaXMgc3RvcmUgaXMgcnVubmluZyAoJHtjdXJyZW50fSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuYCk7XG4gICAgfVxuXG4gICAgLy8gQSBmcmVzaCAodW5zdGFtcGVkKSB3cml0ZSBtdXN0IGxhbmQgb24gdGhlIG5vZGUgdGhlIGNvbmZpZyBjdXJyZW50bHkgcG9pbnRzIGF0OiB0aGUgbWFya2VycyB0ZWxsIHRoZSBjbGllbnQgaXRzIGNvbmZpZyBpcyBzdGFsZSwgc28gaXQgcmUtcmVzb2x2ZXMgYW5kIHJldHJpZXMgYWdhaW5zdCB0aGUgcmlnaHQgbm9kZSBpbnN0ZWFkIG9mIHVzIHNpbGVudGx5IGFjY2VwdGluZyBkYXRhIHdlIHdlcmUgbmV2ZXIgbWVhbnQgdG8gaG9sZC5cbiAgICBwcml2YXRlIGFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06IGl0cyB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGV2ZXJ5IHZhbGlkIHdpbmRvdyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9LCBmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIC0gYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzdG9yZSBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhc3NlcnRNdXRhYmxlKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgc3RvcmUgaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IHJlamVjdGVkOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGF0IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgd2luZG93L3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSByZWFkOiBwdXJlbHkgdGhlIGxvY2FsIGRpc2ssIGNvbXBsZXRlbHkgc2hvcnQtY2lyY3VpdGluZyB0aGUgaW5kZXggYW5kIGhvbGRlciByZXNvbHV0aW9uIC0gdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlLCBhbmQgY2hhc2luZyBPVVIgcmVtb3RlIGhvbGRlcnMgd2hpbGUgYW5zd2VyaW5nIGl0IGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gTm8gd2luZG93IG9yIHJvdXRlIGNoZWNrczogaWYgdGhlIGJ5dGVzIGFyZSBvbiBvdXIgZGlzaywgdGhlIGNhbGxlciBtYXkgaGF2ZSB0aGVtLiBOb3RlIHRoaXMgcmVhZHMgdGhlIGRpc2sgcGFzdCBhbnkgd3JpdGUgZGVsYXksIHNvIGEgZmFzdCB3cml0ZSBzdGlsbCBidWZmZXJlZCBpbiBtZW1vcnkgaXMgaW52aXNpYmxlIGhlcmU7IHRoZSBjYWxsZXIgcmUtZmluZHMgaXQgb25jZSBpdCBmbHVzaGVzLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW50ZXJuYWwyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXMgZm9yd2FyZHMgdG8gdGhlIGRpc2s6IGEgZmxhZy1jYWxsZXIgKGEgcGVlciBzdG9yZSdzIHN5bmNocm9uaXphdGlvbikgbmVlZHMgdG8gc2VlIG91ciBkZWxldGlvbnMsIG5vdCBqdXN0IG91ciBjb250ZW50LiBBIHRvbWJzdG9uZSBkZWxldGVkIGZyb20gZGlzayBlbnRpcmVseSBvbmx5IGxpdmVzIGluIG91ciBpbmRleCwgc28gZmFsbCBiYWNrIHRvIHRoYXQuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmdldDIoY29uZmlnLnBhdGgsIHsgcmFuZ2U6IGNvbmZpZy5yYW5nZSwgaW5jbHVkZVRvbWJzdG9uZXM6IGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcyB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShjb25maWcucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9O1xuICAgIH1cblxuICAgIC8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHdyaXRlOiB0aGUgbG9jYWwgZGlzayBwbHVzIG91ciBpbmRleCwgd2l0aCBOTyBkb3duc3RyZWFtIGZhbi1vdXQgLSB0aGUgcHVzaGluZyBzdG9yZSBvd25zIHByb3BhZ2F0aW9uLCBhbmQgZmFubmluZyBpdHMgcHVzaGVzIGJhY2sgb3V0IGlzIGhvdyB3cml0ZSBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtLiBPbmx5LXRha2UtbGF0ZXN0IHN0aWxsIGFwcGxpZXMgaGVyZS4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHNldEludGVybmFsKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gc3RvcmVzIG5vdGhpbmcgb24gb3VyIG93biBzb3VyY2UgLSB0aGUgdG9tYnN0b25lIGlzIHRoZSB3aG9sZSBvZiBpdFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2hhcmVkIGVuZ2luZSBvZiBzZXQgYW5kIGRlbDogYW4gZW1wdHkgYnVmZmVyIGlzIGV4YWN0bHkgYSBkZWxldGlvbiBoZXJlLCB3aGljaCBpcyB3aHkgdGhlIGVtcHR5LWJ1ZmZlciByZWplY3Rpb24gbGl2ZXMgaW4gc2V0ICh0aGUgcHVibGljIEFQSSksIG5vdCBpbiB0aGlzIG1hY2hpbmVyeVxuICAgIHByaXZhdGUgYXN5bmMgc2V0T3JEZWxldGUoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwib3JpZ2luYWxcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnLmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCB3cml0ZXMgYXJlIG5vdCBoYW5kbGVkIGhlcmU6IGEgc291cmNlIHRoYXQgd2FzIGNvbmZpZ3VyZWQgd2l0aCBhIHdyaXRlIGRlbGF5IGJ1ZmZlcnMgdGhlbSBpdHNlbGYgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpLCBzbyB0aGlzIHdyaXRlIGxhbmRzIGluIG1lbW9yeSBhbmQgcmV0dXJucywgZXhhY3RseSBhcyBpdCB3b3VsZCBoYXZlLiBUaGUgaW5kZXggaXMgdXBkYXRlZCBlaXRoZXIgd2F5LCBzbyB0aGUgd3JpdGUgaXMgaW1tZWRpYXRlbHkgdmlzaWJsZSB0byByZWFkZXJzIG9mIHRoaXMgc3RvcmUuXG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCBsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbnN0YW50IGV2ZXJ5IGRlbGF5ZWQgd3JpdGUgbXVzdCBiZSBvbiBpdHMgc291cmNlOiB0aGUgZW5kIG9mIG91ciBvd24gd3JpdGUgd2luZG93IHRoYXQgY29udGFpbnMgbm93LCBtaW51cyB0aGUgZmx1c2ggbWFyZ2luIChzbyB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgZmluZHMgdGhlIGRhdGEgb24gaGFuZG9mZikuIFRoZSBMQVRFU1QgZW5kIGFtb25nIGNvdmVyaW5nIHdpbmRvd3MgLSBvdmVybGFwcGluZyB3aW5kb3dzIGhhbmQgb2ZmIGF0IHRoZSBsYXN0IG9uZS4gTm8gd2luZG93IGNvbnRhaW5zIG5vdyAoYW4gaW5lcnQgc3RvcmUsIG9yIGEgbW9tZW50IGJldHdlZW4gb3VyIHdpbmRvd3MpIC0+IDAsIGkuZS4gbm90aGluZyBtYXkgYmUgZGVsYXllZCBhdCBhbGwuICovXG4gICAgcHVibGljIHdyaXRlRmx1c2hEZWFkbGluZSgpOiBudW1iZXIge1xuICAgICAgICAvLyBCZWZvcmUgdXBkYXRlU291cmNlcyBoYXMgcnVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gaG9sZCBhIHdyaXRlIGFueXdheSwgYW5kIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWRcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXMubGVuZ3RoKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd3MpIHtcbiAgICAgICAgICAgIGlmICh3WzBdIDw9IG5vdyAmJiBub3cgPCB3WzFdKSBlbmQgPSBNYXRoLm1heChlbmQsIHdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5kKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGVuZCAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JpdGFibGVTb3VyY2VzKGNvbmZpZz86IHsgaWdub3JlV2luZG93PzogYm9vbGVhbiB9KTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgd3JpdGFibGU6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd3NBY2NlcHRXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgd3JpdGFibGUucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGFibGU7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBzb3VyY2UgKHRoZSBmaXJzdCB3cml0YWJsZSBvbmUpIHBsdXMgZXZlcnkgcm91dGUtbWF0Y2hpbmcgcGVlci4gRWFjaCBzb3VyY2UgZGVjaWRlcyBmb3IgaXRzZWxmIGhvdyBsb25nIGl0IGhvbGRzIHRoZSB3cml0ZSBiZWZvcmUgaXQgaGl0cyBzdG9yYWdlIChzZWUgQXJjaGl2ZXNEZWxheWVkKSAtIGhlcmUgdGhleSBhbGwganVzdCBnZXQgd3JpdHRlbi5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlczogdGhlIHdyaXRlciB3cml0ZXMgaXQgZGlyZWN0bHkgdG8gZWFjaCBub2RlLCBzbyB3ZSBzdG9yZSBpdCBvbiBvdXIgb3duIGRpc2sgb25seSAobm8gdmFsaWQtd2luZG93IGZpbHRlciAtIHJvdXRpbmcvdmFsaWQgd2luZG93cyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGVtKSBhbmQgbmV2ZXIgZm9yd2FyZCBpdCB0byBvdGhlciBzb3VyY2VzLlxuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcImZsdXNoZWRcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgaXNSb3V0aW5nID0ga2V5ID09PSBST1VUSU5HX0ZJTEU7XG4gICAgICAgIGxldCB3cml0YWJsZSA9IHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKHsgaWdub3JlV2luZG93OiBpc1JvdXRpbmcgfSk7XG4gICAgICAgIGxldCBmaXJzdCA9IHdyaXRhYmxlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyAoZXZlcnkgc291cmNlJ3MgdmFsaWQgd2luZG93IGlzIGluIHRoZSBwYXN0KSwgc28gd3JpdGVzIGNhbm5vdCBiZSBzdG9yZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgb3VyIG93biAoZmlyc3QpIHNvdXJjZSBibG9ja3MgdGhlIHdyaXRlLiBEb3duc3RyZWFtIHNvdXJjZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGJhY2tncm91bmQ6IGEgZG93biBkb3duc3RyZWFtIHNvdXJjZSBtdXN0IG5vdCBmYWlsIG9yIHN0YWxsIHdyaXRlcywgYW5kIHJlY29uY2lsaWF0aW9uIHJlLXNlbmRzIGFueXRoaW5nIHRoZXkgbWlzc2VkIG9uY2UgdGhleSBjb21lIGJhY2suXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSB0b21ic3RvbmUgaXMgdGhlIHdob2xlIG9mIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoZmlyc3QpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JvdXRpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3QgMCBpcyBhbHdheXMgdGhpcyBzdG9yZSdzIG93biBmb2xkZXIgKHNlZSBwbGFuU291cmNlcyksIHNvIHRoZSBkaXNrIGlzIGtub3duIHdpdGhvdXQgc2VhcmNoaW5nIGZvciBpdCAtIGFuZCBpdCBpcyB0aGUgdW53cmFwcGVkIG9uZSwgcGFzdCBhbnkgd3JpdGUgZGVsYXlcbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7IGRpc2s6IHRoaXMub3duRGlzaywgc291cmNlSW5kZXg6IDAgfTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgc3RpbGwgaGVsZCBieSBhIGRlbGF5ZWQgc291cmNlIChzZWUgQXJjaGl2ZXNEZWxheWVkKS4gZm9yY2UgYWxzbyB3cml0ZXMgd2hhdCBpc24ndCBkdWUgeWV0IC0gc2h1dGRvd24gY2Fubm90IGxlYXZlIHdyaXRlcyBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaERlbGF5ZWRXcml0ZXMoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IHsgc291cmNlIH0gb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgZGVsYXllZCA9IGFzRGVsYXllZChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFkZWxheWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5ZWQuZmx1c2goZm9yY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxufVxuIl19
965
- /* _JS_SOURCE_HASH = "5e08ba66757017889354fcb9c2a4da5e2402a477be4bdc0fb70383049adbfcfe"; */
1074
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQUM3QywyR0FBMkc7QUFDM0csTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU5QyxvTUFBb007QUFDdkwsUUFBQSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLG1LQUFtSztBQUM1SixLQUFLLFVBQVUsZ0JBQWdCO0lBQ2xDLE9BQU8sY0FBYyxDQUFDO0FBQzFCLENBQUM7QUFGRCw0Q0FFQztBQW9DRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixTQUFTLHVCQUF1QixDQUFDLE9BQWU7SUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLEdBQUcseUJBQXlCO1FBQUUsT0FBTztJQUN4RSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxP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QyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkksQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztnQkFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxtQkFBbUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFlBQVksTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hJLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxnS0FBZ0s7SUFDeEosYUFBYTtRQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCw2SkFBNko7SUFDckosS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWU7UUFDNUMsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxHQUFHLElBQUEsMkJBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTztnQkFBRSxTQUFTO1lBQ3ZCLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztDQUdKO0FBL2hDRCw4QkEraENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25GaWxlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uRmlsZVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuLy8gc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGFuIHVuZGVsZXRlIGNhcnJpZXMgbm8gZGF0YSAtIHRoaXMgc2luZ2xlIGlnbm9yZWQgYnl0ZSBzYXRpc2ZpZXMgdGhlIHdpcmVcbmNvbnN0IFVOREVMRVRFX1BMQUNFSE9MREVSID0gQnVmZmVyLmZyb20oWzFdKTtcblxuLy8gRGVsZXRpb24gaGlzdG9yeTogZGVsZXRlZCBmaWxlcyBrZWVwIHRoZWlyIGJ5dGVzIG9uIGRpc2sgKG1hcmtlZCBpbiB0aGUgaW5kZXgpIHVudGlsIHRoZSBoaXN0b3J5IG91dGdyb3dzIG1heChISVNUT1JZX01JTl9CWVRFUywgbGl2ZSBieXRlcyAqIGhpc3RvcnkgZmFjdG9yKSAtIHNlZSBTdG9yZVN5bmMuZW5mb3JjZUhpc3RvcnlMaW1pdFxuZXhwb3J0IGNvbnN0IEhJU1RPUllfTUlOX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBISVNUT1JZX0ZBQ1RPUiA9IDE7XG4vKiogVGhlIG11bHRpcGxlIG9mIGEgc3RvcmUncyBsaXZlIGJ5dGVzIGl0cyBkZWxldGlvbiBoaXN0b3J5IG1heSBncm93IHRvLiBBc3luYyBzbyBpdCBjYW4gbGF0ZXIgYmVjb21lIGR5bmFtaWMgYW5kIHVzZXItY29uZmlndXJhYmxlOyBmb3Igbm93IGl0IGlzIGEgY29uc3RhbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGlzdG9yeUZhY3RvcigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBISVNUT1JZX0ZBQ1RPUjtcbn1cblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuXG4vLyBUaGUgYnVja2V0IHN0b3JlLCBhbmQgdGhlIG9ubHkgb25lOiBldmVyeSBidWNrZXQgYSBzZXJ2ZXIgaG9sZHMgaXMgc2VydmVkIGJ5IHRoZXNlLCBvbmUgcGVyIHN0b3JlIG5hbWUgaW4gaXRzIHJvdXRpbmcgY29uZmlnLiBJdHMgc291cmNlcyBhcmUgcGxhaW4gSUFyY2hpdmVzIC0gdGhlIGZpcnN0IGlzIGFsd2F5cyB0aGUgc3RvcmUncyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgY29uZmlndXJlZCBwZWVycyAoc2VlIGNyZWF0ZVN0b3JlU291cmNlKSAtIHNvIFwibm8gc3luY2hyb25pemF0aW9uXCIgaXMgc2ltcGx5IGEgc3RvcmUgd2l0aCBubyBwZWVycywgbm90IGEgZGlmZmVyZW50IGtpbmQgb2Ygc3RvcmUuXG5leHBvcnQgY2xhc3MgQmxvYlN0b3JlIHtcbiAgICAvLyDilIDilIAgc3RhdGUg4pSA4pSAXG4gICAgLy8gU2V0IG9uY2UgdGhlIHN0b3JlIGlzIHNodXR0aW5nIGRvd247IGV2ZXJ5IGxvb3AgaXQgb3ducyAoYW5kIFN0b3JlU3luYydzIG1haW50ZW5hbmNlIGxvb3BzKSBzdG9wcyBvbiBpdFxuICAgIHB1YmxpYyBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuICAgIC8vIFdoZXRoZXIgaW5pdCBoYXMgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgYSBuZXdseSBhZGRlZCBzb3VyY2UgY2FuIHN0YXJ0IHNjYW5uaW5nIGltbWVkaWF0ZWx5XG4gICAgcHVibGljIHN5bmNTdGFydGVkID0gZmFsc2U7XG4gICAgLyoqIEl0cyBzb3VyY2VzLCBpbiBjb25maWcgb3JkZXI6IHNsb3QgMCBpcyBhbHdheXMgaXRzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBwZWVycyBpdCBzeW5jaHJvbml6ZXMgd2l0aC4gRmlsbGVkIGJ5IHVwZGF0ZVNvdXJjZXMsIHdoaWNoIGlzIGFsc28gaG93IHRoZXkgY2hhbmdlLiBUaGUgc3RvcmUgT1dOUyB0aGVtIC0gd3JpdGVzIHBpY2sgYW1vbmcgdGhlbSwgcmVhZHMgcmVzb2x2ZSBob2xkZXJzIHRocm91Z2ggdGhlbSAtIGFuZCBTdG9yZVN5bmMgb25seSBzY2FucyB3aGF0ZXZlciBpcyBpbiBoZXJlIGF0IHRoZSB0aW1lLiAqL1xuICAgIHB1YmxpYyBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW107XG4gICAgLy8gVXBsb2FkcyBpbW11dGFiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGFnYWluc3Q6IHRoZSBjbGllbnQgaXMgbWlkLXN0cmVhbSBieSB0aGUgdGltZSB3ZSBrbm93LCBzbyBpdCBrZWVwcyBzZW5kaW5nIGFuZCBldmVyeSBwYXJ0IGlzIGRyb3BwZWRcbiAgICBwcml2YXRlIGRpc2NhcmRlZFVwbG9hZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIG5leHREaXNjYXJkZWRVcGxvYWQgPSAxO1xuICAgIC8vIFRoZSBwZXJzaXN0ZW50IGlkZW50aXRpZXMgYmVoaW5kIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCAoc2VlIFNvdXJjZXNMaXN0KVxuICAgIHByaXZhdGUgc291cmNlc0xpc3Q6IFNvdXJjZXNMaXN0O1xuICAgIC8vIFBlciBzbG90OiB0aGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIHRoYXQgc2xvdCdzIFVSTCwgZmlsbGVkIGJ5IHJlZ2lzdGVyU2xvdCBiZWZvcmUgdGhlIHNsb3QncyBzeW5jIHJ1bnNcbiAgICBwcml2YXRlIHNsb3RTb3VyY2VzTGlzdEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSBzbG90UmVnaXN0cmF0aW9uczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgLy8gRXZlcnkgZmlsZSB3ZSBrbm93IG9mLCBpbiBtZW1vcnksIHdpdGggYW4gYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBjaGFuZ2VzIGJlaGluZCBpdCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuIEEgbmV3IGZpbGUgbmFtZSBlYWNoIHRpbWUgdGhlIGVudHJ5IGZvcm1hdCBjaGFuZ2VzIGdlbmVyYXRpb246IHRoZSBwcmV2aW91cyBvbmVzIGNhbm5vdCBiZSByZWFkLCBhbmQgYSBzY2FuIHJlYnVpbGRzIHRoZSBpbmRleCBhbnl3YXksIHNvIHRoZXkgYXJlIHNpbXBseSBuZXZlciByZWFkIGFnYWluLlxuICAgIHByaXZhdGUgaW5kZXg6IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPjtcbiAgICAvKiogS2VlcGluZyB0aGUgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXM6IHNjYW5uaW5nLCBwdWxsaW5nLCBwdXNoaW5nLCBhbmQgdGhlIG1haW50ZW5hbmNlIHRoYXQgZm9sbG93cyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGRpc2stbGltaXQgZXZpY3Rpb24sIHRvbWJzdG9uZSBleHBpcnkpLiBJdCByZWFkcyBhbmQgd3JpdGVzIHRoaXMgc3RvcmUncyBpbmRleCBhbmQgc291cmNlcyAtIGl0IGRvZXMgbm90IG93biB0aGVtLiAqL1xuICAgIHB1YmxpYyBzeW5jOiBTdG9yZVN5bmM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gUHVibGljIGZvciBTdG9yZVN5bmMsIHdoaWNoIGxvZ3MgaXQgd2l0aCBldmVyeXRoaW5nIGl0IGRvZXNcbiAgICAgICAgcHVibGljIGZvbGRlcjogc3RyaW5nLFxuICAgICAgICAvKiogVGhlIG5hbWUgdGhpcyBzdG9yZSBhbnN3ZXJzIHRvIChzZWUgQ29tbW9uQ29uZmlnLm5hbWUpIC0gdGhlIGVudHJpZXMgb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoYXQgY2FycnkgaXQgYXJlIHRoZSBvbmVzIHRoYXQgY29uZmlndXJlIGl0LCBhbmQgdGhlIHJlc3QgYXJlIGl0cyBwZWVycy4gKi9cbiAgICAgICAgcHVibGljIHN0b3JlTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8qKiBXaGV0aGVyIGEgY29uZmlnIGVudHJ5IGlzIFRISVMgU0VSVkVSIChzYW1lIGFjY291bnQsIHNhbWUgYnVja2V0LCBvdXIgb3duIGFkZHJlc3MpLiBJbmplY3RlZCBiZWNhdXNlIGEgc3RvcmUga25vd3Mgbm90aGluZyBhYm91dCBzZXJ2ZXJzIC0gaXQgb25seSBuZWVkcyB0byB0ZWxsIGl0cyBvd24gZW50cmllcyBhcGFydCBmcm9tIGl0cyBwZWVycycuIEFic2VudCBtZWFucyBub3RoaW5nIGlzIHVzLCB3aGljaCBpcyB3aGF0IGEgYmFyZSBzdG9yZSAobm8gc2VydmVyIGFyb3VuZCBpdCkgd2FudHMuICovXG4gICAgICAgICAgICBpc1NlbGY/OiAoc291cmNlOiBTb3VyY2VDb25maWcpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAvKiogQnVpbGRzIG9uZSBvZiBpdHMgc291cmNlcy4gSW5qZWN0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiwgYW5kIGJlY2F1c2UgdGhlIGRlbGF5IGl0IGlzIGNyZWF0ZWQgd2l0aCBpcyB0aGlzIHN0b3JlJ3MgcG9saWN5LiAqL1xuICAgICAgICAgICAgY3JlYXRlU291cmNlPzogKGNvbmZpZzogeyBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7IHdyaXRlRGVsYXk6IG51bWJlciB9KSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgICAgICAvKiogSGFuZHMgYSBydW5uaW5nIHNvdXJjZSBhIGNoYW5nZWQgY29uZmlnLCBzbyBhbiBlbmRwb2ludCB3ZSBhbHJlYWR5IHRhbGsgdG8gaXMgbmV2ZXIgcmVidWlsdCBqdXN0IGJlY2F1c2UgYSBmbGFnIG1vdmVkLiAqL1xuICAgICAgICAgICAgYXBwbHlTb3VyY2U/OiAoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb24pIOKAlCBob3cgdGhlIHN0b3JhZ2Ugc2VydmVyIG5vdGljZXMgcm91dGluZyBjb25maWcgdXBkYXRlcy5cbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkPzogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIENhbGxlZCBldmVyeSB0aW1lIHRoaXMgc3RvcmUgYXBwbGllcyBhIHJvdXRpbmcgY29uZmlnIHRvIGl0c2VsZiAoc3RhcnR1cCwgYW4gb3BlcmF0b3IncyB3cml0ZSwgYSBwZWVyJ3MgY29weSBhcnJpdmluZykgLSB0aGUgc3RvcmUgaXMgdGhlIG9uZSB0aGF0IGtub3dzIHdoZW4gYSBjb25maWcgbGFuZGVkLCBhbmQgdGhlIHNlcnZlciBhcm1zIHdpbmRvdy1ib3VuZGFyeSBzY2FucyBmcm9tIGl0LiAqL1xuICAgICAgICAgICAgb25Sb3V0aW5nQXBwbGllZD86IChyb3V0aW5nOiBSZW1vdGVDb25maWcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQXNrcyB0aGUgY2xpZW50IHdob3NlIHJlcXVlc3QgY3JlYXRlZCB0aGlzIHN0b3JlIHdoYXQgcm91dGluZyBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLiBPbmx5IHVzZWQgd2hlbiBpbml0IGZpbmRzIE5PIGNvbmZpZ3VyYXRpb24gaW4gb3VyIGZvbGRlcjogYSBzdG9yZSBvbmx5IGV2ZXIgZXhpc3RzIGJlY2F1c2UgYSBjb25maWcgbmFtZXMgaXQsIHNvIHRoZSByZXF1ZXN0ZXIgaGFzIHRoYXQgY29uZmlnIC0gYXNraW5nIGZvciBpdCBsYXppbHkgaXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgcGFzc2luZyB0aGUgY29uZmlnIG9uIGV2ZXJ5IGNhbGwsIHdpdGhvdXQgdGhlIHBlci1jYWxsIGtpbG9ieXRlcy4gKi9cbiAgICAgICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnPzogKCkgPT4gUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgLy8gRXZlcnkgYWNjZXB0ZWQgd3JpdGUgKFwib3JpZ2luYWxcIikgYW5kIGV2ZXJ5IHdyaXRlIHRoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcyAoXCJmbHVzaGVkXCIpLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSwgc28gdGhlIHR3byBjb3VudHMgZGlmZmVyLlxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ/OiAoa2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQSBzeW5jaHJvbml6YXRpb24gdHJhbnNmZXI6IFwic3luYyBnZXRcIiBpcyBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlICh0aGUgYmFja2JsYXplIGRvd25sb2FkIGJpbGwpLCBcInN5bmMgc2V0XCIgaXMgYnl0ZXMgcHVzaGVkIHRvIG9uZS4gSW5qZWN0ZWQgYmVjYXVzZSBzeW5jIHRyYWZmaWMgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSBjb250cm9sbGVyLCBzbyBub3RoaW5nIGVsc2UgY2FuIGNvdW50IGl0LiAqL1xuICAgICAgICAgICAgb25TeW5jVHJhbnNmZXI/OiAob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJTbG90KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFmdGVyIHRoZSBzbG90cywgd2hpY2ggaXMgd2hhdCBpbmRleCBlbnRyaWVzIG5hbWUgYXMgdGhlaXIgaG9sZGVyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEluZGV4KCk7XG4gICAgICAgIHRoaXMuc3luY1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlLXJlYWRzIHRoZSByb3V0aW5nIGNvbmZpZyBvdXQgb2YgdGhpcyBzdG9yZSBhbmQgYXBwbGllcyBpdCB0byBpdHNlbGYuIENhbGxlZCBhdCBzdGFydHVwIGFuZFxuICAgICAqIHdoZW5ldmVyIHRoYXQgZmlsZSBjaGFuZ2VzIGhlcmUgLSB3aGljaCBpcyB0aGUgT05FIG1lY2hhbmlzbTogYSBjb25maWcgd3JpdHRlbiBieSBhbiBvcGVyYXRvclxuICAgICAqIGFuZCBhIGNvbmZpZyBwdWxsZWQgb2ZmIGEgcGVlciBhcmUgdGhlIHNhbWUgZXZlbnQsIGEgd3JpdGUgb2YgdGhhdCBwYXRoIGludG8gdGhpcyBzdG9yZS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgd2l0aCBubyByb3V0aW5nIGNvbmZpZyBjb25maWd1cmVzIGl0c2VsZiBhcyBpdHMgb3duIGRpc2ssIHZhbGlkIGFsd2F5cywgZm9yIHRoZSB3aG9sZVxuICAgICAqIGtleSBzcGFjZS4gVGhhdCBpcyBhIGNvbXBsZXRlLCB3b3JraW5nIHN0b3JlIC0gaXQganVzdCBoYXMgbm9ib2R5IHRvIHN5bmNocm9uaXplIHdpdGggLSBhbmQgaXRcbiAgICAgKiBpcyB3aGF0IGxldHMgYSBzdG9yZSBleGlzdCBiZWZvcmUgaXQgaGFzIGV2ZXIgaGVhcmQgb2YgYSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhcHBseVJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByb3V0aW5nID0gYXdhaXQgdGhpcy5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICBsZXQgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcbiAgICAgICAgbGV0IHBlZXJzOiBTb3VyY2VDb25maWdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygcm91dGluZz8uc291cmNlcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSAmJiB0aGlzLmNvbmZpZz8uaXNTZWxmPy4oc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChzb3VyY2UgYXMgSG9zdGVkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlZXJzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGluZyAmJiAhZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0pIGRvZXMgbm90IG5hbWUgdGhpcyBzdG9yZSAoJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9KSBhcyBvbmUgb2Ygb3Vycywgc28gaXQgc3RheXMgYSBkaXNrLW9ubHkgc3RvcmVgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJldmlvdXNWZXJzaW9uID0gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgICAgIGxldCBuZXdWZXJzaW9uID0gcm91dGluZyAmJiBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpIHx8IC0xO1xuICAgICAgICBpZiAobmV3VmVyc2lvbiAhPT0gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGFkb3B0ZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke3ByZXZpb3VzVmVyc2lvbn0gLT4gJHtuZXdWZXJzaW9ufTogJHtlbnRyaWVzLmxlbmd0aH0gZW50ciR7ZW50cmllcy5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gb2Ygb3VycyAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0sICR7cGVlcnMubGVuZ3RofSBwZWVyKHMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZy51cGRhdGUoZW50cmllcyk7XG4gICAgICAgIHRoaXMudXBkYXRlU291cmNlcyh0aGlzLnBsYW5Tb3VyY2VzKHBlZXJzKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgICAgdGhpcy5hcHBsaWVkUm91dGluZyA9IHJvdXRpbmc7XG4gICAgICAgIGlmIChyb3V0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZz8ub25Sb3V0aW5nQXBwbGllZD8uKHJvdXRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGFzIHRoaXMgc3RvcmUgaG9sZHMgaXQsIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBmb2xkZXI6IHRoZSBzdG9yZSBtYXkgYmUgY29uZmlndXJpbmcgaXRzZWxmIGJlZm9yZSBpdCBoYXMgc2Nhbm5lZCBhbnl0aGluZywgYW5kIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgd2hhdCBhIHNjYW4gd291bGQgZXZlbiB0YWxrIHRvXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMub3duRGlzay5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJZ25vcmluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0IGNvdWxkIG5vdCBiZSBwYXJzZWQgKCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBpcyBydW5uaW5nLCBzbyBhIGNvcHkgZm91bmQgb24gYSBwZWVyIGlzIG9ubHkgdGFrZW4gd2hlbiBpdCBpcyBnZW51aW5lbHkgbmV3ZXIuIC0xIG1lYW5zIGl0IGhhcyBub25lLiAqL1xuICAgIHB1YmxpYyByb3V0aW5nVmVyc2lvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQXBwbHlpbmcgaXQgdG91Y2hlcyB0aGUgc291cmNlcywgc28gaXQgaXMgc2VyaWFsaXplZCBiZWhpbmQgd2hhdGV2ZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nIHJhdGhlciB0aGFuIGludGVybGVhdmluZyB3aXRoIGl0XG4gICAgcHJpdmF0ZSByb3V0aW5nQXBwbGllczogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHB1YmxpYyByZWFwcGx5Um91dGluZ0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJvdXRpbmdBcHBsaWVzLnRoZW4oKCkgPT4gdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKSk7XG4gICAgICAgIHRoaXMucm91dGluZ0FwcGxpZXMgPSBuZXh0LmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHZvaWQgbmV4dC5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjsgaW5jbHVkZU1hcmtlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbnRlcm5hbDIoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWcucmFuZ2U7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIC8vIEEgbWFya2VkIGRlbGV0aW9uIHN0aWxsIGhhcyBpdHMgYnl0ZXMsIGFuZCB0aGUga2VwdCB2YWx1ZSBzYXlzIHdoZXJlIC0gc28gYW4gaW5jbHVkZU1hcmtlZCByZWFkIGlzIGEgbm9ybWFsIHJlYWQgdGhyb3VnaCB0aGUgbWFya2VkIGVudHJ5IChpdCBqdXN0IG11c3Qgbm90IFJFLUlOREVYIGFueXRoaW5nOiBzZWUgdGhlIG1hcmtlZFJlYWQgZ3VhcmRzIGJlbG93KVxuICAgICAgICBsZXQgbWFya2VkUmVhZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudHJ5ICYmIGNvbmZpZy5pbmNsdWRlTWFya2VkKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIG1hcmtlZFJlYWQgPSAhIWVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBoYXMgbm8gYnl0ZXMgLSB0aGUgdG9tYnN0b25lIElTIHRoZSBhbnN3ZXIsIHNvIGEgZmxhZy1jYWxsZXIgZ2V0cyBpdHMgdGltZSB3aXRoIGVtcHR5IGRhdGFcbiAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luYy5ub3RlQWNjZXNzKGtleSk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXM6IHRoZSBob2xkZXIgYW5zd2VyaW5nIFwiZGVsZXRlZFwiIChhIHRvbWJzdG9uZSwgd2l0aCBpdHMgd3JpdGUgdGltZSkgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIkkgbG9zdCB0aGUgZmlsZVwiIC0gdGhlIGZvcm1lciBpcyBhdXRob3JpdGF0aXZlIGFuZCBtdXN0IE5PVCBmYWxsIGJhY2sgdG8gb2xkZXIgY29waWVzLCB3aGljaCB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0aW9uIGZvciB0aGlzIHJlYWRcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UsIGludGVybmFsOiB0cnVlLCBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmICFhbnN3ZXIuZGF0YS5sZW5ndGggJiYgIShyYW5nZSAmJiBhbnN3ZXIuc2l6ZSkgJiYgYW5zd2VyLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYSByYW5nZWQgcmVhZCBvZiBhIHJlYWwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IChyYW5nZSBwYXN0IEVPRiksIHNvIG9ubHkgdW5yYW5nZWQgZW1wdGluZXNzIG1lYW5zIHRvbWJzdG9uZS9hYnNlbnRcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIChhbnN3ZXIuZGF0YS5sZW5ndGggfHwgcmFuZ2UgJiYgYW5zd2VyLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpLCBhbmQgYSBtYXJrZWQgcmVhZCBtdXN0IG5vdCByZS1pbmRleCBhbnl0aGluZyAtIGNhY2hpbmcgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGtleSBhcyBsaXZlXG4gICAgICAgICAgICBpZiAoIW1hcmtlZFJlYWQgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5LCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgY291bnRzIGFzIGFic2VudCAtIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodGhpcyByZWFkIGlzIHVucmFuZ2VkLCBzbyBlbXB0aW5lc3MgaXMgdW5hbWJpZ3VvdXMpXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiBhbnN3ZXIuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgbWFya2VkIHJlYWQgbXVzdCBub3QgcmUtaW5kZXggYW55dGhpbmcgLSBjYWNoaW5nIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRlZCBrZXkgYXMgbGl2ZVxuICAgICAgICAgICAgaWYgKCFtYXJrZWRSZWFkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS4gKE5ldmVyIGZvciBhIG1hcmtlZCByZWFkOiBwdXJnaW5nIHdvdWxkIGVyYXNlIHRoZSBkZWxldGlvbidzIHRvbWJzdG9uZS4pXG4gICAgICAgIGlmICghbWFya2VkUmVhZCkge1xuICAgICAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuOyB1bmRlbGV0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBwYXRoOiBrZXksIGRhdGEgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnLmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvd3Mvcm91dGVzLCBzbyB0aGV5IGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IChhbmQgaXQgbmV2ZXIgZmxvd3MgdGhyb3VnaCB2YWxpZGF0aW9uKSAtIGJ1dCBpdCBoYXMgYSBydWxlIG9mIGl0cyBvd24sIHdoaWNoIGlzIG91cnMgdG8gZW5mb3JjZSBiZWNhdXNlIHRoZSBmaWxlIGlzIG91cnNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy51bmRlbGV0ZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgdW5kZWxldGVkIChpdCBjYW5ub3QgYmUgZGVsZXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVuZGVsZXRlS2V5KGtleSwgd3JpdGVUaW1lLCBjb25maWcuaW50ZXJuYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBza2lwcyBldmVyeSBvdGhlciBjaGVjazogaXQgaXMgdGhlIGZpbGUgdGhhdCBERUZJTkVTIG91ciB3aW5kb3dzIGFuZCByb3V0ZXMsIHNvIGp1ZGdpbmcgaXQgYnkgdGhlIGNvbmZpZyBpdCBpcyBhYm91dCB0byByZXBsYWNlIGlzIGhvdyBhIHN0b3JlIGdldHMgc3R1Y2sgb24gYSBjb25maWcgaXQgY2FuIG5ldmVyIGJlIHRvbGQgdG8gbGVhdmVcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIEEgZGVsZXRpb24gbGFuZHMgaW4gZXhhY3RseSB0aGUgc2FtZSBwbGFjZSBhIHdyaXRlIHdvdWxkLCBzbyBpdCBpcyBqdWRnZWQgdGhlIHNhbWUgd2F5OiBvbmUgYWltZWQgYXQgYSBzaGFyZCB3ZSBkb24ndCBzZXJ2ZSBpcyBqdXN0IGFzIGludmlzaWJsZSBhcyBhIHdyaXRlIHRvIGl0XG4gICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCBnZXRSb3V0ZShrZXkpLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBkZWxldGlvbnMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgICAgIC8vIHNldEludGVybmFsIHRyZWF0cyBhbiBlbXB0eSBidWZmZXIgYXMgZXhhY3RseSBhIGRlbGV0aW9uOiBkaXNrIHJlbW92YWwgcGx1cyBhIHRvbWJzdG9uZSBpbmRleCBlbnRyeSwgbm8gZmFuLW91dFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlcyBhcmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHRvbWJzdG9uZSBpcyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZCBpcyBldmVudHVhbGx5IGV4cGlyZWRcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgLyoqIEEgbm9kZS1zaWRlIG1vdmU6IHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2xpZW50LiBEZWxpYmVyYXRlbHkganVzdCBnZXQyICsgc2V0ICsgZGVsIHJhdGhlciB0aGFuIGEgZGlzayByZW5hbWUsIHNvIHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBwYXNzZXMgRVZFUlkgcnVsZSBhIHNldCBwYXNzZXMgKHdpbmRvd3MsIHJvdXRlcywgaW1tdXRhYmlsaXR5LCBvbmx5LXRha2UtbGF0ZXN0LCBpbmRleCwgZmFuLW91dCB0byBwZWVycykgYW5kIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVzIGFzIGEgbm9ybWFsIHRvbWJzdG9uZSAtIGEgcmVuYW1lIHdvdWxkIGJ5cGFzcyBhbGwgb2YgaXQuIFRoZSBzZXQgc3RhbXBzIGZyZXNoLCBzbyB0aGUgbW92ZWQgZmlsZSBiZWF0cyBhbnkgdG9tYnN0b25lIGF0IGl0cyBuZXcgcGF0aC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Mih7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9IHRvICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnRvUGF0aCl9OiB0aGUgc291cmNlIGZpbGUgZG9lcyBub3QgZXhpc3QgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KHsgcGF0aDogY29uZmlnLnRvUGF0aCwgZGF0YTogcmVzdWx0LmRhdGEgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsKHsgcGF0aDogY29uZmlnLmZyb21QYXRoIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICAvLyBOb3QgaW4gdGhlIGluZGV4IG1lYW5zIGl0IGRvZXMgbm90IGV4aXN0IGhlcmU6IHRoZSBpbmRleCBJUyB0aGUgYW5zd2VyLCBhbmQgc2Nhbm5pbmcgaGVhbHMgaXQgb24gaXRzIG93biBzY2hlZHVsZS4gQW4gZW50cnkgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGxpc3QgaXMgc3RpbGwgdmFsaWQgLSBnZXRFbnRyeUhvbGRlciByZXNvbHZlcyB0aGUgcGVyc2lzdGVkIFVSTCBkaXJlY3RseSwgYW5kIGdldDIncyBmYWxsYmFjayBsb29wIGNvdmVycyBhIGhvbGRlciB0aGF0IGlzIGdvbmUgZW50aXJlbHkuXG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHJldHVybiB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH07XG4gICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhjb25maWc6IEZpbmRDb25maWcgJiB7IHByZWZpeDogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgICAgIGxldCBpbmZvcyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgYXQgYWxsLCB3aGljaCBpcyB3aGF0IGEgbGlzdGluZyB3YW50czogYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZVxuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChrZXksIHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlTWFya2VkKSB7XG4gICAgICAgICAgICAvLyBBIGtleSBpcyBsaXZlIE9SIG1hcmtlZCwgbmV2ZXIgYm90aCwgc28gdGhpcyBjYW5ub3QgY29sbGlkZSB3aXRoIHRoZSBsb29wIGFib3ZlXG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGluZm9zLnNldChrZXksIHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVzID0gYXBwbHlGaW5kSW5mb1NoYXBlKEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpLCBwcmVmaXgsIHsgc2hhbGxvdzogY29uZmlnLnNoYWxsb3csIHR5cGU6IGNvbmZpZy50eXBlIH0pO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyBBbGwgZmlsZXMgY2hhbmdlZCBhZnRlciBjb25maWcudGltZSDigJQgc3RyYWlnaHQgZnJvbSB0aGUgaW5kZXguIEZpbHRlcnMgb24gd2hlbiBXRSBsZWFybmVkIG9mIHRoZSBjaGFuZ2UgKGNoYW5nZWRBdCksIHNvIGZpbGVzIHN5bmNocm9uaXplZCBsYXRlICh3aXRoIG9sZCB3cml0ZSB0aW1lcykgYXJlIHN0aWxsIHJlcG9ydGVkLiBEZWxldGlvbnMgQVJFIHJlcG9ydGVkLCBhcyBzaXplLTAgZW50cmllczogYSBjYWxsZXIgcmVhZGluZyBhIGNoYW5nZSBmZWVkIGhhcyB0byBoZWFyIGFib3V0IHRoZW0sIGFuZCBzaXplIDAgaXMgaG93IHRoZSBmZWVkIHNheXMgXCJnb25lXCIgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpLiBjb25maWcucm91dGVzIGxldHMgYSBzdG9yZSBzeW5jaW5nIGEgcGFydGlhbCBzaGFyZCBhc2sgZm9yIGp1c3QgaXRzIHNsaWNlLlxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBpblJvdXRlcyA9IChrZXk6IHN0cmluZykgPT4gIWNvbmZpZy5yb3V0ZXMgfHwgY29uZmlnLnJvdXRlcy5zb21lKHJvdXRlID0+IHJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGtleSkpKTtcbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmNoYW5nZWRBdCA8PSBjb25maWcudGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWluUm91dGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLmNoYW5nZWRBdCA8PSBjb25maWcudGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWluUm91dGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogdG9tYnN0b25lLndyaXRlVGltZSwgc2l6ZTogMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5nZXRTdGF0dXMoKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluZGV4J3MgdG90YWxzIHBsdXMgYW55IGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uLiAqL1xuICAgIHB1YmxpYyBnZXRTeW5jUHJvZ3Jlc3MoKToge1xuICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAgICAgbWFya2VkOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9O1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgIHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdO1xuICAgIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRvdGFscy5maWxlQ291bnQsIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgbWFya2VkOiB0aGlzLm1hcmtlZFRvdGFscygpLFxuICAgICAgICAgICAgc291cmNlczogdG90YWxzLnNvdXJjZXMsXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHRoaXMucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogdGhpcy5zeW5jLmdldEFjdGl2aXRpZXMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogZ2V0U3luY1Byb2dyZXNzJ3MgdG90YWxzLCBidXQgbG9hZGluZyB0aGUgaW5kZXggZmlyc3QsIHNvIHRoZXkgYXJlIG5ldmVyIHRoZSB6ZXJvZXMgb2YgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHlldC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZWRJbmRleFRvdGFscygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmFtZWRJbmRleFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHtcbiAgICAgICAgbGV0IHRvdGFscyA9IHRoaXMuaW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCxcbiAgICAgICAgICAgIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlc1xuICAgICAgICAgICAgICAgIC5tYXAoKHgsIGkpID0+ICh7IGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksIC4uLnRvdGFscy5zbG90c1tpXSB9KSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4LCBpKSA9PiB0aGlzLmlzTGl2ZShpKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0b3JlJ3Mgc291cmNlcywgYXMgdGhlIGN1cnJlbnQgcm91dGluZyBjb25maWcgc2F5cyB0aGV5IHNob3VsZCBiZS4gVGhpcyBpcyB0aGUgT05MWSB3YXlcbiAgICAgKiB0aGV5IGFyZSBldmVyIHNldDogdGhlIGZpcnN0IGNhbGwgcG9wdWxhdGVzIGFuIGVtcHR5IHN0b3JlLCBldmVyeSBsYXRlciBvbmUgYXBwbGllcyBhIGNoYW5nZSB0b1xuICAgICAqIHRoZSBydW5uaW5nIG9uZS4gV2luZG93cywgcm91dGVzIGFuZCBmbGFncyBtb3ZlIGluIHBsYWNlLCBnZW51aW5lbHkgbmV3IGVuZHBvaW50cyBhcmUgYWRkZWQgYW5kXG4gICAgICogc3RhcnQgc2Nhbm5pbmcsIGFuZCBlbmRwb2ludHMgdGhhdCBhcmUgZ29uZSBnbyBkZWFkICh0aGVpciBzY2FucyBzdG9wLCB0aGVpciBpbmRleCBlbnRyaWVzXG4gICAgICogZHJvcCkuXG4gICAgICpcbiAgICAgKiBBIHN0b3JlIGlzIG5ldmVyIHJlYnVpbHQgZm9yIGEgY29uZmlnIGNoYW5nZS4gSXRzIG5hbWUgZGVjaWRlcyBpdHMgZm9sZGVyIGFuZCBpdHMgaWRlbnRpdHksIGFuZFxuICAgICAqIGEgY29uZmlnIGNoYW5nZSBjYW5ub3QgY2hhbmdlIGVpdGhlciAtIHNvIHRoZXJlIGlzIG5vdGhpbmcgYSBjaGFuZ2UgY2FuIGRvIHRvIGEgc3RvcmUgZXhjZXB0XG4gICAgICogdGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlU291cmNlcyhzcGVjczogQmxvYlNvdXJjZVNwZWNbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXNwZWNzLmxlbmd0aCB8fCBzcGVjc1swXS5pZGVudGl0eSAhPT0gXCJkaXNrXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlU291cmNlcyBleHBlY3RzIHRoZSBkaXNrIHNvdXJjZSBmaXJzdCAoaWRlbnRpdHkgXCJkaXNrXCIpLCBnb3QgJHtKU09OLnN0cmluZ2lmeShzcGVjcy5tYXAoeCA9PiB4LmlkZW50aXR5KSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNhbGw6IHRoZSBkaXNrIHNsb3QgaGFzIHRvIGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgbWF0Y2hlZCBhZ2FpbnN0IGl0XG4gICAgICAgICAgICBsZXQgZGlzayA9IHNwZWNzWzBdO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGRpc2suY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBkaXNrLnVybCwgdmFsaWRXaW5kb3dzOiBkaXNrLnZhbGlkV2luZG93cywgcm91dGU6IGRpc2sucm91dGUsIG5vRnVsbFN5bmM6IGRpc2subm9GdWxsU3luYywgc291cmNlQ29uZmlnOiBkaXNrLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IGRpc2suaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmMuYWRkU291cmNlKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZXRXaW5kb3dzID0gKGk6IG51bWJlciwgd2luZG93czogW251bWJlciwgbnVtYmVyXVtdKSA9PiB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cztcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGQpID09PSBKU09OLnN0cmluZ2lmeSh3aW5kb3dzKSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFZhbGlkIHdpbmRvd3MgY2hhbmdlZCBmb3IgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke0pTT04uc3RyaW5naWZ5KG9sZCl9IC0+ICR7SlNPTi5zdHJpbmdpZnkod2luZG93cyl9YCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzID0gd2luZG93cztcbiAgICAgICAgfTtcbiAgICAgICAgc2V0V2luZG93cygwLCBzcGVjc1swXS52YWxpZFdpbmRvd3MpO1xuICAgICAgICAvLyBMaXZlIHNsb3RzIHBhaXIgd2l0aCBzcGVjcyBieSBpZGVudGl0eS4gRWFjaCBlbmRwb2ludCBpcyBub3cgT05FIHNwZWMgY2FycnlpbmcgYWxsIGl0cyB3aW5kb3dzLCBzbyB0aGlzIGlzIGEgMToxIHBhaXJpbmc7IGFueSBsZWZ0b3ZlciBkdXBsaWNhdGUgc2xvdHMgZnJvbSBiZWZvcmUgKGFuIGVuZHBvaW50IHRoYXQgdXNlZCB0byBiZSBzcGxpdCBpbnRvIHNldmVyYWwgc2xvdHMpIGdvIHVubWF0Y2hlZCBiZWxvdyBhbmQgYXJlIGNvbGxhcHNlZCBhd2F5LlxuICAgICAgICBsZXQgbGl2ZUJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gICAgICAgIGxldCBvcmlnaW5hbExlbmd0aCA9IHRoaXMuc291cmNlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgaWQgPSB0aGlzLnNvdXJjZXNbaV0uaWRlbnRpdHk7XG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IGxpdmVCeUlkZW50aXR5LmdldChpZCk7XG4gICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgbGl2ZUJ5SWRlbnRpdHkuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgICBmb3IgKGxldCBzcGVjIG9mIHNwZWNzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IGxpdmVCeUlkZW50aXR5LmdldChzcGVjLmlkZW50aXR5KT8uc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgU0FNRSBlbmRwb2ludCAoc2VlIHNvdXJjZUlkZW50aXR5KSwgc28gd2UgYXJlIGFscmVhZHkgc3luY2hyb25pemVkIHdpdGggaXQ6IHRoZSBzbG90IGtlZXBzIGl0cyBjb25uZWN0aW9uLCBpdHMgY29tcGxldGVkIHNjYW5zLCBhbmQgaXRzIGluZGV4IGVudHJpZXMsIGFuZCBvbmx5IHRoZSBwb2xpY3kgb24gaXQgbW92ZXMuIFJlY3JlYXRpbmcgaXQgaGVyZSB3b3VsZCBtZWFuIHJlc2Nhbm5pbmcgdGhlIGVuZHBvaW50IGZyb20gc2NyYXRjaCBldmVyeSB0aW1lIGEgZmxhZyBjaGFuZ2VzLlxuICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRkKHNsb3QpO1xuICAgICAgICAgICAgICAgIHNldFdpbmRvd3Moc2xvdCwgc3BlYy52YWxpZFdpbmRvd3MpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc291cmNlc1tzbG90XTtcbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGUgY2hhbmdlZCBmb3IgJHtleGlzdGluZy5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpfWApO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yb3V0ZSA9IHNwZWMucm91dGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnNvdXJjZUNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZyBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSwga2VlcGluZyB0aGUgc291cmNlIChzbyBpdCBpcyBub3QgcmVzY2FubmVkKTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBjYXJyaWVzIGl0cyBjb25maWcgKGFuZCBpdHMgd3JpdGUgZGVsYXkpIGludG8gZXZlcnl0aGluZyBpdCBkb2VzLCBzbyBpdCBoYXMgdG8gbGVhcm4gdGhlIG5ldyBvbmUgLSBzZWUgYXBwbHlTb3VyY2VDb25maWdcbiAgICAgICAgICAgICAgICBzcGVjLmFwcGx5Q29uZmlnPy4oZXhpc3Rpbmcuc291cmNlKTtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5ub0Z1bGxTeW5jID0gc3BlYy5ub0Z1bGxTeW5jO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNwZWMuY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBzcGVjLnVybCwgdmFsaWRXaW5kb3dzOiBzcGVjLnZhbGlkV2luZG93cywgcm91dGU6IHNwZWMucm91dGUsIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYywgaW50ZXJtZWRpYXRlOiBzcGVjLmludGVybWVkaWF0ZSwgc291cmNlQ29uZmlnOiBzcGVjLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IHNwZWMuaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRkZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGEgZ2VudWluZWx5IG5ldyBlbmRwb2ludCwgc28gaXQgaXMgc2Nhbm5lZCBmcm9tIHNjcmF0Y2hgKTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UodGhpcy5zb3VyY2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSB8fCBtYXRjaGVkLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBUaGUgc2xvdCBpcyBkZWFkIHRoZSBtb21lbnQgdGhpcyByZXR1cm5zOyBkcm9wcGluZyB0aGUgaW5kZXggZW50cmllcyBpdCBoZWxkIGlzIHRoZSBwYXJ0IHRoYXQgcmVhZHMgdGhlIGluZGV4LCBzbyBpdCBmaW5pc2hlcyBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgdm9pZCB0aGlzLnN5bmMucmVtb3ZlU291cmNlKGkpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgUmVtb3Zpbmcgc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5yZXNjYW5CYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLmJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2UsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgdXBsb2FkcyBzdHJlYW0gb250byB0aGUgbG9jYWwgZGlzayBzb3VyY2UgZGlyZWN0bHkgKHRoZXkgbWF5IG5vdCBmaXQgaW4gbWVtb3J5KSwgYW5kIHJlY29uY2lsaWF0aW9uIGNhcnJpZXMgdGhlbSB0byB0aGUgb3RoZXIgc291cmNlcyAtIHRoZXJlIGlzIG5vIGRlbGF5ZWQtd3JpdGUgc3RhZ2UgdGhleSBjb3VsZCBwYXNzIHRocm91Z2guIFRoZSB3cml0ZSBpdHNlbGYgaXMgdmFsaWRhdGVkIGV4YWN0bHkgbGlrZSBzZXQncywgcmlnaHQgaGVyZTogdGhlIGNsaWVudCBpcyBhYm91dCB0byBzZW5kIHRoZSB3aG9sZSBmaWxlLCBzbyBldmVyeSByZWFzb24gdG8gcmVmdXNlIGl0IG11c3QgYmUgZm91bmQgYmVmb3JlIHRoZSBmaXJzdCBieXRlLlxuICAgIHB1YmxpYyBhc3luYyBzdGFydExhcmdlVXBsb2FkKGNvbmZpZz86IHsgcGF0aD86IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZz8ucGF0aDtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWc/Lmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKS4gVGhlIGNsaWVudCBpcyBhbHJlYWR5IHN0cmVhbWluZywgc28gdGhlIHVwbG9hZCBpcyBhY2NlcHRlZCBhbmQgZXZlcnkgcGFydCBkaXNjYXJkZWQgLSB0aGUgYWx0ZXJuYXRpdmUgaXMgdGhyb3dpbmcgYXQgYSBjYWxsZXIgdGhhdCBkaWQgbm90aGluZyB3cm9uZy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gYCR7RElTQ0FSREVEX1VQTE9BRF9QUkVGSVh9JHt0aGlzLm5leHREaXNjYXJkZWRVcGxvYWQrK31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkZWRVcGxvYWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWc/LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IG9mZnNldD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuaGFzKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5hcHBlbmRMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5kYXRhLCBjb25maWcub2Zmc2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgbGV0IHsgZGlzaywgc291cmNlSW5kZXggfSA9IHRoaXMuZ2V0RGlza1NvdXJjZSgpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldCkgLSBhIG5ld2VyIHZhbHVlIGNhbiBsYW5kIHdoaWxlIGEgbG9uZyB1cGxvYWQgaXMgc3RpbGwgc3RyZWFtaW5nLCBzbyB0aGlzIGlzIHJlLWNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiBvbmx5IGF0IHRoZSBzdGFydFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoY29uZmlnLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBkaXNrLmZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhjb25maWcucGF0aCk7XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoY29uZmlnLnBhdGgsIHsgd3JpdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gSW50ZXJuYWxzXG5cbiAgICAvKiogQnl0ZXMgb2YgcmVhZCBjYWNoZSB0aGUgZGlzayBtYXkgaG9sZDsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXQgKFN0b3JlU3luYyBlbmZvcmNlcyBpdCkuIFJlYWQgZnJvbSB0aGUgY29uZmlnIGluIGVmZmVjdCwgc28gcmFpc2luZyBvciByZW1vdmluZyB0aGUgbGltaXQgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2aWN0aW9uIHBhc3MuICovXG4gICAgcHVibGljIGdldCByZWFkZXJEaXNrTGltaXQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHdyaXRlIHRpbWUgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQsIG9yIDAgd2hlbiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBrZXkuIENvdW50cyBERUxFVElPTlMgdG9vOiBhIHdyaXRlIG9sZGVyIHRoYW4gdGhlIGRlbGV0aW9uIHRoYXQgcmVtb3ZlZCBpdCBtdXN0IG5vdCBicmluZyBpdCBiYWNrLiBUaGUgaW5kZXggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhIHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIGEgZGVsYXllZCBzb3VyY2UsIHNpbmNlIHRoZSBlbnRyeSBpcyByZWNvcmRlZCB3aGVuIHRoZSB3cml0ZSBpcyBhY2NlcHRlZCByYXRoZXIgdGhhbiB3aGVuIGl0IHJlYWNoZXMgc3RvcmFnZS4gKi9cbiAgICBwdWJsaWMgY3VycmVudFdyaXRlVGltZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnRpbWVPZihrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5pc0xpdmUoc291cmNlSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90LCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc2xvdCBuZXZlciBnb3QgdGhhdCBmYXIgKGEgc291cmNlIHJlbW92ZWQgYmVmb3JlIGl0cyByZWdpc3RyYXRpb24gcmVzb2x2ZWQpLiAqL1xuICAgIHB1YmxpYyBzbG90U291cmNlc0xpc3RJbmRleChzbG90OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgIH1cblxuICAgIC8vIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90IC0gb25seSB2YWxpZCBvbmNlIHRoZSBzbG90J3MgcmVnaXN0cmF0aW9uIHJlc29sdmVkIChpbml0IGFuZCB0aGUgc291cmNlJ3Mgc3luYyBsb29wIGd1YXJhbnRlZSB0aGF0IGJlZm9yZSBhbnkgaW5kZXhpbmcgaGFwcGVucylcbiAgICBwdWJsaWMgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90ICR7c2xvdH0gKCR7dGhpcy5zb3VyY2VzW3Nsb3RdPy51cmx9KSBoYXMgbm8gcmVnaXN0ZXJlZCBzb3VyY2VzTGlzdEluZGV4IHlldCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8vIFRoZSBsaXZlIHNsb3QgY3VycmVudGx5IHNlcnZpbmcgYSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNvbmZpZ3VyZWQgc291cmNlIGhhcyB0aGF0IFVSTCBhbnltb3JlLiBMaW5lYXIsIGJ1dCB0aGUgc291cmNlcyBsaXN0IGlzIHRpbnkgYW5kIHRoaXMgaXMgYWx3YXlzIGN1cnJlbnQgKHNsb3RzIGR5aW5nLCBvciBzZXZlcmFsIHNsb3RzIHNoYXJpbmcgb25lIFVSTCBhY3Jvc3MgdmFsaWQgd2luZG93cywgbmVlZCBubyBib29ra2VlcGluZykuXG4gICAgcHVibGljIHNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW2ldID09PSBzb3VyY2VzTGlzdEluZGV4ICYmIHRoaXMuaXNMaXZlKGkpKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFRoZSBJQXJjaGl2ZXMgY3VycmVudGx5IGhvbGRpbmcgYW4gZW50cnkncyBieXRlczogdGhlIGxpdmUgc2xvdCB3aGVuIHRoZSBob2xkZXIgaXMgc3RpbGwgY29uZmlndXJlZCwgb3RoZXJ3aXNlIHJlc29sdmVkIChjYWNoZWQpIHN0cmFpZ2h0IGZyb20gaXRzIHBlcnNpc3RlZCBVUkwgLSB3aW5kb3dzL3JvdXRlcyBkZWNpZGUgd2hlbiBhIHNvdXJjZSBpcyBzY2FubmVkIG9yIHdyaXR0ZW4sIGJ1dCBmb3IgcmVhZGluZyBieXRlcyB3ZSBrbm93IGl0IGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaFxuICAgIHB1YmxpYyBhc3luYyBnZXRFbnRyeUhvbGRlcihlbnRyeTogSW5kZXhFbnRyeSk6IFByb21pc2U8SUFyY2hpdmVzIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNvdXJjZXNMaXN0LmdldFVybChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSB8fCBhd2FpdCB0aGlzLnNvdXJjZXNMaXN0LmdldFVybFJlbG9hZGluZyhlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8ucmVzb2x2ZVNvdXJjZVVybD8uKHVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5kZXgubG9hZCgpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAoc2VlIFN0b3JlU3luYydzIHNjYW4gaGFuZGxpbmcpLCBhbmQgYSBsb2FkZWQgYnVja2V0IGFsd2F5cyBoYXMgaXQgdGhlcmUgLSBhIHBlcnNpc3RlZCBlbnRyeSBwb2ludGluZyBlbHNld2hlcmUgaXMgc3RhbGUsIHNvIGl0IGlzIGNvcnJlY3RlZCBvbmNlLCBoZXJlXG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5nZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgaWYgKHJvdXRpbmcgJiYgcm91dGluZy5zb3VyY2VzTGlzdEluZGV4ICE9PSBiYXNlU291cmNlc0xpc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSwgeyB3cml0ZVRpbWU6IHJvdXRpbmcud3JpdGVUaW1lLCBzaXplOiByb3V0aW5nLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGJhc2VTb3VyY2VzTGlzdEluZGV4IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSB3ZSBob2xkLiBBIGRlbGV0ZWQgb25lIGlzIG5vdCBvbmU6IGl0IGlzIGEgdG9tYnN0b25lLCBhbmQgb25seSBnZXREZWxldGVkRW50cnkga25vd3MgYWJvdXQgaXQuICovXG4gICAgcHVibGljIGdldEluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiBJbmRleEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5pbmRleC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogV2hlbiBhIGtleSB3YXMgZGVsZXRlZCwgaWYgaXQgd2FzLiBBIGRlbGV0aW9uIGlzIGFuIGFic2VuY2Ugd2l0aCBhIHRpbWUgYXR0YWNoZWQgLSB0aGF0IHRpbWUgaXMgd2hhdCBtYWtlcyBpdCBwcm9wYWdhdGUgYW5kIHdoYXQgZXhwaXJlcyBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0RGVsZXRlZEVudHJ5KGtleTogc3RyaW5nKTogeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmluZGV4LmdldERlbGV0ZWQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIHdlIGhvbGQsIGZvciB0aGUgcGFzc2VzIHRoYXQgd2FsayB0aGVtIGFsbCAobGlzdGluZ3MsIHNjYW5zLCByZWNvbmNpbGlhdGlvbiwgZXZpY3Rpb24pLiBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIC0gc2VlIGRlbGV0ZWRFbnRyaWVzLiBMaXZlOiBkZWxldGluZyBlbnRyaWVzIHdoaWxlIGl0ZXJhdGluZyBpcyBleHBlY3RlZCBoZXJlLCBhbmQgc2FmZS4gKi9cbiAgICBwdWJsaWMgKmluZGV4RW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEluZGV4RW50cnldPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4LmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFdmVyeSBkZWxldGlvbiB3ZSBrbm93IG9mLiBBIG11Y2ggc21hbGxlciB3YWxrIHRoYW4gdGhlIGZpbGVzLCB3aGljaCBpcyB3aGF0IG1ha2VzIGV4cGlyaW5nIHRoZW0gY2hlYXAuICovXG4gICAgcHVibGljICpkZWxldGVkRW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH1dPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5pbmRleC5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgTUFSS0VEIGZvciBkZWxldGlvbjogaXRzIGtlcHQgaW5kZXggdmFsdWUgcGx1cyB3aGVuIGl0IHdhcyBkZWxldGVkLiBVbmRlZmluZWQgd2hlbiB0aGUga2V5IGlzIGxpdmUsIG5ldmVyIGV4aXN0ZWQsIG9yIGl0cyBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQuICovXG4gICAgcHVibGljIGdldE1hcmtlZEVudHJ5KGtleTogc3RyaW5nKTogKEluZGV4RW50cnkgJiB7IGRlbGV0ZVRpbWU6IG51bWJlciB9KSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmluZGV4LmdldERlbGV0ZWQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUgfHwgdG9tYnN0b25lLnZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLnRvbWJzdG9uZS52YWx1ZSwgd3JpdGVUaW1lOiB0b21ic3RvbmUudmFsdWVUaW1lIHx8IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQsIGRlbGV0ZVRpbWU6IHRvbWJzdG9uZS50aW1lIH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgbWFya2VkIGZvciBkZWxldGlvbiAtIHRoZSBkZWxldGlvbiBoaXN0b3J5LCB3YWxrZWQgYnkgcmV0ZW50aW9uIGFuZCBieSBpbmNsdWRlTWFya2VkIGxpc3RpbmdzLiAqL1xuICAgIHB1YmxpYyAqbWFya2VkRW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEluZGV4RW50cnkgJiB7IGRlbGV0ZVRpbWU6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4udG9tYnN0b25lLnZhbHVlLCB3cml0ZVRpbWU6IHRvbWJzdG9uZS52YWx1ZVRpbWUgfHwgdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCwgZGVsZXRlVGltZTogdG9tYnN0b25lLnRpbWUgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGRlbGV0aW9uIGhpc3RvcnkncyB0b3RhbHM6IGhvdyBtYW55IG1hcmtlZCBmaWxlcywgdGhlaXIgYnl0ZXMsIGFuZCB0aGUgZGVsZXRlIHRpbWUgb2YgdGhlIE9MREVTVCBvbmUgLSB3aGljaCBpcyBob3cgZmFyIGJhY2sgdGhlIGhpc3RvcnkgcmVhY2hlcy4gKi9cbiAgICBwdWJsaWMgbWFya2VkVG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBvbGRlc3REZWxldGVUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3REZWxldGVUaW1lID09PSB1bmRlZmluZWQgfHwgZW50cnkuZGVsZXRlVGltZSA8IG9sZGVzdERlbGV0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBvbGRlc3REZWxldGVUaW1lID0gZW50cnkuZGVsZXRlVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgb2xkZXN0RGVsZXRlVGltZSB9O1xuICAgIH1cblxuICAgIC8qKiBQaHlzaWNhbGx5IHJlbW92ZXMgYSBtYXJrZWQgZmlsZSdzIGJ5dGVzIGZyb20gb3VyIGRpc2sgYW5kIGRyb3BzIGl0cyBrZXB0IHZhbHVlLCBsZWF2aW5nIGEgcGxhaW4gdG9tYnN0b25lIHRoYXQgYWdlcyBvdXQgbm9ybWFsbHkgLSByZXRlbnRpb24gY2FsbGluZyB0aW1lIG9uIHRoZSBvbGRlc3QgaGlzdG9yeS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZHJvcE1hcmtlZEhpc3Rvcnkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vd25EaXNrLmRlbChrZXkpO1xuICAgICAgICB0aGlzLmluZGV4LmRyb3BWYWx1ZShrZXkpO1xuICAgIH1cblxuICAgIC8qKiBTZWUgU2V0Q29uZmlnLnVuZGVsZXRlOiBmbGlwcyBhIG1hcmtlZCBkZWxldGlvbiBiYWNrIHRvIGxpdmUgKGZyZXNoIHdyaXRlIHRpbWUsIHNvIHRoZSByZXN0b3JlIG91dHJhbmtzIHRoZSBkZWxldGlvbiBldmVyeXdoZXJlIGl0IHByb3BhZ2F0ZWQpIC0gdGhlIGJ5dGVzIG5ldmVyIGxlZnQgdGhlIGRpc2ssIHNvIHJlYWRzIGp1c3Qgd29yayBhZ2Fpbi4gSW50ZXJuYWwgcmVzdG9yZXMgYXJlIGEgcGVlcidzIHByb3BhZ2F0aW9uIGFuZCB0b2xlcmF0ZSBoYXZpbmcgbm90aGluZyB0byByZXN0b3JlICh0aGlzIG5vZGUgbWF5IG5ldmVyIGhhdmUgaGVsZCB0aGUgZmlsZSk7IGEgY2FsbGVyJ3MgcmVzdG9yZSB0aHJvd3MgaW5zdGVhZC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHVuZGVsZXRlS2V5KGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgaW50ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG1hcmtlZCA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnVubWFyayhrZXksIHdyaXRlVGltZSkpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgbGl2ZTogdW5kZWxldGUgaXMgaWRlbXBvdGVudCAocmV0cmllcyBhbmQgcGVlciBwcm9wYWdhdGlvbiBib3RoIHJlLXNlbmQgaXQpXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRJbmRleEVudHJ5KGtleSkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmRlbGV0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgaGFzIG5vdGhpbmcgdG8gcmVzdG9yZSBoZXJlIC0gdGhpcyBub2RlIG1heSBuZXZlciBoYXZlIGhlbGQgdGhlIGZpbGVgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1bmRlbGV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGl0IGhhcyBubyBtYXJrZWQgZGVsZXRpb24gdG8gcmVzdG9yZSAtIGl0IHdhcyBuZXZlciBkZWxldGVkIGhlcmUke3RoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSkgJiYgXCIsIG9yIGl0cyBkZWxldGlvbiBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQgKGEgcGxhaW4gdG9tYnN0b25lIHJlbWFpbnMsIGJ1dCB0aGUgYnl0ZXMgYXJlIGdvbmUpXCIgfHwgXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGVkICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogdGhlIGluZGV4IGVudHJ5ICgke21hcmtlZD8uc2l6ZX0gYnl0ZXMsIGRlbGV0ZWQgJHttYXJrZWQgJiYgbmV3IERhdGUobWFya2VkLmRlbGV0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBsaXZlIGFnYWluIGFzIG9mICR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrYCk7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIGlmIChpbnRlcm5hbCkgcmV0dXJuO1xuICAgICAgICAvLyBQZWVycyBtYXJrZWQgdGhlaXIgb3duIGNvcGllcyB3aGVuIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVkLCBzbyB0aGUgcmVzdG9yZSBwcm9wYWdhdGVzIHRoZSBzYW1lIHdheS4gU3RyYWlnaHQgcGFzdCBhbnkgd3JpdGUgZGVsYXkgLSBhIGJ1ZmZlcmVkIHVuZGVsZXRlIGNvdWxkIGJlIHJlYWQgYmFjayBhcyBpdHMgcGxhY2Vob2xkZXIgYnl0ZS5cbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB0aGlzLmdldFdyaXRhYmxlU291cmNlcygpKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gT25seSBvdXIgb3duIHNlcnZlcnMgdW5kZXJzdGFuZCB0aGUgZmxhZyAtIGEgcmF3IHNvdXJjZSAoYmFja2JsYXplKSB3b3VsZCBzdG9yZSB0aGUgcGxhY2Vob2xkZXIgYnl0ZSBhcyB0aGUgZmlsZS4gVGhlaXIgb2xkZXIgY29weSBpcyByZS1wdXNoZWQgYnkgcmVjb25jaWxpYXRpb24gaW5zdGVhZC5cbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbaV0uc291cmNlQ29uZmlnPy50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBwdXNoID0gdW53cmFwRGVsYXllZCh0aGlzLnNvdXJjZXNbaV0uc291cmNlKS5zZXQoa2V5LCBVTkRFTEVURV9QTEFDRUhPTERFUiwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgdW5kZWxldGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHVuZGVsZXRlIG9mICR7a2V5fSBvbiBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZCAoaXRzIHNjYW4gb2YgdXMgcmUtZmluZHMgdGhlIGZpbGUgYW55d2F5KTogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmaWxlcyB3ZSBob2xkLCBkZWxldGlvbnMgZXhjbHVkZWQuICovXG4gICAgcHVibGljIGluZGV4U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5zaXplO1xuICAgIH1cblxuICAgIC8qKiBUb3RhbHMgb3ZlciB0aGUgZmlsZXMgd2UgaG9sZCwgYnJva2VuIGRvd24gYnkgdGhlIHNsb3QgaG9sZGluZyBlYWNoIChlbnRyaWVzIGNhbiBuYW1lIGEgc291cmNlIHRoYXQgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQsIHdoaWNoIGNvdW50cyB0b3dhcmRzIHRoZSB0b3RhbCBidXQgbm8gc2xvdCkuICovXG4gICAgcHVibGljIGluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzbG90czogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzbG90cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gKHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfSkpO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc2xvdHMgfTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIGZpbGUsIGFzIG9mIGl0cyB3cml0ZSB0aW1lLiBSZXR1cm5zIGZhbHNlLCBoYXZpbmcgY2hhbmdlZCBub3RoaW5nLCB3aGVuIHdlIGFscmVhZHkga25vdyBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IC0gdGhlIGluZGV4IGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcywgd2hpY2hldmVyIHBhdGggdGhlIHdyaXRlIGNhbWUgaW4gYnkuICovXG4gICAgcHVibGljIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5zZXQoa2V5LCB7IHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSwgZW50cnkud3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgbGFuZGluZyBoZXJlIC0gd3JpdHRlbiBieSBhbiBvcGVyYXRvciwgb3IgcHVsbGVkIG9mZiBhIHBlZXIgYnkgc3luY2hyb25pemF0aW9uIC0gaXMgaG93IHRoaXMgc3RvcmUgbGVhcm5zIHdoYXQgaXQgaXMgbWVhbnQgdG8gYmVcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIERFTEVUSU9OLCBhcyBvZiBpdHMgdGltZTogdGhlIGtleSBzdG9wcyBleGlzdGluZyBoZXJlLCBhbmQgdGhlIHRvbWJzdG9uZSBpcyB3aGF0IG1ha2VzIHRoYXQgZmFjdCBwcm9wYWdhdGUgYW5kIHJlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZS4gU2FtZSBvcmRlcmluZyBydWxlIGFzIHNldEluZGV4RW50cnkuICovXG4gICAgcHVibGljIHNldEluZGV4RGVsZXRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LmRlbGV0ZShrZXksIHdyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgYSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZC4gTk9UIGEgZGVsZXRpb246IGl0IHNheXMgbm90aGluZyBoYXBwZW5lZCB0byB0aGUgZmlsZSwgb25seSB0aGF0IHdlIG5vIGxvbmdlciBrbm93IGFueXRoaW5nIGFib3V0IGl0IC0gZm9yIGFuIGVudHJ5IHdob3NlIGhvbGRlciB0dXJuZWQgb3V0IG5vdCB0byBoYXZlIGl0LCBhbmQgZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBldmVyeW9uZSBoYXMgaGVhcmQuICovXG4gICAgcHVibGljIHB1cmdlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4LnB1cmdlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqIENvdW50cyBhIHN5bmNocm9uaXphdGlvbiB0cmFuc2ZlciBpbiB0aGUgc2VydmVyJ3MgYWNjZXNzIHN0YXRpc3RpY3MgKHNlZSBnZXRTdG9yZSdzIHdpcmluZyk6IFwic3luYyBnZXRcIiBmb3IgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSwgXCJzeW5jIHNldFwiIGZvciBieXRlcyBwdXNoZWQgdG8gb25lLiAqL1xuICAgIHB1YmxpYyBub3RlU3luY1RyYW5zZmVyKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uU3luY1RyYW5zZmVyPy4ob3BlcmF0aW9uLCBwYXRoLCBieXRlcyk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHZhbGlkYXRpb24gKGZyb20gdGhpcyBzdG9yZSdzIG93biByb3V0aW5nIGVudHJpZXMpIOKUgOKUgFxuXG4gICAgLyoqXG4gICAgICogRXZlcnkgd3JpdGUsIGhvd2V2ZXIgaXQgaXMgc3RhbXBlZCwgaGFzIHRvIGJlIG9uZSB3ZSBhcmUgYWN0dWFsbHkgbWVhbnQgdG8gaG9sZCAtIGJlY2F1c2UgdGhlXG4gICAgICogYWx0ZXJuYXRpdmUgaXMgbm90IGEgc21hbGxlciBwcm9ibGVtLCBpdCBpcyBhIHNpbGVudCBvbmUuIEEgd3JpdGUgdGhhdCBsYW5kcyBvbiBhIHN0b3JlIHRoYXRcbiAgICAgKiBkb2VzIG5vdCBzZXJ2ZSBpdHMgcm91dGUgKG9yIG9uIGEgc2VydmVyIHRoYXQgaXMgbm90IGluIHRoZSBidWNrZXQncyBjb25maWcgYXQgYWxsKSBnb2VzIGludG8gYVxuICAgICAqIGZvbGRlciBub3RoaW5nIHNjYW5zIGFuZCBubyBwZWVyIHJlY29uY2lsZXM6IGl0IHN1Y2NlZWRzLCBhbmQgdGhlbiBpdCBpcyBnb25lLiBUaGUgbWFya2VycyBtYWtlXG4gICAgICogdGhlIGNsaWVudCByZS1yZWFkIHRoZSByb3V0aW5nIGNvbmZpZyBhbmQgcmV0cnksIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHJpZ2h0IG91dGNvbWUgd2hlbiB0aGVcbiAgICAgKiByZWFzb24gaXQgYWltZWQgaGVyZSBpcyB0aGF0IGl0cyBjb25maWcgd2FzIHN0YWxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0V3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHJvdXRlOiBudW1iZXIsIGxhc3RNb2RpZmllZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkZXRhaWwgPSB0aGlzLnVuY29uZmlndXJlZERldGFpbCgpO1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH1gKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX05PVF9DT05GSUdVUkVEfSBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9IERhdGEgd3JpdHRlbiB0byBhIHN0b3JlIHdpdGggbm8gY29uZmlndXJhdGlvbiBlbnRyeSB3b3VsZCBuZXZlciBiZSBzY2FubmVkIG9yIHJlY29uY2lsZWQsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBzaWxlbnRseSBsb3NlIGl0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeSAtIG9yLCBpZiB0aGlzIHN0b3JlIGlzIGdlbnVpbmVseSBtZWFudCB0byB0YWtlIHRoaXMgd3JpdGUsIHdyaXRlIHRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZyB3aXRoIGFuIGVudHJ5IG5hbWluZyBpdCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleSwgRGF0ZS5ub3coKSwgcm91dGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RhbXBlZCB3cml0ZSBwaWNrZWQgaXRzIG93biB0aW1lLCBzbyBubyB3aW5kb3cgY2FuIGp1ZGdlIGl0ICh0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN5bmNocm9uaXplZCB3cml0ZSkgLSBidXQgdGhlIFJPVVRFIGlzIG5vdCBhIG1hdHRlciBvZiB0aW1pbmcsIGFuZCBhIHN0YW1wZWQgd3JpdGUgdG8gdGhlIHdyb25nIHNoYXJkIGlzIGV4YWN0bHkgYXMgaW52aXNpYmxlIGFzIGEgZnJlc2ggb25lXG4gICAgICAgIGlmICh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHJldHVybjtcbiAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBzdGFtcGVkIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSByb3V0ZSB3ZSBzZXJ2ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHN0b3JlIGRvZXMgbm90IGhhbmRsZSByb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sIG91ciByb3V0ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0sIHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgfVxuXG4gICAgLyoqIEV4YWN0bHkgd2h5IHRoaXMgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cmllcyAtIHdoaWNoIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSByZWFzb25zIGl0IGlzLCB3aXRoIHRoZSB2YWx1ZXMgdGhhdCBkZWNpZGVkIGl0LCBiZWNhdXNlIFwibm90IGNvbmZpZ3VyZWRcIiBhbG9uZSBpcyB1bmRpYWdub3NhYmxlLiAqL1xuICAgIHByaXZhdGUgdW5jb25maWd1cmVkRGV0YWlsKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5hcHBsaWVkUm91dGluZztcbiAgICAgICAgbGV0IGlkZW50aXR5ID0gYHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KWA7XG4gICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBoYXMgbm8gcm91dGluZyBjb25maWcgYXQgYWxsIC0gbm90aGluZyBoYXMgZXZlciB3cml0dGVuICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gaW50byBpdC5gO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvYmplY3RzID0gcm91dGluZy5zb3VyY2VzLmZpbHRlcih4ID0+IHR5cGVvZiB4ICE9PSBcInN0cmluZ1wiKSBhcyBTb3VyY2VDb25maWdbXTtcbiAgICAgICAgbGV0IG5hbWVkID0gb2JqZWN0cy5maWx0ZXIoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgICAgaWYgKCFuYW1lZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdoaWNoIGhhcyBubyBlbnRyeSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGl0cyBlbnRyaWVzIGFyZSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KG9iamVjdHMubWFwKHggPT4geC5uYW1lKSl9KS5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdob3NlICR7bmFtZWQubGVuZ3RofSBlbnRyJHtuYW1lZC5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gbmFtZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IHBvaW50KHMpIGF0ICR7SlNPTi5zdHJpbmdpZnkobmFtZWQubWFwKHggPT4geC51cmwpKX0gLSBub25lIG9mIHdoaWNoIGlzIFRISVMgc2VydmVyLCBzbyB0aGUgY29uZmlnIHNheXMgdGhpcyBzdG9yZSBsaXZlcyBlbHNld2hlcmUuYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgcm91dGluZyBjb25maWcgbWF5IGJlIHdyaXR0ZW4gaGVyZS4gVHdvIHJ1bGVzLCBhbmQgdGhpcyBpcyB0aGUgb25lIHBsYWNlIGVpdGhlciBpc1xuICAgICAqIGFwcGxpZWQgLSBhIGNvbmZpZyBvbmx5IGV2ZXIgZW50ZXJzIHRoZSBzeXN0ZW0gdGhyb3VnaCBhIHdyaXRlLCBzbyBhIGNvbmZpZyB0aGF0IGdvdCBpbiBpcyBhXG4gICAgICogY29uZmlnIHRoYXQgcGFzc2VkLCBhbmQgcmVhZGluZyBvbmUgYmFjayBuZXZlciBqdWRnZXMgaXQgYWdhaW4uXG4gICAgICpcbiAgICAgKiBUaGUgY29uZmlnIGhhcyB0byBiZSB2YWxpZCBhcyBhIHdob2xlIChzZWUgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcpLCBhbmQgaXQgaGFzIHRvIG91dHJhbmsgd2hhdFxuICAgICAqIHdlIGFyZSBydW5uaW5nOiB0aGUgc2FtZSB2ZXJzaW9uIG1lYW5zIHRoZSBzYW1lIGNvbmZpZywgc28gcmUtd3JpdGluZyBpdCBpcyBoYXJtbGVzcywgYnV0IGFcbiAgICAgKiBsb3dlciBvbmUgaXMgYW4gb2xkZXIgY29uZmlnIGFycml2aW5nIGxhdGUgYW5kIG11c3QgbmV2ZXIgdW5kbyBhIG5ld2VyIG9uZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyhyb3V0aW5nKTtcbiAgICAgICAgbGV0IGluY29taW5nID0gZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnJvdXRpbmdWZXJzaW9uKCk7XG4gICAgICAgIGlmIChpbmNvbWluZyA+PSBjdXJyZW50KSByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVmdXNpbmcgdG8gd3JpdGUgJHtST1VUSU5HX0ZJTEV9IHRvIHN0b3JlICR7dGhpcy5mb2xkZXJ9OiBpdHMgdmVyc2lvbiAoJHtpbmNvbWluZ30pIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSB0aGlzIHN0b3JlIGlzIHJ1bm5pbmcgKCR7Y3VycmVudH0pLiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gdG8gdXBkYXRlIGl0LmApO1xuICAgIH1cblxuICAgIC8vIEEgZnJlc2ggKHVuc3RhbXBlZCkgd3JpdGUgbXVzdCBsYW5kIG9uIHRoZSBub2RlIHRoZSBjb25maWcgY3VycmVudGx5IHBvaW50cyBhdDogdGhlIG1hcmtlcnMgdGVsbCB0aGUgY2xpZW50IGl0cyBjb25maWcgaXMgc3RhbGUsIHNvIGl0IHJlLXJlc29sdmVzIGFuZCByZXRyaWVzIGFnYWluc3QgdGhlIHJpZ2h0IG5vZGUgaW5zdGVhZCBvZiB1cyBzaWxlbnRseSBhY2NlcHRpbmcgZGF0YSB3ZSB3ZXJlIG5ldmVyIG1lYW50IHRvIGhvbGQuXG4gICAgcHJpdmF0ZSBhc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGFsbCBvdXIgdmFsaWQgd2luZG93cyAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiBpdHMgd3JpdGUgdGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBldmVyeSB2YWxpZCB3aW5kb3cgb2Ygc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9ICh3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSwgZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSAtIGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRpbWVWYWxpZC5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBvdXIgcm91dGVzICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSBhdCB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICh0aGUgY2xpZW50J3Mgc2hhcmQgY29uZmlnIGlzIHN0YWxlKWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc3RvcmUgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXNzZXJ0TXV0YWJsZShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGlzIGltbXV0YWJsZSAoYXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0pIGFuZCAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFscmVhZHkgZXhpc3RzLCBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiB0byAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWUgU2V0Q29uZmlnLmludGVybmFsOiB0aGUgc3RhbXAgbXVzdCBsYW5kIGluc2lkZSBTT01FIHdpbmRvdytyb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yIChhbnkgd2luZG93LCBpbmNsdWRpbmcgcGFzdCBvbmVzIC0gc3luY2hyb25pemF0aW9uIG1vdmVzIG9sZCBkYXRhKSwgc28gYSBjb25mdXNlZCBwZWVyIGNhbid0IHN0dWZmIGRhdGEgb250byBhIHN0b3JlIHRoYXQgd2FzIG5ldmVyIG1lYW50IHRvIGhvbGQgaXRcbiAgICBwcml2YXRlIGFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgY292ZXJlZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0gJiYgcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoIWNvdmVyZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSByZWplY3RlZDogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZDogcHVyZWx5IHRoZSBsb2NhbCBkaXNrLCBjb21wbGV0ZWx5IHNob3J0LWNpcmN1aXRpbmcgdGhlIGluZGV4IGFuZCBob2xkZXIgcmVzb2x1dGlvbiAtIHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSwgYW5kIGNoYXNpbmcgT1VSIHJlbW90ZSBob2xkZXJzIHdoaWxlIGFuc3dlcmluZyBpdCBpcyBob3cgaW5maW5pdGUgZ2V0IGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE5vIHdpbmRvdyBvciByb3V0ZSBjaGVja3M6IGlmIHRoZSBieXRlcyBhcmUgb24gb3VyIGRpc2ssIHRoZSBjYWxsZXIgbWF5IGhhdmUgdGhlbS4gTm90ZSB0aGlzIHJlYWRzIHRoZSBkaXNrIHBhc3QgYW55IHdyaXRlIGRlbGF5LCBzbyBhIGZhc3Qgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gbWVtb3J5IGlzIGludmlzaWJsZSBoZXJlOyB0aGUgY2FsbGVyIHJlLWZpbmRzIGl0IG9uY2UgaXQgZmx1c2hlcy4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEludGVybmFsMihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIGluY2x1ZGVUb21ic3RvbmVzIGZvcndhcmRzIHRvIHRoZSBkaXNrOiBhIGZsYWctY2FsbGVyIChhIHBlZXIgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIG5lZWRzIHRvIHNlZSBvdXIgZGVsZXRpb25zLCBub3QganVzdCBvdXIgY29udGVudC4gQSB0b21ic3RvbmUgZGVsZXRlZCBmcm9tIGRpc2sgZW50aXJlbHkgb25seSBsaXZlcyBpbiBvdXIgaW5kZXgsIHNvIGZhbGwgYmFjayB0byB0aGF0LlxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5nZXQyKGNvbmZpZy5wYXRoLCB7IHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMgfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoY29uZmlnLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkKSByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfTtcbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSB3cml0ZTogdGhlIGxvY2FsIGRpc2sgcGx1cyBvdXIgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0IC0gdGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiwgYW5kIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gT25seS10YWtlLWxhdGVzdCBzdGlsbCBhcHBsaWVzIGhlcmUuICovXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRJbnRlcm5hbChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgc3RheSBvbiBvdXIgZGlzayBhcyBkZWxldGlvbiBoaXN0b3J5IChzZWUgd3JpdGVUb1NvdXJjZXMpIC0gdGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlYWQncyBieXRlcyBjYW1lIGZyb20gYSByZW1vdGUgc291cmNlLCBzbyB3cml0ZSB0aGVtIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCB3aGljaCBiZWNvbWVzIHRoZSBlbnRyeSdzIG5ldyBob2xkZXIgLSByZWFkcyBvbmx5IHBheSB0aGUgcmVtb3RlIGZldGNoIG9uY2VcbiAgICBwcml2YXRlIGFzeW5jIGNhY2hlUmVhZChrZXk6IHN0cmluZywgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgIC8vIEEgZG93bi1jYWNoZSBwdWxscyB0aGUgYnl0ZXMgb2ZmIGEgc291cmNlIGV4YWN0bHkgbGlrZSBzeW5jaHJvbml6YXRpb24gZG9lcywgc28gaXQgY291bnRzIChhbmQgbG9ncykgdGhlIHNhbWUgd2F5XG4gICAgICAgIHRoaXMubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgZ2V0XCIsIGtleSwgcmVzdWx0LmRhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2hhcmVkIGVuZ2luZSBvZiBzZXQgYW5kIGRlbDogYW4gZW1wdHkgYnVmZmVyIGlzIGV4YWN0bHkgYSBkZWxldGlvbiBoZXJlLCB3aGljaCBpcyB3aHkgdGhlIGVtcHR5LWJ1ZmZlciByZWplY3Rpb24gbGl2ZXMgaW4gc2V0ICh0aGUgcHVibGljIEFQSSksIG5vdCBpbiB0aGlzIG1hY2hpbmVyeVxuICAgIHByaXZhdGUgYXN5bmMgc2V0T3JEZWxldGUoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwib3JpZ2luYWxcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnLmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCB3cml0ZXMgYXJlIG5vdCBoYW5kbGVkIGhlcmU6IGEgc291cmNlIHRoYXQgd2FzIGNvbmZpZ3VyZWQgd2l0aCBhIHdyaXRlIGRlbGF5IGJ1ZmZlcnMgdGhlbSBpdHNlbGYgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpLCBzbyB0aGlzIHdyaXRlIGxhbmRzIGluIG1lbW9yeSBhbmQgcmV0dXJucywgZXhhY3RseSBhcyBpdCB3b3VsZCBoYXZlLiBUaGUgaW5kZXggaXMgdXBkYXRlZCBlaXRoZXIgd2F5LCBzbyB0aGUgd3JpdGUgaXMgaW1tZWRpYXRlbHkgdmlzaWJsZSB0byByZWFkZXJzIG9mIHRoaXMgc3RvcmUuXG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCBsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbnN0YW50IGV2ZXJ5IGRlbGF5ZWQgd3JpdGUgbXVzdCBiZSBvbiBpdHMgc291cmNlOiB0aGUgZW5kIG9mIG91ciBvd24gd3JpdGUgd2luZG93IHRoYXQgY29udGFpbnMgbm93LCBtaW51cyB0aGUgZmx1c2ggbWFyZ2luIChzbyB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgZmluZHMgdGhlIGRhdGEgb24gaGFuZG9mZikuIFRoZSBMQVRFU1QgZW5kIGFtb25nIGNvdmVyaW5nIHdpbmRvd3MgLSBvdmVybGFwcGluZyB3aW5kb3dzIGhhbmQgb2ZmIGF0IHRoZSBsYXN0IG9uZS4gTm8gd2luZG93IGNvbnRhaW5zIG5vdyAoYW4gaW5lcnQgc3RvcmUsIG9yIGEgbW9tZW50IGJldHdlZW4gb3VyIHdpbmRvd3MpIC0+IDAsIGkuZS4gbm90aGluZyBtYXkgYmUgZGVsYXllZCBhdCBhbGwuICovXG4gICAgcHVibGljIHdyaXRlRmx1c2hEZWFkbGluZSgpOiBudW1iZXIge1xuICAgICAgICAvLyBCZWZvcmUgdXBkYXRlU291cmNlcyBoYXMgcnVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gaG9sZCBhIHdyaXRlIGFueXdheSwgYW5kIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWRcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXMubGVuZ3RoKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd3MpIHtcbiAgICAgICAgICAgIGlmICh3WzBdIDw9IG5vdyAmJiBub3cgPCB3WzFdKSBlbmQgPSBNYXRoLm1heChlbmQsIHdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5kKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGVuZCAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JpdGFibGVTb3VyY2VzKGNvbmZpZz86IHsgaWdub3JlV2luZG93PzogYm9vbGVhbiB9KTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgd3JpdGFibGU6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd3NBY2NlcHRXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgd3JpdGFibGUucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGFibGU7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBzb3VyY2UgKHRoZSBmaXJzdCB3cml0YWJsZSBvbmUpIHBsdXMgZXZlcnkgcm91dGUtbWF0Y2hpbmcgcGVlci4gRWFjaCBzb3VyY2UgZGVjaWRlcyBmb3IgaXRzZWxmIGhvdyBsb25nIGl0IGhvbGRzIHRoZSB3cml0ZSBiZWZvcmUgaXQgaGl0cyBzdG9yYWdlIChzZWUgQXJjaGl2ZXNEZWxheWVkKSAtIGhlcmUgdGhleSBhbGwganVzdCBnZXQgd3JpdHRlbi5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlczogdGhlIHdyaXRlciB3cml0ZXMgaXQgZGlyZWN0bHkgdG8gZWFjaCBub2RlLCBzbyB3ZSBzdG9yZSBpdCBvbiBvdXIgb3duIGRpc2sgb25seSAobm8gdmFsaWQtd2luZG93IGZpbHRlciAtIHJvdXRpbmcvdmFsaWQgd2luZG93cyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGVtKSBhbmQgbmV2ZXIgZm9yd2FyZCBpdCB0byBvdGhlciBzb3VyY2VzLlxuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcImZsdXNoZWRcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgaXNSb3V0aW5nID0ga2V5ID09PSBST1VUSU5HX0ZJTEU7XG4gICAgICAgIGxldCB3cml0YWJsZSA9IHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKHsgaWdub3JlV2luZG93OiBpc1JvdXRpbmcgfSk7XG4gICAgICAgIGxldCBmaXJzdCA9IHdyaXRhYmxlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyAoZXZlcnkgc291cmNlJ3MgdmFsaWQgd2luZG93IGlzIGluIHRoZSBwYXN0KSwgc28gd3JpdGVzIGNhbm5vdCBiZSBzdG9yZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgb3VyIG93biAoZmlyc3QpIHNvdXJjZSBibG9ja3MgdGhlIHdyaXRlLiBEb3duc3RyZWFtIHNvdXJjZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGJhY2tncm91bmQ6IGEgZG93biBkb3duc3RyZWFtIHNvdXJjZSBtdXN0IG5vdCBmYWlsIG9yIHN0YWxsIHdyaXRlcywgYW5kIHJlY29uY2lsaWF0aW9uIHJlLXNlbmRzIGFueXRoaW5nIHRoZXkgbWlzc2VkIG9uY2UgdGhleSBjb21lIGJhY2suXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIGJ5dGVzIFNUQVkgb24gb3VyIGRpc2ssIGFzIGRlbGV0aW9uIGhpc3Rvcnk6IHRoZSBpbmRleCBtYXJrcyB0aGUga2V5IGRlbGV0ZWQgKGtlZXBpbmcgaXRzIHZhbHVlIC0gc2VlIFRyYW5zYWN0aW9uRmlsZS5kZWxldGUpLCByZWFkcyBzdG9wIGZpbmRpbmcgaXQsIGFuZCB0aGUgcmV0ZW50aW9uIHBhc3MgcGh5c2ljYWxseSByZW1vdmVzIHRoZSBvbGRlc3QgaGlzdG9yeSBvbmNlIGl0IG91dGdyb3dzIGl0cyBidWRnZXQgKHNlZSBTdG9yZVN5bmMuZW5mb3JjZUhpc3RvcnlMaW1pdCkuIFRoZSBtYXJrZWQgaW5kZXggZW50cnkgaXMgdGhlIHdob2xlIG9mIHRoZSBsb2NhbCBkZWxldGlvbi5cbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoZmlyc3QpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JvdXRpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgLy8gRGVsZXRpb25zIGRpZCBub3QgY29uc3VtZSB0aGUgZmlyc3Qgc2xvdCAobm90aGluZyBpcyB3cml0dGVuIGFueXdoZXJlIGxvY2FsbHkpLCBzbyBpdCByZWNlaXZlcyB0aGUgcHJvcGFnYXRlZCBkZWxldGlvbiBsaWtlIHRoZSByZXN0IC0gZXhjZXB0IHNsb3QgMCwgb3VyIG93biBkaXNrLCB3aG9zZSBieXRlcyBBUkUgdGhlIGhpc3RvcnkgYmVpbmcga2VwdFxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDAgJiYgZmlyc3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRhYmxlLnVuc2hpZnQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgb2Ygd3JpdGFibGUpIHtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyh0aGlzLnNvdXJjZXNbaV0ucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBEZWxldGlvbnMgdHJhdmVsIGFzIGRlbCBjYXJyeWluZyB0aGUgb3JpZ2luYWwgd3JpdGUgdGltZSAobmV2ZXIgYXMgZW1wdHkgc2V0cyAtIHNldCByZWplY3RzIGVtcHR5IGJ1ZmZlcnMpLiBCYWNrYmxhemUgbWF0ZXJpYWxpemVzIHN1Y2ggZGVscyBhcyByZWFsIGVtcHR5IGZpbGVzLCBzbyBpdHMgbGlzdGluZ3Mgc3RpbGwgc2hvdyB0aGUgZGVsZXRpb24gZm9yIG90aGVyIHN0b3JlcyB0byBzY2FuIGluIGFzIGEgdG9tYnN0b25lLlxuICAgICAgICAgICAgbGV0IHB1c2g6IFByb21pc2U8dW5rbm93bj47XG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwdXNoID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5kZWwoa2V5LCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2b2lkIHB1c2guY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2dyb3VuZCB3cml0ZSBvZiAke2tleX0gdG8gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTbG90IDAgaXMgYWx3YXlzIHRoaXMgc3RvcmUncyBvd24gZm9sZGVyIChzZWUgcGxhblNvdXJjZXMpLCBzbyB0aGUgZGlzayBpcyBrbm93biB3aXRob3V0IHNlYXJjaGluZyBmb3IgaXQgLSBhbmQgaXQgaXMgdGhlIHVud3JhcHBlZCBvbmUsIHBhc3QgYW55IHdyaXRlIGRlbGF5XG4gICAgcHJpdmF0ZSBnZXREaXNrU291cmNlKCk6IHsgZGlzazogQXJjaGl2ZXNEaXNrOyBzb3VyY2VJbmRleDogbnVtYmVyIH0ge1xuICAgICAgICByZXR1cm4geyBkaXNrOiB0aGlzLm93bkRpc2ssIHNvdXJjZUluZGV4OiAwIH07XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBldmVyeXRoaW5nIHN0aWxsIGhlbGQgYnkgYSBkZWxheWVkIHNvdXJjZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkuIGZvcmNlIGFsc28gd3JpdGVzIHdoYXQgaXNuJ3QgZHVlIHlldCAtIHNodXRkb3duIGNhbm5vdCBsZWF2ZSB3cml0ZXMgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hEZWxheWVkV3JpdGVzKGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCB7IHNvdXJjZSB9IG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGRlbGF5ZWQgPSBhc0RlbGF5ZWQoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghZGVsYXllZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBkZWxheWVkLmZsdXNoKGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
1075
+ /* _JS_SOURCE_HASH = "cd5dd24547c9b8d657fc8e48fa868a07a9d8e4191c19d619fbececf89c371543"; */