sliftutils 1.7.109 → 1.7.111

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.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.StoreSync = void 0;
4
4
  const batching_1 = require("socket-function/src/batching");
5
+ const caching_1 = require("socket-function/src/caching");
5
6
  const misc_1 = require("socket-function/src/misc");
6
7
  const format_1 = require("socket-function/src/formatting/format");
7
8
  const IArchives_1 = require("../IArchives");
@@ -40,6 +41,8 @@ const SYNC_FAILURE_DELAY = 1000 * 15;
40
41
  // A full listing that comes back EMPTY - or under half of what we know the source holds - is treated as the other end being briefly broken, not as the truth: it is retried this many times, this far apart, before being believed. Believing a wrongly-shrunken listing purges every index entry the source held, which is how sync progress "goes backwards".
41
42
  const SUSPICIOUS_SCAN_RETRIES = 3;
42
43
  const SUSPICIOUS_SCAN_RETRY_DELAY = 1000 * 60;
44
+ // A source whose every window ended this long ago (and has none in the future) can never receive writes again - the window gates them, deletions included. Scanning such a source can only re-ingest history it will never be told to delete, which after tombstone expiry IS resurrection - so it is not scanned at all. The grace covers handoff stragglers around a window's end.
45
+ const SCAN_STALE_WINDOW_GRACE = 1000 * 60 * 60;
43
46
  function newSourceState() {
44
47
  return {
45
48
  supportsChangesAfter: false,
@@ -63,6 +66,154 @@ class StoreSync {
63
66
  this.evicting = false;
64
67
  // When each key was last served, for readerDiskLimit's LRU eviction. Never persisted (a restart has no opinion about recency), and only kept for keys that have actually been read - an index entry no one has touched falls back to when we last changed it.
65
68
  this.lastAccess = new Map();
69
+ /** One synchronization round of a source: the PULL direction always (its listing, applied to our index), and with "push" the push direction too (what our index says the source is missing, written to it). Push is an argument rather than a separate call because it cannot run without the pull's listing - the index alone cannot say what the source already holds. Listings unblock (initialScan) between the halves, so they never wait behind a push. Only one round per SOURCE runs at a time (cache keys the serializer by source index). */
70
+ this.syncSource = (0, caching_1.cache)((sourceIndex) => (0, batching_1.runInSerial)(async (push) => {
71
+ let listing = await this.pullSource(sourceIndex);
72
+ let state = this.states[sourceIndex];
73
+ state.scanComplete = true;
74
+ state.initialScan.resolve(undefined);
75
+ if (push && !this.store.stopped.stop && !state.stopped.stop) {
76
+ await this.pushSource(sourceIndex, listing);
77
+ }
78
+ }));
79
+ // Downloads the files a source currently holds onto our own base source (the local disk), preserving their modified times — so a newer local write always wins. Skipped for noFullSync sources (fronting a large database without copying it); reads still down-cache lazily. Only one pass per SOURCE runs at a time (cache keys the serializer by source index) - two passes over the same pending list would download everything twice.
80
+ this.copySourceFiles = (0, caching_1.cache)((sourceIndex) => (0, batching_1.runInSerial)(async () => {
81
+ var _a, _b, _c, _d;
82
+ if (sourceIndex === 0)
83
+ return;
84
+ let { source } = this.store.sources[sourceIndex];
85
+ let state = this.states[sourceIndex];
86
+ let pending = [];
87
+ let totalBytes = 0;
88
+ let copiedSourcesListIndex = this.store.sourcesListIndexOfSlot(sourceIndex);
89
+ for (let [key, entry] of this.store.indexEntries()) {
90
+ if (entry.sourcesListIndex !== copiedSourcesListIndex)
91
+ continue;
92
+ pending.push({ key, entry });
93
+ totalBytes += entry.size;
94
+ }
95
+ if (!pending.length)
96
+ return;
97
+ let activity = {
98
+ type: "fullSync",
99
+ sourceDebugName: source.getDebugName(),
100
+ startTime: Date.now(),
101
+ doneFiles: 0,
102
+ totalFiles: pending.length,
103
+ doneBytes: 0,
104
+ totalBytes,
105
+ };
106
+ this.activities.add(activity);
107
+ (0, storageLogs_1.logSyncEvent)({ event: "deltaSyncStart", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, files: pending.length, bytes: totalBytes });
108
+ let progressLogged = false;
109
+ let logProgress = () => {
110
+ progressLogged = true;
111
+ console.log((0, logColors_1.magenta)(`Delta sync from ${source.getDebugName()} (store ${this.store.folder}): ${activity.doneFiles}/${pending.length} files (${((activity.doneFiles || 0) / pending.length * 100).toFixed(1)}%), ${(0, format_1.formatNumber)(activity.doneBytes || 0)}B/${(0, format_1.formatNumber)(totalBytes)}B (${(totalBytes && (activity.doneBytes || 0) / totalBytes * 100 || 100).toFixed(1)}%)`));
112
+ };
113
+ let progressTimer = setInterval(logProgress, SYNC_PROGRESS_LOG_INTERVAL);
114
+ (_b = (_a = progressTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
115
+ let slowErrorTimer = setInterval(() => {
116
+ let elapsed = Date.now() - activity.startTime;
117
+ let doneFiles = activity.doneFiles || 0;
118
+ let doneBytes = activity.doneBytes || 0;
119
+ let bytesPerSecond = doneBytes / (elapsed / 1000);
120
+ let remainingBytes = totalBytes - doneBytes;
121
+ let etaText = "unknown (no bytes transferred yet)";
122
+ if (bytesPerSecond > 0) {
123
+ let remainingMs = remainingBytes / bytesPerSecond * 1000;
124
+ etaText = `${(0, format_1.formatTime)(remainingMs)} remaining, completing around ${new Date(Date.now() + remainingMs).toISOString()}`;
125
+ }
126
+ console.warn(`Delta sync from ${source.getDebugName()} (store ${this.store.folder}) has been running for ${(0, format_1.formatTime)(elapsed)}: ${doneFiles}/${pending.length} files (${(doneFiles / pending.length * 100).toFixed(1)}%), ${(0, format_1.formatNumber)(doneBytes)}B/${(0, format_1.formatNumber)(totalBytes)}B (${(totalBytes && doneBytes / totalBytes * 100 || 100).toFixed(1)}%), ${(0, format_1.formatNumber)(bytesPerSecond)}B/s. Estimated ${etaText}.`);
127
+ }, FULL_SYNC_SLOW_ERROR_INTERVAL);
128
+ (_d = (_c = slowErrorTimer).unref) === null || _d === void 0 ? void 0 : _d.call(_c);
129
+ let failed = 0;
130
+ let copiedFiles = 0;
131
+ let copiedBytes = 0;
132
+ let missingOnSource = 0;
133
+ let aborted = false;
134
+ // The source cannot give us the file (its read had nothing, or it errored). Retrying the same entry forever is not an answer: if our own disk holds a copy, IT becomes the holder; with no local copy either, the entry is purged - forgotten, not deleted, exactly like a read that comes up empty everywhere - and the next full pull re-finds it if it exists anywhere.
135
+ let resolveUnavailable = async (event, key, entry, extra) => {
136
+ let base = { event, store: this.store.folder, source: source.getDebugName(), path: key, expectedSize: entry.size, expectedWriteTime: entry.writeTime, ...extra };
137
+ let local = await this.store.sources[0].source.getInfo(key);
138
+ if (local) {
139
+ // The local copy can be NEWER than the entry (which is exactly why copyArchiveFile refuses to overwrite it - see its destination check), so the repoint keeps the newer of the two times rather than rolling the index back
140
+ this.store.setIndexEntry(key, { writeTime: Math.max(entry.writeTime, local.writeTime), size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
141
+ (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "repointed to our local copy", localSize: local.size, localWriteTime: new Date(local.writeTime).toISOString() });
142
+ return;
143
+ }
144
+ if (this.store.currentWriteTime(key) <= entry.writeTime) {
145
+ this.store.purgeIndexEntry(key);
146
+ (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "purged - neither the source nor our disk has it, so it does not exist" });
147
+ return;
148
+ }
149
+ // A newer write landed while we were checking - the entry is no longer the one we found unavailable, so it is left alone
150
+ (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "kept - a newer write appeared while checking", currentWriteTime: this.store.currentWriteTime(key) });
151
+ };
152
+ try {
153
+ let nextIndex = 0;
154
+ let consecutiveFailures = 0;
155
+ let copyWorker = async () => {
156
+ var _a, _b, _c;
157
+ while (!aborted && !this.store.stopped.stop && !state.stopped.stop) {
158
+ let index = nextIndex++;
159
+ if (index >= pending.length)
160
+ return;
161
+ let { key, entry } = pending[index];
162
+ try {
163
+ let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: source, to: this.store.sources[0].source, path: key, forceSetImmutable: true, noChecks: true, internal: true });
164
+ if (copied) {
165
+ copiedFiles++;
166
+ copiedBytes += copied.size;
167
+ this.store.noteSyncTransfer("sync get", key, copied.size);
168
+ // The copy carries the source's write time, and the index commits it under the normal ordering rule (>= the current time wins) - it refusing means a NEWER write landed while we copied, which must be said, not swallowed
169
+ if (!this.store.setIndexEntry(key, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) })) {
170
+ (0, storageLogs_1.logSyncEvent)({ event: "deltaSyncCommitSuperseded", store: this.store.folder, source: source.getDebugName(), path: key, copiedWriteTime: copied.writeTime, currentWriteTime: this.store.currentWriteTime(key) });
171
+ }
172
+ }
173
+ else {
174
+ missingOnSource++;
175
+ await resolveUnavailable("deltaSyncMissingOnSource", key, entry, {});
176
+ }
177
+ consecutiveFailures = 0;
178
+ }
179
+ catch (e) {
180
+ // A failing file resolves exactly like a missing one (the source cannot give it to us either way), so it never wedges the pass on retries forever - and the next full pull re-finds it if the source recovers
181
+ failed++;
182
+ consecutiveFailures++;
183
+ try {
184
+ await resolveUnavailable("deltaSyncCopyFailed", key, entry, { error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 2000) });
185
+ }
186
+ catch (resolveError) {
187
+ (0, storageLogs_1.logSyncEvent)({ event: "deltaSyncCopyFailed", store: this.store.folder, source: source.getDebugName(), path: key, error: String((_b = e.stack) !== null && _b !== void 0 ? _b : e).slice(0, 2000), resolveError: String((_c = resolveError.stack) !== null && _c !== void 0 ? _c : resolveError).slice(0, 2000) });
188
+ }
189
+ if (consecutiveFailures >= SYNC_MAX_CONSECUTIVE_FAILURES) {
190
+ aborted = true;
191
+ return;
192
+ }
193
+ // A pause per failure, so a down network takes minutes to burn through the consecutive-failure allowance instead of an instant
194
+ await (0, batching_1.delay)(SYNC_FAILURE_DELAY);
195
+ }
196
+ activity.doneFiles = (activity.doneFiles || 0) + 1;
197
+ activity.doneBytes = (activity.doneBytes || 0) + entry.size;
198
+ }
199
+ };
200
+ let workers = [];
201
+ for (let i = 0; i < Math.min(FULL_SYNC_PARALLEL, pending.length); i++) {
202
+ workers.push(copyWorker());
203
+ }
204
+ await Promise.all(workers);
205
+ }
206
+ finally {
207
+ clearInterval(progressTimer);
208
+ clearInterval(slowErrorTimer);
209
+ this.activities.delete(activity);
210
+ // A sync slow enough to have logged progress also logs its completion
211
+ if (progressLogged) {
212
+ logProgress();
213
+ }
214
+ (0, storageLogs_1.logSyncEvent)({ event: "deltaSyncFinish", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, durationMs: Date.now() - activity.startTime, totalFiles: pending.length, totalBytes, processedFiles: activity.doneFiles, copiedFiles, copiedBytes, missingOnSource, failed, aborted });
215
+ }
216
+ }));
66
217
  this.states = store.sources.map(() => newSourceState());
67
218
  }
68
219
  /** Starts every live source's synchronization, plus the maintenance loops. Called once, by the store's init - the store's index must already be loaded, since scans write straight into it. */
@@ -190,17 +341,7 @@ class StoreSync {
190
341
  }
191
342
  /** Rescans our own disk's metadata into the index - used around valid window handoffs, where another process wrote files to the shared folder that our index hasn't seen. */
192
343
  async rescanBase() {
193
- await this.syncSource(0);
194
- }
195
- /** One synchronization round of a source: the PULL direction always (its listing, applied to our index), and with "push" the push direction too (what our index says the source is missing, written to it). Push is an argument rather than a separate call because it cannot run without the pull's listing - the index alone cannot say what the source already holds. Listings unblock (initialScan) between the halves, so they never wait behind a push. */
196
- async syncSource(sourceIndex, push) {
197
- let listing = await this.pullSource(sourceIndex);
198
- let state = this.states[sourceIndex];
199
- state.scanComplete = true;
200
- state.initialScan.resolve(undefined);
201
- if (push && !this.store.stopped.stop && !state.stopped.stop) {
202
- await this.pushSource(sourceIndex, listing);
203
- }
344
+ await this.syncSource(0)();
204
345
  }
205
346
  /** A boundary scan of the node that owned (part of) our route in the valid window before ours, when that node is different storage (a disk rescan can't see its writes): just its changes since the boundary neighborhood, with matching values pulled onto our own disk. */
206
347
  async boundaryScanRemote(source, config) {
@@ -226,6 +367,14 @@ class StoreSync {
226
367
  }
227
368
  let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: source, to: this.store.sources[0].source, path: file.path, forceSetImmutable: true, noChecks: true, internal: true });
228
369
  if (!copied) {
370
+ // Undefined is two cases (see copyArchiveFile): our own disk already holding something newer is the boundary scan working as intended (our writes since the boundary outrank the neighbor's), only a genuinely unreadable file is worth a warning
371
+ let local = await this.store.sources[0].source.getInfo(file.path);
372
+ if (local && local.writeTime > file.createTime) {
373
+ (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanLocalNewer", store: this.store.folder, source: source.getDebugName(), path: file.path, theirWriteTime: new Date(file.createTime).toISOString(), theirSize: file.size, localWriteTime: new Date(local.writeTime).toISOString(), localSize: local.size });
374
+ this.store.setIndexEntry(file.path, { writeTime: local.writeTime, size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
375
+ tally.unchanged++;
376
+ continue;
377
+ }
229
378
  console.warn(`Boundary scan could not copy ${file.path} from ${source.getDebugName()} (store ${this.store.folder}): its change feed listed it (${file.size} bytes, writeTime ${new Date(file.createTime).toISOString()}) but the read found nothing`);
230
379
  continue;
231
380
  }
@@ -246,8 +395,14 @@ class StoreSync {
246
395
  (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - scanStart, since: config.since, changes: changes.length, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone, unchanged: tally.unchanged });
247
396
  }
248
397
  // ── per-source loops ──
398
+ // Slot 0 is exempt: our own disk answers for every window this store EVER held, and scanning it is what keeps the index honest about them. Read live each call - updateSources moves the windows on running slots, so a source goes stale (or comes back) while its loops run.
399
+ windowsAllowScanning(sourceIndex) {
400
+ if (sourceIndex === 0)
401
+ return true;
402
+ return this.store.sources[sourceIndex].validWindows.some(w => w[1] > Date.now() - SCAN_STALE_WINDOW_GRACE);
403
+ }
249
404
  async startSourceSyncLoops(sourceIndex) {
250
- var _a, _b;
405
+ var _a;
251
406
  await this.store.registerSlot(sourceIndex);
252
407
  let sourceObj = this.store.sources[sourceIndex];
253
408
  let source = sourceObj.source;
@@ -262,7 +417,23 @@ class StoreSync {
262
417
  state.initialScan.resolve(undefined);
263
418
  return;
264
419
  }
265
- while (!this.store.stopped.stop && !state.stopped.stop) {
420
+ // Checked per tick, never decided once: the windows move on running slots (see updateSources), so a source goes stale mid-life and can come back if a config extends them. Logged only on each transition into staleness.
421
+ let loggedStale = false;
422
+ let skipStale = () => {
423
+ if (this.windowsAllowScanning(sourceIndex)) {
424
+ loggedStale = false;
425
+ return false;
426
+ }
427
+ state.scanComplete = true;
428
+ state.initialScan.resolve(undefined);
429
+ if (!loggedStale) {
430
+ loggedStale = true;
431
+ (0, storageLogs_1.logSyncEvent)({ event: "scanSkippedStaleWindows", store: this.store.folder, source: source.getDebugName(), validWindows: this.store.sources[sourceIndex].validWindows.map(w => [new Date(w[0]).toISOString(), new Date(w[1]).toISOString()]), graceMs: SCAN_STALE_WINDOW_GRACE });
432
+ }
433
+ return true;
434
+ };
435
+ // An already-stale source skips getConfig entirely: its endpoint is often long gone, and retrying that every 30s forever is noise about a source we would not scan anyway (if its windows are later extended, the full-round poll below picks it up - just without change polling until a restart)
436
+ while (!skipStale() && !this.store.stopped.stop && !state.stopped.stop) {
266
437
  try {
267
438
  let config = await source.getConfig();
268
439
  state.supportsChangesAfter = !!config.supportsChangesAfter;
@@ -275,14 +446,19 @@ class StoreSync {
275
446
  }
276
447
  if (this.store.stopped.stop || state.stopped.stop)
277
448
  return;
278
- let pollInterval = ((_b = sourceObj.sourceConfig) === null || _b === void 0 ? void 0 : _b.type) === "remote" ? FULL_RESCAN_INTERVAL : FULL_RESCAN_NON_REMOTE_INTERVAL;
279
- await (0, batching_1.runInfinitePollCallAtStart)(pollInterval, async () => {
449
+ // Hourly for our own disk (no sourceConfig - a cheap local walk, and how a sibling process's writes into the shared folder are found) and for remote peers (index-backed, cheap listings); the slow interval is only for sources where a full listing is genuinely expensive (backblaze)
450
+ let pollInterval = (!sourceObj.sourceConfig || sourceObj.sourceConfig.type === "remote") && FULL_RESCAN_INTERVAL || FULL_RESCAN_NON_REMOTE_INTERVAL;
451
+ // Both loops below run one at a time: a change-poll tick landing mid full round would otherwise start a second copy pass over the same pending list, downloading everything twice
452
+ let serial = (0, batching_1.runInSerial)(async (fnc) => await fnc());
453
+ await (0, batching_1.runInfinitePollCallAtStart)(pollInterval, () => serial(async () => {
280
454
  var _a;
455
+ if (skipStale())
456
+ return;
281
457
  while (!this.store.stopped.stop && !state.stopped.stop) {
282
458
  try {
283
- await this.syncSource(sourceIndex, "push");
459
+ await this.syncSource(sourceIndex)("push");
284
460
  if (!noFullSync())
285
- await this.copySourceFiles(sourceIndex);
461
+ await this.copySourceFiles(sourceIndex)();
286
462
  }
287
463
  catch (e) {
288
464
  (0, storageLogs_1.logSyncEvent)({ event: "scanFailed", store: this.store.folder, source: source.getDebugName(), retryInMs: SCAN_RETRY_DELAY, error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 2000) });
@@ -293,17 +469,19 @@ class StoreSync {
293
469
  state.initialScan.resolve(undefined);
294
470
  break;
295
471
  }
296
- }, state.stopped);
472
+ }), state.stopped);
297
473
  if (state.supportsChangesAfter) {
298
- (0, batching_1.runInfinitePoll)(CHANGES_POLL_INTERVAL, async () => {
474
+ (0, batching_1.runInfinitePoll)(CHANGES_POLL_INTERVAL, () => serial(async () => {
475
+ if (skipStale())
476
+ return;
299
477
  // A scan that has not succeeded yet is retried HERE, before anything else - polling changes and copying against a never-scanned source would run on arbitrarily stale information
300
478
  if (!state.scanSucceeded) {
301
- await this.syncSource(sourceIndex, "push");
479
+ await this.syncSource(sourceIndex)("push");
302
480
  }
303
481
  await this.pollChanges(sourceIndex);
304
482
  if (!noFullSync())
305
- await this.copySourceFiles(sourceIndex);
306
- }, state.stopped);
483
+ await this.copySourceFiles(sourceIndex)();
484
+ }), state.stopped);
307
485
  }
308
486
  }
309
487
  // The PULL direction: a full metadata scan (size, writeTime, path) of one source, applied to our index. Returns the source's listing (path -> write time), which pushSource uses for the opposite direction.
@@ -448,8 +626,17 @@ class StoreSync {
448
626
  if (!holder)
449
627
  continue;
450
628
  let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: holder, to: source, path: key, forceSetImmutable: true, noChecks: true, internal: true });
451
- if (!copied)
629
+ if (!copied) {
630
+ // Undefined is two cases (see copyArchiveFile). The source having a NEWER file than our index (the listing we pushed from was stale) is adopted exactly the way the pull direction adopts a listing entry - and pushing our stale copy stops. Otherwise the HOLDER could not produce the file, which the next round's pull re-resolves; either way, silence here was the bug.
631
+ let theirs = await source.getInfo(key);
632
+ if (theirs && theirs.writeTime > writeTime) {
633
+ this.store.setIndexEntry(key, { writeTime: theirs.writeTime, size: theirs.size, sourcesListIndex: targetSourcesListIndex });
634
+ (0, storageLogs_1.logSyncEvent)({ event: "pushFoundNewerOnSource", store: this.store.folder, source: source.getDebugName(), path: key, ourWriteTime: new Date(writeTime).toISOString(), theirWriteTime: new Date(theirs.writeTime).toISOString(), ourSize: entry.size, theirSize: theirs.size });
635
+ continue;
636
+ }
637
+ (0, storageLogs_1.logSyncEvent)({ event: "pushCopyUnavailable", store: this.store.folder, source: source.getDebugName(), path: key, holder: holder.getDebugName(), expectedSize: entry.size, expectedWriteTime: new Date(writeTime).toISOString(), sourceHas: theirs && `${theirs.size} bytes at ${new Date(theirs.writeTime).toISOString()}` || "nothing" });
452
638
  continue;
639
+ }
453
640
  this.store.noteSyncTransfer("sync set", key, copied.size);
454
641
  pushed++;
455
642
  consecutiveFailures = 0;
@@ -518,143 +705,6 @@ class StoreSync {
518
705
  state.scannedCount += changes.length;
519
706
  state.changesAfterTime = pollStart - CHANGES_POLL_OVERLAP;
520
707
  }
521
- // Downloads the files a source currently holds onto our own base source (the local disk), preserving their modified times — so a newer local write always wins. Skipped for noFullSync sources (fronting a large database without copying it); reads still down-cache lazily.
522
- async copySourceFiles(sourceIndex) {
523
- var _a, _b, _c, _d;
524
- if (sourceIndex === 0)
525
- return;
526
- let { source } = this.store.sources[sourceIndex];
527
- let state = this.states[sourceIndex];
528
- let pending = [];
529
- let totalBytes = 0;
530
- let copiedSourcesListIndex = this.store.sourcesListIndexOfSlot(sourceIndex);
531
- for (let [key, entry] of this.store.indexEntries()) {
532
- if (entry.sourcesListIndex !== copiedSourcesListIndex)
533
- continue;
534
- pending.push({ key, entry });
535
- totalBytes += entry.size;
536
- }
537
- if (!pending.length)
538
- return;
539
- let activity = {
540
- type: "fullSync",
541
- sourceDebugName: source.getDebugName(),
542
- startTime: Date.now(),
543
- doneFiles: 0,
544
- totalFiles: pending.length,
545
- doneBytes: 0,
546
- totalBytes,
547
- };
548
- this.activities.add(activity);
549
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncStart", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, files: pending.length, bytes: totalBytes });
550
- let progressLogged = false;
551
- let logProgress = () => {
552
- progressLogged = true;
553
- console.log((0, logColors_1.magenta)(`Full sync from ${source.getDebugName()} (store ${this.store.folder}): ${activity.doneFiles}/${pending.length} files (${((activity.doneFiles || 0) / pending.length * 100).toFixed(1)}%), ${(0, format_1.formatNumber)(activity.doneBytes || 0)}B/${(0, format_1.formatNumber)(totalBytes)}B (${(totalBytes && (activity.doneBytes || 0) / totalBytes * 100 || 100).toFixed(1)}%)`));
554
- };
555
- let progressTimer = setInterval(logProgress, SYNC_PROGRESS_LOG_INTERVAL);
556
- (_b = (_a = progressTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
557
- let slowErrorTimer = setInterval(() => {
558
- let elapsed = Date.now() - activity.startTime;
559
- let doneFiles = activity.doneFiles || 0;
560
- let doneBytes = activity.doneBytes || 0;
561
- let bytesPerSecond = doneBytes / (elapsed / 1000);
562
- let remainingBytes = totalBytes - doneBytes;
563
- let etaText = "unknown (no bytes transferred yet)";
564
- if (bytesPerSecond > 0) {
565
- let remainingMs = remainingBytes / bytesPerSecond * 1000;
566
- etaText = `${(0, format_1.formatTime)(remainingMs)} remaining, completing around ${new Date(Date.now() + remainingMs).toISOString()}`;
567
- }
568
- console.warn(`Full sync from ${source.getDebugName()} (store ${this.store.folder}) has been running for ${(0, format_1.formatTime)(elapsed)}: ${doneFiles}/${pending.length} files (${(doneFiles / pending.length * 100).toFixed(1)}%), ${(0, format_1.formatNumber)(doneBytes)}B/${(0, format_1.formatNumber)(totalBytes)}B (${(totalBytes && doneBytes / totalBytes * 100 || 100).toFixed(1)}%), ${(0, format_1.formatNumber)(bytesPerSecond)}B/s. Estimated ${etaText}.`);
569
- }, FULL_SYNC_SLOW_ERROR_INTERVAL);
570
- (_d = (_c = slowErrorTimer).unref) === null || _d === void 0 ? void 0 : _d.call(_c);
571
- let failed = 0;
572
- let copiedFiles = 0;
573
- let copiedBytes = 0;
574
- let missingOnSource = 0;
575
- let aborted = false;
576
- // The source cannot give us the file (its read had nothing, or it errored). Retrying the same entry forever is not an answer: if our own disk holds a copy, IT becomes the holder; with no local copy either, the entry is purged - forgotten, not deleted, exactly like a read that comes up empty everywhere - and the next full pull re-finds it if it exists anywhere.
577
- let resolveUnavailable = async (event, key, entry, extra) => {
578
- let base = { event, store: this.store.folder, source: source.getDebugName(), path: key, expectedSize: entry.size, expectedWriteTime: entry.writeTime, ...extra };
579
- let local = await this.store.sources[0].source.getInfo(key);
580
- if (local) {
581
- this.store.setIndexEntry(key, { writeTime: entry.writeTime, size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
582
- (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "repointed to our local copy", localSize: local.size });
583
- return;
584
- }
585
- if (this.store.currentWriteTime(key) <= entry.writeTime) {
586
- this.store.purgeIndexEntry(key);
587
- (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "purged - neither the source nor our disk has it, so it does not exist" });
588
- return;
589
- }
590
- // A newer write landed while we were checking - the entry is no longer the one we found unavailable, so it is left alone
591
- (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "kept - a newer write appeared while checking", currentWriteTime: this.store.currentWriteTime(key) });
592
- };
593
- try {
594
- let nextIndex = 0;
595
- let consecutiveFailures = 0;
596
- let copyWorker = async () => {
597
- var _a, _b, _c;
598
- while (!aborted && !this.store.stopped.stop && !state.stopped.stop) {
599
- let index = nextIndex++;
600
- if (index >= pending.length)
601
- return;
602
- let { key, entry } = pending[index];
603
- try {
604
- let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: source, to: this.store.sources[0].source, path: key, forceSetImmutable: true, noChecks: true, internal: true });
605
- if (copied) {
606
- copiedFiles++;
607
- copiedBytes += copied.size;
608
- this.store.noteSyncTransfer("sync get", key, copied.size);
609
- // The copy carries the source's write time, and the index commits it under the normal ordering rule (>= the current time wins) - it refusing means a NEWER write landed while we copied, which must be said, not swallowed
610
- if (!this.store.setIndexEntry(key, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) })) {
611
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncCommitSuperseded", store: this.store.folder, source: source.getDebugName(), path: key, copiedWriteTime: copied.writeTime, currentWriteTime: this.store.currentWriteTime(key) });
612
- }
613
- }
614
- else {
615
- missingOnSource++;
616
- await resolveUnavailable("fullSyncMissingOnSource", key, entry, {});
617
- }
618
- consecutiveFailures = 0;
619
- }
620
- catch (e) {
621
- // A failing file resolves exactly like a missing one (the source cannot give it to us either way), so it never wedges the pass on retries forever - and the next full pull re-finds it if the source recovers
622
- failed++;
623
- consecutiveFailures++;
624
- try {
625
- await resolveUnavailable("fullSyncCopyFailed", key, entry, { error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 2000) });
626
- }
627
- catch (resolveError) {
628
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncCopyFailed", store: this.store.folder, source: source.getDebugName(), path: key, error: String((_b = e.stack) !== null && _b !== void 0 ? _b : e).slice(0, 2000), resolveError: String((_c = resolveError.stack) !== null && _c !== void 0 ? _c : resolveError).slice(0, 2000) });
629
- }
630
- if (consecutiveFailures >= SYNC_MAX_CONSECUTIVE_FAILURES) {
631
- aborted = true;
632
- return;
633
- }
634
- // A pause per failure, so a down network takes minutes to burn through the consecutive-failure allowance instead of an instant
635
- await (0, batching_1.delay)(SYNC_FAILURE_DELAY);
636
- }
637
- activity.doneFiles = (activity.doneFiles || 0) + 1;
638
- activity.doneBytes = (activity.doneBytes || 0) + entry.size;
639
- }
640
- };
641
- let workers = [];
642
- for (let i = 0; i < Math.min(FULL_SYNC_PARALLEL, pending.length); i++) {
643
- workers.push(copyWorker());
644
- }
645
- await Promise.all(workers);
646
- }
647
- finally {
648
- clearInterval(progressTimer);
649
- clearInterval(slowErrorTimer);
650
- this.activities.delete(activity);
651
- // A sync slow enough to have logged progress also logs its completion
652
- if (progressLogged) {
653
- logProgress();
654
- }
655
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncFinish", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, durationMs: Date.now() - activity.startTime, totalFiles: pending.length, totalBytes, processedFiles: activity.doneFiles, copiedFiles, copiedBytes, missingOnSource, failed, aborted });
656
- }
657
- }
658
708
  // ── maintenance ──
659
709
  // readerDiskLimit: the disk is only a bounded read cache, so once it exceeds the limit, the least recently used files are deleted from it - but ONLY when another source verifiably holds a same-or-newer copy (the only copy of a file is never deleted), and the index entry repoints to that source so reads keep working (re-caching on the next read).
660
710
  async enforceDiskLimit() {
@@ -774,5 +824,5 @@ class StoreSync {
774
824
  }
775
825
  }
776
826
  exports.StoreSync = StoreSync;
777
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUFrRztBQUNsRyxtREFBMEU7QUFDMUUsa0VBQWlGO0FBQ2pGLDRDQUdzQjtBQUN0QixzREFBb0Q7QUFDcEQsNENBQWlEO0FBQ2pELGlEQUEyRztBQUUzRywyQ0FBa0U7QUFDbEUsK0NBQTZDO0FBQzdDLHdFQUFtRTtBQUVuRSxrYkFBa2I7QUFFbGIseUVBQXlFO0FBQ3pFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtTUFBbU07QUFDbk0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQyxrUUFBa1E7QUFDbFEsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QyxNQUFNLCtCQUErQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxvTEFBb0w7QUFDcEwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsbUZBQW1GO0FBQ25GLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM3QyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDNUMsd0lBQXdJO0FBQ3hJLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLDhLQUE4SztBQUM5SyxNQUFNLDZCQUE2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T0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFBRSxPQUFPO1lBQ3BDLElBQUksVUFBVSxJQUFJLE9BQU87Z0JBQUUsTUFBTTtZQUNqQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsVUFBVSxJQUFJLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNWLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSx3QkFBd0IsSUFBQSxxQkFBWSxFQUFDLGdCQUFnQixDQUFDLGFBQWEsSUFBQSxxQkFBWSxFQUFDLE9BQU8sQ0FBQywyQkFBMkIsT0FBTyx5QkFBeUIsSUFBQSxxQkFBWSxFQUFDLFlBQVksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQzdSLENBQUM7Q0FDSjtBQS9wQkQsOEJBK3BCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCwgZGVsYXksIHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCwgcHJvbWlzZU9iaiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VSb3V0aW5nRGF0YSwgZ2V0Q29uZmlnVmVyc2lvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBCbG9iU3RvcmUsIEluZGV4RW50cnkgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGdldEhpc3RvcnlGYWN0b3IsIEhJU1RPUllfTUlOX0JZVEVTIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBsb2dTeW5jRXZlbnQgfSBmcm9tIFwiLi9zdG9yYWdlTG9nc1wiO1xuaW1wb3J0IHsgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5cbi8vIEV2ZXJ5dGhpbmcgdGhhdCBrZWVwcyBhIHN0b3JlJ3MgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggaXRzIHNvdXJjZXMsIHBsdXMgdGhlIHR3byBtYWludGVuYW5jZSBsb29wcyB0aGF0IGZvbGxvdyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGV2aWN0aW5nIGEgYm91bmRlZCBkaXNrIGNhY2hlLCBleHBpcmluZyB0b21ic3RvbmVzKS4gVGhlIHN0b3JlIG93bnMgdGhlIHNvdXJjZXMgYW5kIGRlY2lkZXMgd2hlcmUgd3JpdGVzIGdvOyB0aGlzIGRlY2lkZXMgd2hhdCBpcyBzY2FubmVkLCBwdWxsZWQsIHB1c2hlZCwgZXZpY3RlZCwgYW5kIGZvcmdvdHRlbiAtIHNvIHRoZSB3cml0ZSBwYXRoIHN0YXlzIHJlYWRhYmxlIHdpdGhvdXQgdGhlIHNldmVyYWwgaHVuZHJlZCBsaW5lcyBvZiBzeW5jaHJvbml6YXRpb24gbWFjaGluZXJ5IGludGVybGVhdmVkIGludG8gaXQuXG5cbi8vIFNvdXJjZXMgd2l0aCBhIG5hdGl2ZSAoaW5kZXgtYmFja2VkKSBjaGFuZ2UgZmVlZCBhcmUgcG9sbGVkIHRoaXMgb2Z0ZW5cbmNvbnN0IENIQU5HRVNfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBjaGVja2VkIGZvciBvbiBldmVyeSBwZWVyIHRoaXMgb2Z0ZW4gLSBmYXIgbW9yZSBvZnRlbiB0aGFuIGEgZnVsbCByZXNjYW4sIGJlY2F1c2UgaXQgaXMgdGhlIGZpbGUgdGhhdCBkZWNpZGVzIHdoYXQgZXZlcnl0aGluZyBlbHNlIGRvZXMsIGFuZCBpdCBpcyBvbmUgc21hbGwgcmVhZCBwZXIgcGVlclxuY29uc3QgQ09ORklHX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjAgKiA1O1xuLy8gRnVsbCBtZXRhZGF0YSByZXNjYW5zLiBzdXBwb3J0c0NoYW5nZXNBZnRlciBpcyB0aGUgaGV1cmlzdGljIGZvciBcIm9uZSBvZiBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyc1wiOiB0aGVpciBpbmRleC1iYWNrZWQgbGlzdGluZ3MgYXJlIGNoZWFwLCBzbyBob3VybHkgaXMgZmluZS4gRXZlcnl0aGluZyBlbHNlIChiYWNrYmxhemUsIHBsYWluIGRpc2spIHBheXMgdGhlIGZ1bGwgbGlzdGluZyBjb3N0LCBzbyBpdCByZXNjYW5zIG11Y2ggbGVzcyBvZnRlbi5cbmNvbnN0IEZVTExfUkVTQ0FOX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG5jb25zdCBGVUxMX1JFU0NBTl9OT05fUkVNT1RFX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiA2O1xuLy8gQ2hhbmdlIHBvbGxzIHJlLXJlcXVlc3QgdGhpcyBtdWNoIG92ZXJsYXAsIHNvIGNsb2NrIHNrZXcgYmV0d2VlbiB1cyBhbmQgYSBzb3VyY2UgY2FuJ3QgZHJvcCBjaGFuZ2VzXG5jb25zdCBDSEFOR0VTX1BPTExfT1ZFUkxBUCA9IHRpbWVJbk1pbnV0ZTtcbmNvbnN0IFNDQU5fUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG4vLyBEZWxldGVzIGFyZSB0b21ic3RvbmVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpcyB3aGF0IGxldHMgYSBkZWxldGlvbiBwcm9wYWdhdGUvcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLCBhbmQgaXQgZXhwaXJlcyBhZnRlciB0aGlzIGxvbmdcbmNvbnN0IFRPTUJTVE9ORV9FWFBJUlkgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogNztcbmNvbnN0IFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBXaGlsZSBhIG1ldGFkYXRhIHNjYW4gb3IgZnVsbCBzeW5jIGlzIHJ1bm5pbmcsIGl0cyBwcm9ncmVzcyBpcyBsb2dnZWQgdGhpcyBvZnRlblxuY29uc3QgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDAwICogNjA7XG5jb25zdCBESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gRnVsbCBzeW5jcyBkb3dubG9hZCB0aGlzIG1hbnkgZmlsZXMgY29uY3VycmVudGx5IChoaWdoLWxhdGVuY3kgc291cmNlcyBsaWtlIGJhY2tibGF6ZSB3b3VsZCBvdGhlcndpc2UgY3Jhd2wgb25lIHJvdW5kLXRyaXAgYXQgYSB0aW1lKVxuY29uc3QgRlVMTF9TWU5DX1BBUkFMTEVMID0gODtcbi8vIEEgZnVsbCBzeW5jIHJ1bm5pbmcgbG9uZ2VyIHRoYW4gdGhpcyBpcyBjb25zb2xlLmVycm9yZWQgKGFuZCBhZ2FpbiBldmVyeSBpbnRlcnZhbCBhZnRlciksIHNvIGEgc3luYyB0aGF0IHdpbGwgdGFrZSBkYXlzIGlzIGxvdWQgaW5zdGVhZCBvZiBhIHF1aWV0IGNvbnNvbGUubG9nIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFJlY29uY2lsZSBwYXNzZXMgQU5EIGZ1bGwgc3luY3Mgc2tpcCBmYWlsaW5nIGZpbGVzIChvbmUgYmFkIHZhbHVlIG11c3Qgbm90IHN0b3AgdGhlIHJlc3QgLSBhIHNvdXJjZSBmYWlsaW5nIG9uZSByZXF1ZXN0IGluIGEgdGhvdXNhbmQgY291bGQgb3RoZXJ3aXNlIG5ldmVyIGZpbmlzaCBhIHN5bmMpLCBidXQgdGhpcyBtYW55IGZhaWx1cmVzIGluIGEgcm93IG1lYW5zIHRoZSBvdGhlciBzaWRlIGl0c2VsZiBpcyBkb3duLCBzbyB0aGUgcGFzcyBhYm9ydHMgdW50aWwgdGhlIG5leHQgY3ljbGVcbmNvbnN0IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gNTtcbmNvbnN0IFNZTkNfRVJST1JfTE9HX0xJTUlUID0gMztcbi8vIEV2ZXJ5IGZhaWxlZCBmaWxlIHdhaXRzIHRoaXMgbG9uZyBiZWZvcmUgdGhlIHBhc3MgY29udGludWVzLCBzbyBhIGRvd24gbmV0d29yayBidXJucyB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBvdmVyIGEgbWludXRlLXBsdXMgaW5zdGVhZCBvZiBpbiBhbiBpbnN0YW50XG5jb25zdCBTWU5DX0ZBSUxVUkVfREVMQVkgPSAxMDAwICogMTU7XG4vLyBBIGZ1bGwgbGlzdGluZyB0aGF0IGNvbWVzIGJhY2sgRU1QVFkgLSBvciB1bmRlciBoYWxmIG9mIHdoYXQgd2Uga25vdyB0aGUgc291cmNlIGhvbGRzIC0gaXMgdHJlYXRlZCBhcyB0aGUgb3RoZXIgZW5kIGJlaW5nIGJyaWVmbHkgYnJva2VuLCBub3QgYXMgdGhlIHRydXRoOiBpdCBpcyByZXRyaWVkIHRoaXMgbWFueSB0aW1lcywgdGhpcyBmYXIgYXBhcnQsIGJlZm9yZSBiZWluZyBiZWxpZXZlZC4gQmVsaWV2aW5nIGEgd3JvbmdseS1zaHJ1bmtlbiBsaXN0aW5nIHB1cmdlcyBldmVyeSBpbmRleCBlbnRyeSB0aGUgc291cmNlIGhlbGQsIHdoaWNoIGlzIGhvdyBzeW5jIHByb2dyZXNzIFwiZ29lcyBiYWNrd2FyZHNcIi5cbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTID0gMztcbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiA2MDtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgYSBzY2FuIG9mIHRoaXMgc291cmNlIGhhcyBldmVyIGFjdHVhbGx5IFNVQ0NFRURFRCAtIHdoYXQgZnVsbCBzeW5jcyBnYXRlIG9uOiB3aXRob3V0IG9uZSwgdGhlIGluZGV4J3MgdmlldyBvZiB0aGlzIHNvdXJjZSBjYW4gYmUgYXJiaXRyYXJpbHkgc3RhbGUgKGUuZy4gaXQgd2FzIHJlc3RhcnRpbmcgd2hlbiB3ZSBmaXJzdCB0cmllZCksIGFuZCBzeW5jaW5nIGZyb20gc3RhbGUgaW5mb3JtYXRpb24gY2h1cm5zIGZvcmV2ZXJcbiAgICBzY2FuU3VjY2VlZGVkOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlcjIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgLy8gUGVyLXNsb3Qgc3RvcCB0b2tlbjogYSByZW1vdmVkIHNvdXJjZSdzIGxvb3BzIHN0b3Agd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc3RvcmVcbiAgICBzdG9wcGVkOiB7IHN0b3A6IGJvb2xlYW4gfTtcbiAgICAvLyBBIHJlbW92ZWQgc291cmNlJ3Mgc2xvdCBzdGF5cyBpbiB0aGUgYXJyYXlzICh0aGV5IGFyZSBuZXZlciBzcGxpY2VkLCBzbyBzbG90IG51bWJlcnMgaGVsZCBieSBydW5uaW5nIGxvb3BzIHN0YXkgbWVhbmluZ2Z1bCksIG1hcmtlZCBkZWFkIC0gbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gSW5kZXggZW50cmllcyBkb24ndCByZWZlcmVuY2Ugc2xvdHMgYXQgYWxsOyB0aGV5IHBlcnNpc3QgdGhlIHNvdXJjZXMgbGlzdCdzIHNvdXJjZXNMaXN0SW5kZXguXG4gICAgZGVhZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBuZXdTb3VyY2VTdGF0ZSgpOiBTb3VyY2VTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FuU3VjY2VlZGVkOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVN5bmMge1xuICAgIC8vIFBlciBzb3VyY2Ugc2xvdCwgaW4gc3RlcCB3aXRoIHRoZSBzdG9yZSdzIHNvdXJjZXMgYXJyYXkuIFNsb3RzIGFyZSBuZXZlciBzcGxpY2VkIG91dCAtIGEgcmVtb3ZlZCBvbmUgaXMgbWFya2VkIGRlYWQgLSBzbyBhIHNsb3QgbnVtYmVyIGhlbGQgYnkgYSBydW5uaW5nIGxvb3AgYWx3YXlzIG1lYW5zIHRoZSBzYW1lIHNvdXJjZS5cbiAgICBwcml2YXRlIHN0YXRlczogU291cmNlU3RhdGVbXTtcbiAgICAvLyBTY2FucyAvIGZ1bGwgc3luY3MgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIGFjdGl2aXRpZXMgPSBuZXcgU2V0PFN5bmNBY3Rpdml0eT4oKTtcbiAgICAvLyBHdWFyZHMgYWdhaW5zdCBhIHNlY29uZCBldmljdGlvbiBwYXNzIHN0YXJ0aW5nIHdoaWxlIG9uZSBpcyBzdGlsbCB3YWxraW5nIHRoZSBpbmRleFxuICAgIHByaXZhdGUgZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAvLyBXaGVuIGVhY2gga2V5IHdhcyBsYXN0IHNlcnZlZCwgZm9yIHJlYWRlckRpc2tMaW1pdCdzIExSVSBldmljdGlvbi4gTmV2ZXIgcGVyc2lzdGVkIChhIHJlc3RhcnQgaGFzIG5vIG9waW5pb24gYWJvdXQgcmVjZW5jeSksIGFuZCBvbmx5IGtlcHQgZm9yIGtleXMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gcmVhZCAtIGFuIGluZGV4IGVudHJ5IG5vIG9uZSBoYXMgdG91Y2hlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0LlxuICAgIHByaXZhdGUgbGFzdEFjY2VzcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBCbG9iU3RvcmUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBzdG9yZS5zb3VyY2VzLm1hcCgoKSA9PiBuZXdTb3VyY2VTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogU3RhcnRzIGV2ZXJ5IGxpdmUgc291cmNlJ3Mgc3luY2hyb25pemF0aW9uLCBwbHVzIHRoZSBtYWludGVuYW5jZSBsb29wcy4gQ2FsbGVkIG9uY2UsIGJ5IHRoZSBzdG9yZSdzIGluaXQgLSB0aGUgc3RvcmUncyBpbmRleCBtdXN0IGFscmVhZHkgYmUgbG9hZGVkLCBzaW5jZSBzY2FucyB3cml0ZSBzdHJhaWdodCBpbnRvIGl0LiAqL1xuICAgIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXJ0U291cmNlU3luY0xvb3BzKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChDT05GSUdfUE9MTF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5wb2xsUm91dGluZ0NvbmZpZygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuY2xlYW51cFRvbWJzdG9uZXMoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmVuZm9yY2VIaXN0b3J5TGltaXQoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgLy8gUmVhZCBsaXZlOiB0aGUgbGltaXQgY29tZXMgZnJvbSB0aGUgY29uZmlnLCBzbyBhIHN0b3JlIHRoYXQgZ2FpbnMgb25lIGxhdGVyIHN0YXJ0cyBlbmZvcmNpbmcgaXQgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWRcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFza3MgZXZlcnkgcGVlciBmb3IgdGhlIHJvdXRpbmcgY29uZmlnLCBhbmQgdGFrZXMgaXQgaWYgaXQgaXMgbmV3ZXIgdGhhbiBvdXJzLiBUaGlzIGlzIHRoZSB3aG9sZVxuICAgICAqIG9mIGNvbmZpZ3VyYXRpb24gcHJvcGFnYXRpb246IGl0IHJpZGVzIGJlc2lkZSB0aGUgc2NhbnMgcmF0aGVyIHRoYW4gYmVpbmcgcGFydCBvZiB0aGVtLCBiZWNhdXNlXG4gICAgICogb25lIHNtYWxsIHJlYWQgaXMgd29ydGggZG9pbmcgZXZlcnkgZmV3IG1pbnV0ZXMgd2hpbGUgYSBmdWxsIGxpc3RpbmcgaXMgbm90LCBhbmQgYmVjYXVzZSBhXG4gICAgICogY29uZmlnIHdlIGFyZSBtaXNzaW5nIGlzIHdoYXQgc3RvcHMgZXZlcnl0aGluZyBlbHNlIGZyb20gYmVpbmcgcmlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgY29weSBpcyBzdG9yZWQgdGhlIHNhbWUgd2F5IGEgc2NhbiBzdG9yZXMgYW55dGhpbmcgaXQgcHVsbHMgLSBhbiBpbnRlcm5hbCB3cml0ZSBpbnRvIG91ciBvd25cbiAgICAgKiBzdG9yZSAtIGFuZCB0aGUgc3RvcmUgbm90aWNlcyB0aGF0IGZpbGUgbGFuZGluZyBhbmQgcmUtY29uZmlndXJlcyBpdHNlbGYuIE5vdGhpbmcgaGVyZSBrbm93cyB3aGF0XG4gICAgICogYSBjb25maWcgbWVhbnM7IGl0IG9ubHkga25vd3MgdGhpcyBvbmUgZmlsZSBpcyB3b3J0aCBhc2tpbmcgZm9yIG9mdGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcG9sbFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbaV0uaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldDIoUk9VVElOR19GSUxFLCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGhlaXJzIHx8ICF0aGVpcnMuZGF0YSB8fCAhdGhlaXJzLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbiA9IGdldENvbmZpZ1ZlcnNpb24ocGFyc2VSb3V0aW5nRGF0YSh0aGVpcnMuZGF0YSkpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IHRoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHt2ZXJzaW9ufSBmb3VuZCBvbiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHdlIGhhdmUgJHt0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCl9LCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHRha2luZyBpdGApO1xuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgTk9XLCBub3Qgd2l0aCB0aGVpciB3cml0ZSB0aW1lOiBjb25maWdzIGFyZSBvcmRlcmVkIGJ5IHZlcnNpb24sIGFuZCB0aGlzIG9uZSBpcyBuZXdlciBieSB0aGF0IG9yZGVyaW5nLiBUaGVpciBmaWxlIGNhbiBlYXNpbHkgYmUgb2xkZXIgYnkgd3JpdGUgdGltZSAob3VycyB3YXMgcmV3cml0dGVuIGxvY2FsbHkgbW9yZSByZWNlbnRseSksIGFuZCB0aGUgc3RvcmUncyBvbmx5LXRha2UtdGhlLWxhdGVzdCBydWxlIHdvdWxkIHRoZW4gZHJvcCBpdCAtIGxlYXZpbmcgdXMgZmluZGluZyB0aGUgc2FtZSBuZXdlciB2ZXJzaW9uIG9uIGV2ZXJ5IHBvbGwgYW5kIG5ldmVyIGFkb3B0aW5nIGl0LlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiB0aGVpcnMuZGF0YSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIHBlZXIgdGhhdCBjYW5ub3QgYW5zd2VyIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgYSBzb3VyY2UgdGhhdCBpcyBkb3duOyB0aGUgbmV4dCBwb2xsIGFza3MgYWdhaW5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZm9yIGEgbmV3ZXIgcm91dGluZyBjb25maWcgZmFpbGVkIChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU3RvcHMgZXZlcnkgc291cmNlJ3MgbG9vcHMgKHRoZSBzdG9yZSdzIG93biBzdG9wIHRva2VuIHN0b3BzIHRoZSBtYWludGVuYW5jZSBsb29wcykuICovXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgc2xvdCB0aGUgc3RvcmUganVzdCBhcHBlbmRlZCB0byBpdHMgc291cmNlcyBhcnJheTogaXQgc3RhcnRzIGZyb20gbm90aGluZywgc28gaXQgZ2V0cyBhIGZ1bGwgc2Nhbi4gKi9cbiAgICBwdWJsaWMgYWRkU291cmNlKHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlc1tzbG90XSA9IG5ld1NvdXJjZVN0YXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RhcnRTb3VyY2VTeW5jTG9vcHMoc2xvdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHNsb3Qgc3RheXMgaW4gdGhlIHN0b3JlJ3MgYXJyYXlzIGZvcmV2ZXIgKHJ1bm5pbmcgbG9vcHMgaG9sZCBzbG90IG51bWJlcnMpOyBpdCBqdXN0IGdvZXMgZGVhZCAtIGxvb3BzIHN0b3AsIGFuZCBpdHMgaW5kZXggZW50cmllcyBkcm9wIChvdGhlciBzb3VyY2VzJyBzY2FucyByZS1maW5kIGFueSBjb3B5IHRoYXQncyBzdGlsbCByZWFjaGFibGUgdGhyb3VnaCB0aGUgbmV3IGNvbmZpZykuICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVNvdXJjZShzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc2xvdF07XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBzdGF0ZS5kZWFkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBsZXQgc291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdCk7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYmUgYW5vdGhlciBsaXZlIHNsb3QgKG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93KSAtIHRoZSBlbmRwb2ludCBpcyBzdGlsbCBjb25maWd1cmVkLCBzbyBpdHMgZW50cmllcyBzdGF5XG4gICAgICAgIGlmIChzb3VyY2VzTGlzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdG9yZS5zbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBzb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBGb3Jnb3R0ZW4sIG5vdCBkZWxldGVkOiB0aGUgZmlsZXMgc3RpbGwgZXhpc3Qgd2hlcmV2ZXIgdGhhdCBzb3VyY2UgcHV0IHRoZW0sIHdlIGp1c3Qgbm8gbG9uZ2VyIGhhdmUgYSB3YXkgdG8gcmVhY2ggdGhlbVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCBhbmQgJHtkcm9wcGVkfSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgd2VyZSBkcm9wcGVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCAoaXRzIFVSTCBpcyBzdGlsbCBzZXJ2ZWQgYnkgYW5vdGhlciBzbG90LCBzbyBpdHMgaW5kZXggZW50cmllcyBzdGF5KWApO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGEgc2xvdCBpcyBzdGlsbCBjb25maWd1cmVkLiBEZWFkIHNsb3RzIGFyZSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiAqL1xuICAgIHB1YmxpYyBpc0xpdmUoc2xvdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3RvcmUuc291cmNlc1tzbG90XSAmJiAhdGhpcy5zdGF0ZXNbc2xvdF0/LmRlYWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2aXRpZXMoKTogU3luY0FjdGl2aXR5W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZpdGllc107XG4gICAgfVxuXG4gICAgLyoqIEEga2V5IHdhcyBqdXN0IHNlcnZlZCwgc28gaXQgZ29lcyB0byB0aGUgYmFjayBvZiB0aGUgZXZpY3Rpb24gcXVldWUuICovXG4gICAgcHVibGljIG5vdGVBY2Nlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzLnNldChrZXksIERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdGhlIGluZGV4IHN0aWxsIGhvbGRzIGV4YWN0bHkgdGhlIGVudHJ5IGEgcGFzcyBwaWNrZWQgdXAgZWFybGllci4gSW5kZXggcm93cyBhcmUgcmVhZCBvdXQgb2YgdGhlIGRhdGFiYXNlIHBlciBsb29rdXAsIHNvIHRoaXMgY29tcGFyZXMgdGhlIHJvdywgbm90IHRoZSBvYmplY3QgLSBhIHdyaXRlIGxhbmRpbmcgbWlkLXBhc3MgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdGhyZWUuXG4gICAgcHJpdmF0ZSBlbnRyeVVuY2hhbmdlZChrZXk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnkpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjdXJyZW50LndyaXRlVGltZSA9PT0gZW50cnkud3JpdGVUaW1lICYmIGN1cnJlbnQuc2l6ZSA9PT0gZW50cnkuc2l6ZSAmJiBjdXJyZW50LnNvdXJjZXNMaXN0SW5kZXggPT09IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBBcmNoaXZlc1N5bmNTdGF0dXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogdGhpcy5zdGF0ZXMuZXZlcnkoeCA9PiB4LnNjYW5Db21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHRoaXMuc3RvcmUuaW5kZXhTaXplKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnN0b3JlLnNvdXJjZXMubWFwKCh4LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzOiB4LnZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICByb3V0ZTogeC5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiB4Lm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRoaXMuc3RhdGVzW2ldLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLFxuICAgICAgICAgICAgICAgIGluaXRpYWxTY2FuQ29tcGxldGU6IHRoaXMuc3RhdGVzW2ldLnNjYW5Db21wbGV0ZSxcbiAgICAgICAgICAgICAgICBzY2FubmVkQ291bnQ6IHRoaXMuc3RhdGVzW2ldLnNjYW5uZWRDb3VudCxcbiAgICAgICAgICAgIH0pKS5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogTGlzdGluZ3MgY29tZSBzdHJhaWdodCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZSBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhleSBhcmUgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlIChsb2NhbCBkaXNrKSBpcyBpbXBsaWNpdGx5IHJlcXVpcmVkIC0gcmVtb3RlIHNvdXJjZXMgYXJlIG5vdCwgdGhleSBjb21lIGFuZCBnby4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKDApO1xuICAgIH1cblxuICAgIC8qKiBPbmUgc3luY2hyb25pemF0aW9uIHJvdW5kIG9mIGEgc291cmNlOiB0aGUgUFVMTCBkaXJlY3Rpb24gYWx3YXlzIChpdHMgbGlzdGluZywgYXBwbGllZCB0byBvdXIgaW5kZXgpLCBhbmQgd2l0aCBcInB1c2hcIiB0aGUgcHVzaCBkaXJlY3Rpb24gdG9vICh3aGF0IG91ciBpbmRleCBzYXlzIHRoZSBzb3VyY2UgaXMgbWlzc2luZywgd3JpdHRlbiB0byBpdCkuIFB1c2ggaXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjYWxsIGJlY2F1c2UgaXQgY2Fubm90IHJ1biB3aXRob3V0IHRoZSBwdWxsJ3MgbGlzdGluZyAtIHRoZSBpbmRleCBhbG9uZSBjYW5ub3Qgc2F5IHdoYXQgdGhlIHNvdXJjZSBhbHJlYWR5IGhvbGRzLiBMaXN0aW5ncyB1bmJsb2NrIChpbml0aWFsU2NhbikgYmV0d2VlbiB0aGUgaGFsdmVzLCBzbyB0aGV5IG5ldmVyIHdhaXQgYmVoaW5kIGEgcHVzaC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHN5bmNTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlciwgcHVzaD86IFwicHVzaFwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBsaXN0aW5nID0gYXdhaXQgdGhpcy5wdWxsU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChwdXNoICYmICF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1c2hTb3VyY2Uoc291cmNlSW5kZXgsIGxpc3RpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpOiBqdXN0IGl0cyBjaGFuZ2VzIHNpbmNlIHRoZSBib3VuZGFyeSBuZWlnaGJvcmhvb2QsIHdpdGggbWF0Y2hpbmcgdmFsdWVzIHB1bGxlZCBvbnRvIG91ciBvd24gZGlzay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHNpbmNlOiBjb25maWcuc2luY2UsIHJvdXRlOiBjb25maWcucm91dGUgfHwgRlVMTF9ST1VURSB9KTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBhd2FpdCBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyMih7IHRpbWU6IGNvbmZpZy5zaW5jZSwgcm91dGVzOiBjb25maWcucm91dGUgJiYgW2NvbmZpZy5yb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS5maWx0ZXJlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGZpbGUucGF0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2l6ZSAwIGluIGEgbGlzdGluZyBJUyBhIGRlbGV0aW9uIChhbiBlbXB0eSBmaWxlIGlzIGEgbWlzc2luZyBmaWxlKSwgc28gaXQgaXMgdGFrZW4gYXMgb25lXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGZpbGUucGF0aCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBCb3VuZGFyeSBzY2FuIGNvdWxkIG5vdCBjb3B5ICR7ZmlsZS5wYXRofSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgY2hhbmdlIGZlZWQgbGlzdGVkIGl0ICgke2ZpbGUuc2l6ZX0gYnl0ZXMsIHdyaXRlVGltZSAke25ldyBEYXRlKGZpbGUuY3JlYXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGJ1dCB0aGUgcmVhZCBmb3VuZCBub3RoaW5nYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBmaWxlLnBhdGgsIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgIGlmIChjb3BpZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgY29waWVkLndyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVwZGF0ZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFsbHkubmV3Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIHNpbmNlOiBjb25maWcuc2luY2UsIGNoYW5nZXM6IGNoYW5nZXMubGVuZ3RoLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkIH0pO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBwZXItc291cmNlIGxvb3BzIOKUgOKUgFxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydFNvdXJjZVN5bmNMb29wcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmUucmVnaXN0ZXJTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHNvdXJjZU9iaiA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VPYmouc291cmNlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIC8vIElmIGEgc2xvdCBldmVyIGdldHMgVFdPIG9mIHRoZXNlLCBpdHMgbG9vcHMgYXJlIGRvdWJsZWQgLSBldmVyeSBwb2xsIGFuZCBmdWxsIHN5bmMgcnVucyB0d2ljZVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzb3VyY2VTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc291cmNlSW5kZXgsIHVybDogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS51cmwsIGludGVybWVkaWF0ZTogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUgfSk7XG4gICAgICAgIC8vIFJlYWQgbGl2ZSBmb3IgZXZlcnkgcGFzcywgbm90IGNhcHR1cmVkIC0gdGhlIHN0b3JlJ3Mgc291cmNlIGxpc3QgY2FuIGNoYW5nZSB3aGlsZSBsb29wcyBydW5cbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSAoKSA9PiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLm5vRnVsbFN5bmM7XG4gICAgICAgIC8vIEFuIGludGVybWVkaWF0ZSBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBQT1JUIG9udG8gYSBzb3VyY2Ugd2UgYWxyZWFkeSBoYXZlOiB0aGUgc2FtZSBidWNrZXQsIHJlYWNoYWJsZSBhbm90aGVyIHdheSBmb3IgYSBmZXcgbWludXRlcy4gU2Nhbm5pbmcgaXQgd291bGQgbGlzdCBleGFjdGx5IHdoYXQgc2Nhbm5pbmcgdGhhdCBzb3VyY2UgbGlzdHMsIGFnYWluc3QgYSBwb3J0IHRoYXQgaXMgYWJvdXQgdG8gZGlzYXBwZWFyIC0gc28gaXQgaXMgbmV2ZXIgc2Nhbm5lZCwgYW5kIHRoZSBzb3VyY2UgaXQgd2FzIHNwbGl0IG91dCBvZiBjb3ZlcnMgaXQgZm9yIGFzIGxvbmcgYXMgaXQgZXhpc3RzIGFuZCBhZnRlciBpdCBpcyBnb25lLlxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCBzb3VyY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgPSAhIWNvbmZpZy5zdXBwb3J0c0NoYW5nZXNBZnRlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJpbml0aWFsU2NhbkZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCByZXRyeUluTXM6IFNDQU5fUkVUUllfREVMQVksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgbGV0IHBvbGxJbnRlcnZhbCA9IHNvdXJjZU9iai5zb3VyY2VDb25maWc/LnR5cGUgPT09IFwicmVtb3RlXCIgPyBGVUxMX1JFU0NBTl9JTlRFUlZBTCA6IEZVTExfUkVTQ0FOX05PTl9SRU1PVEVfSU5URVJWQUw7XG4gICAgICAgIGF3YWl0IHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KHBvbGxJbnRlcnZhbCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4LCBcInB1c2hcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmFpbGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHJldHJ5SW5NczogU0NBTl9SRVRSWV9ERUxBWSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBIHNjYW4gdGhhdCBoYXMgbm90IHN1Y2NlZWRlZCB5ZXQgaXMgcmV0cmllZCBIRVJFLCBiZWZvcmUgYW55dGhpbmcgZWxzZSAtIHBvbGxpbmcgY2hhbmdlcyBhbmQgY29weWluZyBhZ2FpbnN0IGEgbmV2ZXItc2Nhbm5lZCBzb3VyY2Ugd291bGQgcnVuIG9uIGFyYml0cmFyaWx5IHN0YWxlIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5zY2FuU3VjY2VlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZShzb3VyY2VJbmRleCwgXCJwdXNoXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgUFVMTCBkaXJlY3Rpb246IGEgZnVsbCBtZXRhZGF0YSBzY2FuIChzaXplLCB3cml0ZVRpbWUsIHBhdGgpIG9mIG9uZSBzb3VyY2UsIGFwcGxpZWQgdG8gb3VyIGluZGV4LiBSZXR1cm5zIHRoZSBzb3VyY2UncyBsaXN0aW5nIChwYXRoIC0+IHdyaXRlIHRpbWUpLCB3aGljaCBwdXNoU291cmNlIHVzZXMgZm9yIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uXG4gICAgcHJpdmF0ZSBhc3luYyBwdWxsU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7IHR5cGU6IFwibWV0YWRhdGFTY2FuXCIsIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzdGFydFRpbWU6IHNjYW5TdGFydCB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCkgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIC8vIFRoZSBsaXN0aW5nIHJlcXVlc3QgZGVsaWJlcmF0ZWx5IHRha2VzIG5vIHRpbWUgb3Igcm91dGUgZmlsdGVyczogb3VyIHNsb3dlc3Qgc291cmNlcyAoYmFja2JsYXplKSBzdXBwb3J0IG5laXRoZXIsIHNvIGZpbHRlcmluZyB3b3VsZCBoYXBwZW4gYWZ0ZXIgdGhlIGZ1bGwgZmV0Y2ggYW55d2F5IC0gbGl0dGxlIGJlbmVmaXQsIG1vcmUgcm9vbSBmb3IgZGVzeW5jaHJvbml6YXRpb24uIEFuZCBpZiBhIGZ1bGwgbGlzdGluZyBldmVyIGJlY29tZXMgdG9vIGJpZyB0byBzZW5kIG92ZXIgdGhlIG5ldHdvcmssIGl0IGlzIGFsc28gdG9vIGJpZyBmb3IgdGhlIHJlY2VpdmluZyBwcm9jZXNzIHRvIGhvbGQgaW4gbWVtb3J5IC0gdGhlIGZpeCBpcyBtb3JlIHJvdXRpbmcgc2hhcmRzIChlYWNoIHN0b3JpbmcgYW5kIHNlbmRpbmcgbGVzcyksIG5vdCBmaWx0ZXJpbmcuXG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIGJlbGlldmUgdGhlIHNvdXJjZSBoYXM6IHdoaWNoZXZlciBpcyBsYXJnZXIgb2YgaXRzIHByZXZpb3VzIGxpc3RpbmcgYW5kIHRoZSBpbmRleCBlbnRyaWVzIG5hbWluZyBpdCBhcyBob2xkZXIuIEZpbGVzIGRvIG5vdCBqdXN0IHZhbmlzaCAtIGEgbGlzdGluZyBmYXIgYmVsb3cgdGhpcyBtZWFucyB0aGUgb3RoZXIgZW5kIGlzIGJyaWVmbHkgYnJva2VuLCBhbmQgYmVsaWV2aW5nIGl0IHdvdWxkIHB1cmdlIGV2ZXJ5dGhpbmcgaXQgaGVsZC5cbiAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXgpIGhlbGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gTWF0aC5tYXgoc3RhdGUuc2Nhbm5lZENvdW50LCBoZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIShleHBlY3RlZCA+IDAgJiYgZmlsZXMubGVuZ3RoIDwgZXhwZWN0ZWQgLyAyKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBTVElMTCBsaXN0cyAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgd2hlcmUgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQsIGFmdGVyICR7YXR0ZW1wdHN9IHJldHJpZXMgLSBhY2NlcHRpbmcgdGhlIGxpc3RpbmcgYXMgdGhlIHRydXRoYCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBsaXN0ZWQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCBidXQgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQgKHByZXZpb3VzIGxpc3RpbmcgJHtzdGF0ZS5zY2FubmVkQ291bnR9LCBpbmRleCBlbnRyaWVzIGl0IGhvbGRzICR7aGVsZH0pIC0gdGhlIG90aGVyIGVuZCBpcyBwcm9iYWJseSBicmllZmx5IGJyb2tlbjsgYXNraW5nIGFnYWluIGluICR7U1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke2F0dGVtcHRzfSBvZiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHdoaWxlIHRoZSBsaXN0aW5nIHdhcyBpbiBmbGlnaHQ7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmIChzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybiBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBpbmRleFNpemVCZWZvcmUgPSB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBsZXQgbmV3UGF0aHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IGl0cyBsaXN0aW5nIGRpZCBub3QgbWVudGlvbjogb3VyIG93biBkaXNrIHRha2VzIG92ZXIgYXMgaG9sZGVyIHdoZW4gaXQgaGFzIGEgY29weSwgYW5kIG9ubHkgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciBpcyB0aGUgZW50cnkgZm9yZ290dGVuIC0gd2Ugd2VyZSB3cm9uZyBhYm91dCB3aGVyZSB0aGUgZmlsZSBpcywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGl0IGhhdmluZyBiZWVuIGRlbGV0ZWQuIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkIGFyZSBrZXB0OiB0aGUgbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBhcmUgbm90IHdhbGtlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZSB0aGV5IGFyZSBub3QgZmlsZXMgYSBsaXN0aW5nIGNvdWxkIHZvdWNoIGZvci5cbiAgICAgICAgbGV0IHJlbW92ZWRGcm9tSW5kZXggPSAwO1xuICAgICAgICBsZXQgcmVwb2ludGVkVG9Mb2NhbCA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBsZXQgc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ICYmIGVudHJ5LmNoYW5nZWRBdCA8IHNjYW5TdGFydCkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvaW50ZWRUb0xvY2FsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRGcm9tSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50ZWQgb25seSB3aGVuIHRoZSBzb3VyY2UgU0hPVUxEIGhvbGQgdGhlIGVudHJ5IChpdHMgcm91dGUgbWF0Y2hlcykgLSB0aGVzZSBhcmUgd2hhdCB0aGUgcmVjb25jaWxlIHBhc3MgcHVzaGVzIHRvIGl0ICh3aGljaCBhbHNvIGlnbm9yZXMgdGhlIHZhbGlkIHdpbmRvdzogc3luY2hyb25pemF0aW9uIG1vdmVzIGV4aXN0aW5nIHZhbHVlcywgdGhlIHdpbmRvdyBvbmx5IHJvdXRlcyBmcmVzaCB3cml0ZXMpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIGxpc3RlZDogZmlsZXMubGVuZ3RoLCBpbmRleGVkQmVmb3JlOiBpbmRleFNpemVCZWZvcmUsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQsIG91dHNpZGVSb3V0ZTogdGFsbHkuZmlsdGVyZWQsIG1pc3NpbmdPblNvdXJjZSwgcmVwb2ludGVkVG9Mb2NhbCwgcmVtb3ZlZEZyb21JbmRleCB9KTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgc3RhdGUuc2NhblN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBzZWVuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwdXNoIGRpcmVjdGlvbiBvZiBzeW5jaHJvbml6YXRpb246IGV2ZXJ5dGhpbmcgd2Uga25vdyB0aGF0IHRoZSBzb3VyY2UgaXMgbWlzc2luZyAob3IgaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpcyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2VlcyB3aGF0J3MgbWlzc2luZyBhbmQgcmUtc2VuZHMgaXQuIEEgZmFpbGluZyBmaWxlIGlzIHNraXBwZWQsIG5vdCBmYXRhbCAoaW1tdXRhYmxlIHRhcmdldHMgYXJlIGhhbmRsZWQgYnkgZm9yY2VTZXRJbW11dGFibGUsIGFuZCBvbmUgdW5yZWFkYWJsZSB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IG9mIHRoZSBwYXNzKSAtIG9ubHkgYSBydW4gb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMgKHRoZSBzb3VyY2UgaXRzZWxmIGlzIGRvd24pIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBzY2FuIGN5Y2xlLlxuICAgIHByaXZhdGUgYXN5bmMgcHVzaFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3dzLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzKTtcbiAgICAgICAgbGV0IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgcHVzaGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmlsZXMgZmlyc3QsIHRoZW4gdGhlIGRlbGV0aW9ucyAtIHR3byB3YWxrcyBub3cgdGhhdCB0aGV5IGFyZSB0d28gbWFwcywgYW5kIHRoZSBkZWxldGlvbnMgb25lIGlzIHRoZSBzaG9ydCBvbmVcbiAgICAgICAgbGV0IHB1c2hhYmxlOiB7IGtleTogc3RyaW5nOyB3cml0ZVRpbWU6IG51bWJlcjsgZW50cnk/OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHRhcmdldFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGVudHJ5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeyBrZXksIHdyaXRlVGltZSwgZW50cnkgfSBvZiBwdXNoYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBub3QgcmVjb25jaWxlZDogaXQgcHJvcGFnYXRlcyBieSBiZWluZyBhc2tlZCBmb3IsIG9uIGl0cyBvd24gc2NoZWR1bGUgKHNlZSBwb2xsUm91dGluZ0NvbmZpZylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gd3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHkuIEl0IHRyYXZlbHMgYXMgZGVsIChuZXZlciBhcyBhbiBlbXB0eSBzZXQgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKSwgd2l0aCB0aGUgT1JJR0lOQUwgZGVsZXRpb24gdGltZSBzbyBvcmRlcmluZyBzdXJ2aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogaG9sZGVyLCB0bzogc291cmNlLCBwYXRoOiBrZXksIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3BpZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFNZTkNfRVJST1JfTE9HX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZUZhaWx1cmVzID49IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwYXVzZSBwZXIgZmFpbHVyZSwgc28gYSBkb3duIG5ldHdvcmsgdGFrZXMgbWludXRlcyB0byBidXJuIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIGluc3RlYWQgb2YgYW4gaW5zdGFudFxuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVjb25jaWxpbmcgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMsICR7ZmFpbGVkfSBmYWlsZWQke2Fib3J0ZWQgJiYgYCBiZWZvcmUgYWJvcnRpbmcgdGhlIHBhc3MgKCR7Y29uc2VjdXRpdmVGYWlsdXJlc30gY29uc2VjdXRpdmUgZmFpbHVyZXMgLSB0aGUgc291cmNlIGxvb2tzIGRvd247IHRoZSBuZXh0IHNjYW4gY3ljbGUgcmV0cmllcylgIHx8IFwiXCJ9LiBGaXJzdCBlcnJvcnM6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicmVjb25jaWxlRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHB1c2hlZCwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB2YWxpZCB3aW5kb3cgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIGhlcmU6IGl0IGRlY2lkZXMgd2hlcmUgV1JJVEVTIHJvdXRlLCBidXQgYSBzY2FuIGlzIHVzIGFza2luZyBhIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMgLSBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGUgd2luZG93ICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS4gT25seSB0aGUgcm91dGUgZmlsdGVyczogYSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGxlZ2l0aW1hdGVseSBpbmNsdWRlcyBrZXlzIHRoYXQgYXJlbid0IG91cnMuXG4gICAgICAgICAgICBsZXQgeyByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMsIGFuZCBhIHRpZSBrZWVwcyB3aGF0IHdlIGhhdmUgLSBvdGhlcndpc2UgZXZlcnkgcmVzY2FuIG9mIGFuIHVuY2hhbmdlZCBmaWxlIHdvdWxkIHJlLXJlY29yZCBpdCwgbW92aW5nIGl0cyBob2xkZXIgYW5kIHdyaXRpbmcgYSBsb2cgcmVjb3JkIGZvciBub3RoaW5nLiBjdXJyZW50V3JpdGVUaW1lIGNvdW50cyBkZWxldGlvbnMsIHNvIGEgbGlzdGluZyB0aGF0IHN0aWxsIHNob3dzIGEgZmlsZSB3ZSBrbm93IHdhcyBkZWxldGVkIGRvZXMgbm90IHJlc3VycmVjdCBpdC5cbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKSkgcmV0dXJuIFwidW5jaGFuZ2VkXCI7XG4gICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAtIGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUgLSBzbyB0aGF0IGlzIHdoYXQgaXQgaXMgdGFrZW4gYXNcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFwidG9tYnN0b25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCByb3V0ZXM6IHJvdXRlICYmIFtyb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9sbHMgcnVuIGNvbnN0YW50bHksIHNvIG9ubHkgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBjaGFuZ2VkIHRoZSBpbmRleCBnZXQgYW4gZW50cnlcbiAgICAgICAgaWYgKHRhbGx5Lm5ldyB8fCB0YWxseS51cGRhdGVkIHx8IHRhbGx5LnRvbWJzdG9uZSkge1xuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiY2hhbmdlc1BvbGxcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgY2hhbmdlczogY2hhbmdlcy5sZW5ndGgsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ICs9IGNoYW5nZXMubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gcG9sbFN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVA7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWRzIHRoZSBmaWxlcyBhIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHByZXNlcnZpbmcgdGhlaXIgbW9kaWZpZWQgdGltZXMg4oCUIHNvIGEgbmV3ZXIgbG9jYWwgd3JpdGUgYWx3YXlzIHdpbnMuIFNraXBwZWQgZm9yIG5vRnVsbFN5bmMgc291cmNlcyAoZnJvbnRpbmcgYSBsYXJnZSBkYXRhYmFzZSB3aXRob3V0IGNvcHlpbmcgaXQpOyByZWFkcyBzdGlsbCBkb3duLWNhY2hlIGxhemlseS5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBlbmRpbmc6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBjb3BpZWRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZnVsbFN5bmNTdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkaWZmQmFzZWQ6IHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCBmaWxlczogcGVuZGluZy5sZW5ndGgsIGJ5dGVzOiB0b3RhbEJ5dGVzIH0pO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NMb2dnZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGxvZ1Byb2dyZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcHJvZ3Jlc3NMb2dnZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7YWN0aXZpdHkuZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKWApKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbChsb2dQcm9ncmVzcywgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBzbG93RXJyb3JUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGFjdGl2aXR5LnN0YXJ0VGltZTtcbiAgICAgICAgICAgIGxldCBkb25lRmlsZXMgPSBhY3Rpdml0eS5kb25lRmlsZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBkb25lQnl0ZXMgPSBhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBieXRlc1BlclNlY29uZCA9IGRvbmVCeXRlcyAvIChlbGFwc2VkIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nQnl0ZXMgPSB0b3RhbEJ5dGVzIC0gZG9uZUJ5dGVzO1xuICAgICAgICAgICAgbGV0IGV0YVRleHQgPSBcInVua25vd24gKG5vIGJ5dGVzIHRyYW5zZmVycmVkIHlldClcIjtcbiAgICAgICAgICAgIGlmIChieXRlc1BlclNlY29uZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nTXMgPSByZW1haW5pbmdCeXRlcyAvIGJ5dGVzUGVyU2Vjb25kICogMTAwMDtcbiAgICAgICAgICAgICAgICBldGFUZXh0ID0gYCR7Zm9ybWF0VGltZShyZW1haW5pbmdNcyl9IHJlbWFpbmluZywgY29tcGxldGluZyBhcm91bmQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgcmVtYWluaW5nTXMpLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgaGFzIGJlZW4gcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKGVsYXBzZWQpfTogJHtkb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeyhkb25lRmlsZXMgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoZG9uZUJ5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgZG9uZUJ5dGVzIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGJ5dGVzUGVyU2Vjb25kKX1CL3MuIEVzdGltYXRlZCAke2V0YVRleHR9LmApO1xuICAgICAgICB9LCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCk7XG4gICAgICAgIChzbG93RXJyb3JUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29waWVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHNvdXJjZSBjYW5ub3QgZ2l2ZSB1cyB0aGUgZmlsZSAoaXRzIHJlYWQgaGFkIG5vdGhpbmcsIG9yIGl0IGVycm9yZWQpLiBSZXRyeWluZyB0aGUgc2FtZSBlbnRyeSBmb3JldmVyIGlzIG5vdCBhbiBhbnN3ZXI6IGlmIG91ciBvd24gZGlzayBob2xkcyBhIGNvcHksIElUIGJlY29tZXMgdGhlIGhvbGRlcjsgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciwgdGhlIGVudHJ5IGlzIHB1cmdlZCAtIGZvcmdvdHRlbiwgbm90IGRlbGV0ZWQsIGV4YWN0bHkgbGlrZSBhIHJlYWQgdGhhdCBjb21lcyB1cCBlbXB0eSBldmVyeXdoZXJlIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiBpdCBleGlzdHMgYW55d2hlcmUuXG4gICAgICAgIGxldCByZXNvbHZlVW5hdmFpbGFibGUgPSBhc3luYyAoZXZlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGVudHJ5OiBJbmRleEVudHJ5LCBleHRyYTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlID0geyBldmVudCwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIC4uLmV4dHJhIH07XG4gICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGxvY2FsLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcInJlcG9pbnRlZCB0byBvdXIgbG9jYWwgY29weVwiLCBsb2NhbFNpemU6IGxvY2FsLnNpemUgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShrZXkpIDw9IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJwdXJnZWQgLSBuZWl0aGVyIHRoZSBzb3VyY2Ugbm9yIG91ciBkaXNrIGhhcyBpdCwgc28gaXQgZG9lcyBub3QgZXhpc3RcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBIG5ld2VyIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSB3ZXJlIGNoZWNraW5nIC0gdGhlIGVudHJ5IGlzIG5vIGxvbmdlciB0aGUgb25lIHdlIGZvdW5kIHVuYXZhaWxhYmxlLCBzbyBpdCBpcyBsZWZ0IGFsb25lXG4gICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcImtlcHQgLSBhIG5ld2VyIHdyaXRlIGFwcGVhcmVkIHdoaWxlIGNoZWNraW5nXCIsIGN1cnJlbnRXcml0ZVRpbWU6IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShrZXkpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICBsZXQgY29weVdvcmtlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWFib3J0ZWQgJiYgIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbmV4dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBrZXksIGVudHJ5IH0gPSBwZW5kaW5nW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBzb3VyY2UsIHRvOiB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLCBwYXRoOiBrZXksIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRCeXRlcyArPSBjb3BpZWQuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBrZXksIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29weSBjYXJyaWVzIHRoZSBzb3VyY2UncyB3cml0ZSB0aW1lLCBhbmQgdGhlIGluZGV4IGNvbW1pdHMgaXQgdW5kZXIgdGhlIG5vcm1hbCBvcmRlcmluZyBydWxlICg+PSB0aGUgY3VycmVudCB0aW1lIHdpbnMpIC0gaXQgcmVmdXNpbmcgbWVhbnMgYSBORVdFUiB3cml0ZSBsYW5kZWQgd2hpbGUgd2UgY29waWVkLCB3aGljaCBtdXN0IGJlIHNhaWQsIG5vdCBzd2FsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBjb3BpZWQud3JpdGVUaW1lLCBzaXplOiBjb3BpZWQuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jQ29tbWl0U3VwZXJzZWRlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGNvcGllZFdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJmdWxsU3luY01pc3NpbmdPblNvdXJjZVwiLCBrZXksIGVudHJ5LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmYWlsaW5nIGZpbGUgcmVzb2x2ZXMgZXhhY3RseSBsaWtlIGEgbWlzc2luZyBvbmUgKHRoZSBzb3VyY2UgY2Fubm90IGdpdmUgaXQgdG8gdXMgZWl0aGVyIHdheSksIHNvIGl0IG5ldmVyIHdlZGdlcyB0aGUgcGFzcyBvbiByZXRyaWVzIGZvcmV2ZXIgLSBhbmQgdGhlIG5leHQgZnVsbCBwdWxsIHJlLWZpbmRzIGl0IGlmIHRoZSBzb3VyY2UgcmVjb3ZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJmdWxsU3luY0NvcHlGYWlsZWRcIiwga2V5LCBlbnRyeSwgeyBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlc29sdmVFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jQ29weUZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApLCByZXNvbHZlRXJyb3I6IFN0cmluZygocmVzb2x2ZUVycm9yIGFzIEVycm9yKS5zdGFjayA/PyByZXNvbHZlRXJyb3IpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWUsIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLCB0b3RhbEJ5dGVzLCBwcm9jZXNzZWRGaWxlczogYWN0aXZpdHkuZG9uZUZpbGVzLCBjb3BpZWRGaWxlcywgY29waWVkQnl0ZXMsIG1pc3NpbmdPblNvdXJjZSwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIG1haW50ZW5hbmNlIOKUgOKUgFxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmZvcmNlRGlza0xpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnN0b3JlLnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLnN0b3JlLmluZGV4VG90YWxzKCk7XG4gICAgICAgIC8vIENvdW50ZWQgZG93biBhcyB3ZSBldmljdCwgcmF0aGVyIHRoYW4gcmUtcmVhZCBwZXIgZmlsZTogYSBwYXNzIG9ubHkgZXZlciByZW1vdmVzIGJ5dGVzIGZyb20gdGhlIGRpc2ssIGFuZCBhbnl0aGluZyB3cml0dGVuIGR1cmluZyBpdCBpcyBwaWNrZWQgdXAgYnkgdGhlIG5leHQgcGFzc1xuICAgICAgICBsZXQgZGlza0J5dGVzID0gdG90YWxzLnNsb3RzWzBdLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV2aWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGV2aWN0ZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBldmljdGVkQnl0ZXMgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXM6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZWFzdCByZWNlbnRseSBSRUFEIGZpcnN0OyBhIGtleSBub2JvZHkgaGFzIHJlYWQgc2luY2Ugd2Ugc3RhcnRlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4gdGhpcy5sYXN0QWNjZXNzLmdldCh4LmtleSkgfHwgeC5lbnRyeS5jaGFuZ2VkQXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbaV0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8ud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBkb3duIHNvdXJjZSBqdXN0IGNhbid0IHZvdWNoIGZvciB0aGlzIGZpbGUgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvbGRlciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChob2xkZXIpIH0pO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIGRpc2tCeXRlcyAtPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5ldmljdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWRGaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEaXNrIGNhY2hlIG92ZXIgcmVhZGVyRGlza0xpbWl0IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGV2aWN0ZWQgJHtldmljdGVkRmlsZXN9IGxlYXN0LXJlY2VudGx5LXVzZWQgZmlsZXMgKCR7Zm9ybWF0TnVtYmVyKGV2aWN0ZWRCeXRlcyl9QiksIG5vdyBhdCAke2Zvcm1hdE51bWJlcihkaXNrQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIobGltaXQpfUJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWQgb25lcyBhcmUgZm9yZ290dGVuIGVudGlyZWx5LiBBIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBjYW4gcnVuIG9mdGVuIGFuZCBjb3N0IG5vdGhpbmcuIFRoZSBwaHlzaWNhbCBlbXB0eSBmaWxlIGlzIHJlbW92ZWQgb25seSBvbiBiYWNrYmxhemUgc291cmNlczogcmVtb3RlIHN0b3JlcyBleHBpcmUgdGhlaXIgb3duIHRvbWJzdG9uZXMgKGEgZGVsIHRoZXJlIHdvdWxkIGp1c3QgbWludCBhIGZyZXNoIG9uZSksIGFuZCBvdXIgb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgTUFSS0VEIGRlbGV0aW9uIG5ldmVyIGV4cGlyZXMgYnkgdGltZSAtIGl0cyBieXRlcyBhcmUgc3RpbGwgb24gZGlzaywgYW5kIHB1cmdpbmcgdGhlIHRvbWJzdG9uZSB3b3VsZCBsZXQgdGhlIG5leHQgZGlzayBzY2FuIHJlc3VycmVjdCB0aGVtIGFzIGxpdmUuIFJldGVudGlvbiBleHBpcmVzIGl0IGJ5IFNJWkUgKGVuZm9yY2VIaXN0b3J5TGltaXQpOyBvbmx5IG9uY2UgdGhlIGJ5dGVzIGFyZSBnb25lIGRvZXMgdGhlIHBsYWluIHRvbWJzdG9uZSBhZ2Ugb3V0IGhlcmUuXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRNYXJrZWRFbnRyeShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd3NBY2NlcHRXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlbGV0aW9uIGhpc3RvcnkgcmV0ZW50aW9uOiBtYXJrZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBvdXIgZGlzayB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3Rvcik7IHRoZW4gdGhlIE9MREVTVCBkZWxldGlvbnMgbG9zZSB0aGVpciBieXRlcyBhbmQgYmVjb21lIHBsYWluIHRvbWJzdG9uZXMsIHdoaWNoIGFnZSBvdXQgbm9ybWFsbHkgKGNsZWFudXBUb21ic3RvbmVzKVxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZUhpc3RvcnlMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChISVNUT1JZX01JTl9CWVRFUywgdGhpcy5zdG9yZS5pbmRleFRvdGFscygpLmJ5dGVDb3VudCAqIGF3YWl0IGdldEhpc3RvcnlGYWN0b3IoKSk7XG4gICAgICAgIGxldCBtYXJrZWQ6IHsga2V5OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZGVsZXRlVGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgbWFya2VkLnB1c2goeyBrZXksIHNpemU6IGVudHJ5LnNpemUsIGRlbGV0ZVRpbWU6IGVudHJ5LmRlbGV0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPD0gYWxsb3dlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhcnRlZFdpdGhCeXRlcyA9IHRvdGFsQnl0ZXM7XG4gICAgICAgIHNvcnQobWFya2VkLCB4ID0+IHguZGVsZXRlVGltZSk7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IHsga2V5LCBzaXplIH0gb2YgbWFya2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5kcm9wTWFya2VkSGlzdG9yeShrZXkpO1xuICAgICAgICAgICAgdG90YWxCeXRlcyAtPSBzaXplO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgZHJvcHBlZEJ5dGVzICs9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW9uIGhpc3Rvcnkgb2Ygc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0gb3V0Z3JldyBpdHMgYnVkZ2V0ICgke2Zvcm1hdE51bWJlcihzdGFydGVkV2l0aEJ5dGVzKX1CIGtlcHQgdnMgJHtmb3JtYXROdW1iZXIoYWxsb3dlZCl9QiBhbGxvd2VkKTogZHJvcHBlZCB0aGUgJHtkcm9wcGVkfSBvbGRlc3QgbWFya2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihkcm9wcGVkQnl0ZXMpfUIpOyB0aGVpciB0b21ic3RvbmVzIHJlbWFpbiB1bnRpbCB0aGV5IGFnZSBvdXRgKTtcbiAgICB9XG59XG4iXX0=
778
- /* _JS_SOURCE_HASH = "0a9c678deaf127f96720ecd9ebda13f8541dc638a8708f0bd34204b2d71b8612"; */
827
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUErRztBQUMvRyx5REFBb0Q7QUFDcEQsbURBQTBFO0FBQzFFLGtFQUFpRjtBQUNqRiw0Q0FHc0I7QUFDdEIsc0RBQW9EO0FBQ3BELDRDQUFpRDtBQUNqRCxpREFBMkc7QUFFM0csMkNBQWtFO0FBQ2xFLCtDQUE2QztBQUM3Qyx3RUFBbUU7QUFFbkUsa2JBQWtiO0FBRWxiLHlFQUF5RTtBQUN6RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbU1BQW1NO0FBQ25NLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Msa1FBQWtRO0FBQ2xRLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Qsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELG1GQUFtRjtBQUNuRixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVDLHdJQUF3STtBQUN4SSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw4S0FBOEs7QUFD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aEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUNwQyxJQUFJLFVBQVUsSUFBSSxPQUFPO2dCQUFFLE1BQU07WUFDakMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLFVBQVUsSUFBSSxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixZQUFZLElBQUksSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sd0JBQXdCLElBQUEscUJBQVksRUFBQyxnQkFBZ0IsQ0FBQyxhQUFhLElBQUEscUJBQVksRUFBQyxPQUFPLENBQUMsMkJBQTJCLE9BQU8seUJBQXlCLElBQUEscUJBQVksRUFBQyxZQUFZLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUM3UixDQUFDO0NBQ0o7QUE3c0JELDhCQTZzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIGRlbGF5LCBydW5JbmZpbml0ZVBvbGxDYWxsQXRTdGFydCwgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgY2FjaGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQsIHByb21pc2VPYmogfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsXG4gICAgd2luZG93c0FjY2VwdFdyaXRlcyxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4uL2FyY2hpdmVIZWxwZXJzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHBhcnNlUm91dGluZ0RhdGEsIGdldENvbmZpZ1ZlcnNpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmxvYlN0b3JlLCBJbmRleEVudHJ5IH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRIaXN0b3J5RmFjdG9yLCBISVNUT1JZX01JTl9CWVRFUyB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHsgbG9nU3luY0V2ZW50IH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcbmltcG9ydCB7IG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBFdmVyeXRoaW5nIHRoYXQga2VlcHMgYSBzdG9yZSdzIGluZGV4IGluIGFncmVlbWVudCB3aXRoIGl0cyBzb3VyY2VzLCBwbHVzIHRoZSB0d28gbWFpbnRlbmFuY2UgbG9vcHMgdGhhdCBmb2xsb3cgZnJvbSBob2xkaW5nIGFuIGluZGV4IChldmljdGluZyBhIGJvdW5kZWQgZGlzayBjYWNoZSwgZXhwaXJpbmcgdG9tYnN0b25lcykuIFRoZSBzdG9yZSBvd25zIHRoZSBzb3VyY2VzIGFuZCBkZWNpZGVzIHdoZXJlIHdyaXRlcyBnbzsgdGhpcyBkZWNpZGVzIHdoYXQgaXMgc2Nhbm5lZCwgcHVsbGVkLCBwdXNoZWQsIGV2aWN0ZWQsIGFuZCBmb3Jnb3R0ZW4gLSBzbyB0aGUgd3JpdGUgcGF0aCBzdGF5cyByZWFkYWJsZSB3aXRob3V0IHRoZSBzZXZlcmFsIGh1bmRyZWQgbGluZXMgb2Ygc3luY2hyb25pemF0aW9uIG1hY2hpbmVyeSBpbnRlcmxlYXZlZCBpbnRvIGl0LlxuXG4vLyBTb3VyY2VzIHdpdGggYSBuYXRpdmUgKGluZGV4LWJhY2tlZCkgY2hhbmdlIGZlZWQgYXJlIHBvbGxlZCB0aGlzIG9mdGVuXG5jb25zdCBDSEFOR0VTX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBUaGUgcm91dGluZyBjb25maWcgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgcGVlciB0aGlzIG9mdGVuIC0gZmFyIG1vcmUgb2Z0ZW4gdGhhbiBhIGZ1bGwgcmVzY2FuLCBiZWNhdXNlIGl0IGlzIHRoZSBmaWxlIHRoYXQgZGVjaWRlcyB3aGF0IGV2ZXJ5dGhpbmcgZWxzZSBkb2VzLCBhbmQgaXQgaXMgb25lIHNtYWxsIHJlYWQgcGVyIHBlZXJcbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNTtcbi8vIEZ1bGwgbWV0YWRhdGEgcmVzY2Fucy4gc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgaXMgdGhlIGhldXJpc3RpYyBmb3IgXCJvbmUgb2Ygb3VyIG93biBzdG9yYWdlIHNlcnZlcnNcIjogdGhlaXIgaW5kZXgtYmFja2VkIGxpc3RpbmdzIGFyZSBjaGVhcCwgc28gaG91cmx5IGlzIGZpbmUuIEV2ZXJ5dGhpbmcgZWxzZSAoYmFja2JsYXplLCBwbGFpbiBkaXNrKSBwYXlzIHRoZSBmdWxsIGxpc3RpbmcgY29zdCwgc28gaXQgcmVzY2FucyBtdWNoIGxlc3Mgb2Z0ZW4uXG5jb25zdCBGVUxMX1JFU0NBTl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuY29uc3QgRlVMTF9SRVNDQU5fTk9OX1JFTU9URV9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwICogNjtcbi8vIENoYW5nZSBwb2xscyByZS1yZXF1ZXN0IHRoaXMgbXVjaCBvdmVybGFwLCBzbyBjbG9jayBza2V3IGJldHdlZW4gdXMgYW5kIGEgc291cmNlIGNhbid0IGRyb3AgY2hhbmdlc1xuY29uc3QgQ0hBTkdFU19QT0xMX09WRVJMQVAgPSB0aW1lSW5NaW51dGU7XG5jb25zdCBTQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgd2hhdCBsZXRzIGEgZGVsZXRpb24gcHJvcGFnYXRlL3JlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgYW5kIGl0IGV4cGlyZXMgYWZ0ZXIgdGhpcyBsb25nXG5jb25zdCBUT01CU1RPTkVfRVhQSVJZID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5jb25zdCBUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gV2hpbGUgYSBtZXRhZGF0YSBzY2FuIG9yIGZ1bGwgc3luYyBpcyBydW5uaW5nLCBpdHMgcHJvZ3Jlc3MgaXMgbG9nZ2VkIHRoaXMgb2Z0ZW5cbmNvbnN0IFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuY29uc3QgRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgc3luY3MgZG93bmxvYWQgdGhpcyBtYW55IGZpbGVzIGNvbmN1cnJlbnRseSAoaGlnaC1sYXRlbmN5IHNvdXJjZXMgbGlrZSBiYWNrYmxhemUgd291bGQgb3RoZXJ3aXNlIGNyYXdsIG9uZSByb3VuZC10cmlwIGF0IGEgdGltZSlcbmNvbnN0IEZVTExfU1lOQ19QQVJBTExFTCA9IDg7XG4vLyBBIGZ1bGwgc3luYyBydW5uaW5nIGxvbmdlciB0aGFuIHRoaXMgaXMgY29uc29sZS5lcnJvcmVkIChhbmQgYWdhaW4gZXZlcnkgaW50ZXJ2YWwgYWZ0ZXIpLCBzbyBhIHN5bmMgdGhhdCB3aWxsIHRha2UgZGF5cyBpcyBsb3VkIGluc3RlYWQgb2YgYSBxdWlldCBjb25zb2xlLmxvZyBldmVyeSBtaW51dGVcbmNvbnN0IEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBSZWNvbmNpbGUgcGFzc2VzIEFORCBmdWxsIHN5bmNzIHNraXAgZmFpbGluZyBmaWxlcyAob25lIGJhZCB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IC0gYSBzb3VyY2UgZmFpbGluZyBvbmUgcmVxdWVzdCBpbiBhIHRob3VzYW5kIGNvdWxkIG90aGVyd2lzZSBuZXZlciBmaW5pc2ggYSBzeW5jKSwgYnV0IHRoaXMgbWFueSBmYWlsdXJlcyBpbiBhIHJvdyBtZWFucyB0aGUgb3RoZXIgc2lkZSBpdHNlbGYgaXMgZG93biwgc28gdGhlIHBhc3MgYWJvcnRzIHVudGlsIHRoZSBuZXh0IGN5Y2xlXG5jb25zdCBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUyA9IDU7XG5jb25zdCBTWU5DX0VSUk9SX0xPR19MSU1JVCA9IDM7XG4vLyBFdmVyeSBmYWlsZWQgZmlsZSB3YWl0cyB0aGlzIGxvbmcgYmVmb3JlIHRoZSBwYXNzIGNvbnRpbnVlcywgc28gYSBkb3duIG5ldHdvcmsgYnVybnMgdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2Ugb3ZlciBhIG1pbnV0ZS1wbHVzIGluc3RlYWQgb2YgaW4gYW4gaW5zdGFudFxuY29uc3QgU1lOQ19GQUlMVVJFX0RFTEFZID0gMTAwMCAqIDE1O1xuLy8gQSBmdWxsIGxpc3RpbmcgdGhhdCBjb21lcyBiYWNrIEVNUFRZIC0gb3IgdW5kZXIgaGFsZiBvZiB3aGF0IHdlIGtub3cgdGhlIHNvdXJjZSBob2xkcyAtIGlzIHRyZWF0ZWQgYXMgdGhlIG90aGVyIGVuZCBiZWluZyBicmllZmx5IGJyb2tlbiwgbm90IGFzIHRoZSB0cnV0aDogaXQgaXMgcmV0cmllZCB0aGlzIG1hbnkgdGltZXMsIHRoaXMgZmFyIGFwYXJ0LCBiZWZvcmUgYmVpbmcgYmVsaWV2ZWQuIEJlbGlldmluZyBhIHdyb25nbHktc2hydW5rZW4gbGlzdGluZyBwdXJnZXMgZXZlcnkgaW5kZXggZW50cnkgdGhlIHNvdXJjZSBoZWxkLCB3aGljaCBpcyBob3cgc3luYyBwcm9ncmVzcyBcImdvZXMgYmFja3dhcmRzXCIuXG5jb25zdCBTVVNQSUNJT1VTX1NDQU5fUkVUUklFUyA9IDM7XG5jb25zdCBTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkgPSAxMDAwICogNjA7XG4vLyBBIHNvdXJjZSB3aG9zZSBldmVyeSB3aW5kb3cgZW5kZWQgdGhpcyBsb25nIGFnbyAoYW5kIGhhcyBub25lIGluIHRoZSBmdXR1cmUpIGNhbiBuZXZlciByZWNlaXZlIHdyaXRlcyBhZ2FpbiAtIHRoZSB3aW5kb3cgZ2F0ZXMgdGhlbSwgZGVsZXRpb25zIGluY2x1ZGVkLiBTY2FubmluZyBzdWNoIGEgc291cmNlIGNhbiBvbmx5IHJlLWluZ2VzdCBoaXN0b3J5IGl0IHdpbGwgbmV2ZXIgYmUgdG9sZCB0byBkZWxldGUsIHdoaWNoIGFmdGVyIHRvbWJzdG9uZSBleHBpcnkgSVMgcmVzdXJyZWN0aW9uIC0gc28gaXQgaXMgbm90IHNjYW5uZWQgYXQgYWxsLiBUaGUgZ3JhY2UgY292ZXJzIGhhbmRvZmYgc3RyYWdnbGVycyBhcm91bmQgYSB3aW5kb3cncyBlbmQuXG5jb25zdCBTQ0FOX1NUQUxFX1dJTkRPV19HUkFDRSA9IDEwMDAgKiA2MCAqIDYwO1xuXG50eXBlIFNvdXJjZVN0YXRlID0ge1xuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBib29sZWFuO1xuICAgIGluaXRpYWxTY2FuOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9taXNlT2JqPjtcbiAgICBzY2FuQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gV2hldGhlciBhIHNjYW4gb2YgdGhpcyBzb3VyY2UgaGFzIGV2ZXIgYWN0dWFsbHkgU1VDQ0VFREVEIC0gd2hhdCBmdWxsIHN5bmNzIGdhdGUgb246IHdpdGhvdXQgb25lLCB0aGUgaW5kZXgncyB2aWV3IG9mIHRoaXMgc291cmNlIGNhbiBiZSBhcmJpdHJhcmlseSBzdGFsZSAoZS5nLiBpdCB3YXMgcmVzdGFydGluZyB3aGVuIHdlIGZpcnN0IHRyaWVkKSwgYW5kIHN5bmNpbmcgZnJvbSBzdGFsZSBpbmZvcm1hdGlvbiBjaHVybnMgZm9yZXZlclxuICAgIHNjYW5TdWNjZWVkZWQ6IGJvb2xlYW47XG4gICAgLy8gRmlsZXMgc2VlbiBpbiB0aGlzIHNvdXJjZSdzIHNjYW5zIC8gY2hhbmdlIHBvbGxzIHNvIGZhclxuICAgIHNjYW5uZWRDb3VudDogbnVtYmVyO1xuICAgIC8vIFdhdGVybWFyayBmb3IgZ2V0Q2hhbmdlc0FmdGVyMiBwb2xsc1xuICAgIGNoYW5nZXNBZnRlclRpbWU6IG51bWJlcjtcbiAgICAvLyBQZXItc2xvdCBzdG9wIHRva2VuOiBhIHJlbW92ZWQgc291cmNlJ3MgbG9vcHMgc3RvcCB3aXRob3V0IHRvdWNoaW5nIHRoZSByZXN0IG9mIHRoZSBzdG9yZVxuICAgIHN0b3BwZWQ6IHsgc3RvcDogYm9vbGVhbiB9O1xuICAgIC8vIEEgcmVtb3ZlZCBzb3VyY2UncyBzbG90IHN0YXlzIGluIHRoZSBhcnJheXMgKHRoZXkgYXJlIG5ldmVyIHNwbGljZWQsIHNvIHNsb3QgbnVtYmVycyBoZWxkIGJ5IHJ1bm5pbmcgbG9vcHMgc3RheSBtZWFuaW5nZnVsKSwgbWFya2VkIGRlYWQgLSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiBJbmRleCBlbnRyaWVzIGRvbid0IHJlZmVyZW5jZSBzbG90cyBhdCBhbGw7IHRoZXkgcGVyc2lzdCB0aGUgc291cmNlcyBsaXN0J3Mgc291cmNlc0xpc3RJbmRleC5cbiAgICBkZWFkPzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIG5ld1NvdXJjZVN0YXRlKCk6IFNvdXJjZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogZmFsc2UsXG4gICAgICAgIGluaXRpYWxTY2FuOiBwcm9taXNlT2JqKCksXG4gICAgICAgIHNjYW5Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHNjYW5TdWNjZWVkZWQ6IGZhbHNlLFxuICAgICAgICBzY2FubmVkQ291bnQ6IDAsXG4gICAgICAgIGNoYW5nZXNBZnRlclRpbWU6IDAsXG4gICAgICAgIHN0b3BwZWQ6IHsgc3RvcDogZmFsc2UgfSxcbiAgICB9O1xufVxuXG4vLyBXaGF0IGEgc2Nhbm5lZCBsaXN0aW5nIGVudHJ5IG1lYW50IHdoZW4gY29tcGFyZWQgYWdhaW5zdCBvdXIgaW5kZXhcbnR5cGUgU2Nhbk91dGNvbWUgPSBcImZpbHRlcmVkXCIgfCBcIm5ld1wiIHwgXCJ1cGRhdGVkXCIgfCBcInRvbWJzdG9uZVwiIHwgXCJ1bmNoYW5nZWRcIjtcbnR5cGUgU2NhblRhbGx5ID0gUmVjb3JkPFNjYW5PdXRjb21lLCBudW1iZXI+O1xuZnVuY3Rpb24gbmV3U2NhblRhbGx5KCk6IFNjYW5UYWxseSB7XG4gICAgcmV0dXJuIHsgZmlsdGVyZWQ6IDAsIG5ldzogMCwgdXBkYXRlZDogMCwgdG9tYnN0b25lOiAwLCB1bmNoYW5nZWQ6IDAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JlU3luYyB7XG4gICAgLy8gUGVyIHNvdXJjZSBzbG90LCBpbiBzdGVwIHdpdGggdGhlIHN0b3JlJ3Mgc291cmNlcyBhcnJheS4gU2xvdHMgYXJlIG5ldmVyIHNwbGljZWQgb3V0IC0gYSByZW1vdmVkIG9uZSBpcyBtYXJrZWQgZGVhZCAtIHNvIGEgc2xvdCBudW1iZXIgaGVsZCBieSBhIHJ1bm5pbmcgbG9vcCBhbHdheXMgbWVhbnMgdGhlIHNhbWUgc291cmNlLlxuICAgIHByaXZhdGUgc3RhdGVzOiBTb3VyY2VTdGF0ZVtdO1xuICAgIC8vIFNjYW5zIC8gZnVsbCBzeW5jcyBpbiBwcm9ncmVzcyAoYSBTZXQgLSBvbmUgc291cmNlIGNhbiBoYXZlIGEgY2hhbmdlIHBvbGwncyBmdWxsIHN5bmMgYW5kIGEgcmVzY2FuIG92ZXJsYXBwaW5nKVxuICAgIHByaXZhdGUgYWN0aXZpdGllcyA9IG5ldyBTZXQ8U3luY0FjdGl2aXR5PigpO1xuICAgIC8vIEd1YXJkcyBhZ2FpbnN0IGEgc2Vjb25kIGV2aWN0aW9uIHBhc3Mgc3RhcnRpbmcgd2hpbGUgb25lIGlzIHN0aWxsIHdhbGtpbmcgdGhlIGluZGV4XG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIC8vIFdoZW4gZWFjaCBrZXkgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVIGV2aWN0aW9uLiBOZXZlciBwZXJzaXN0ZWQgKGEgcmVzdGFydCBoYXMgbm8gb3BpbmlvbiBhYm91dCByZWNlbmN5KSwgYW5kIG9ubHkga2VwdCBmb3Iga2V5cyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiByZWFkIC0gYW4gaW5kZXggZW50cnkgbm8gb25lIGhhcyB0b3VjaGVkIGZhbGxzIGJhY2sgdG8gd2hlbiB3ZSBsYXN0IGNoYW5nZWQgaXQuXG4gICAgcHJpdmF0ZSBsYXN0QWNjZXNzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IEJsb2JTdG9yZSkge1xuICAgICAgICB0aGlzLnN0YXRlcyA9IHN0b3JlLnNvdXJjZXMubWFwKCgpID0+IG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgIH1cblxuICAgIC8qKiBTdGFydHMgZXZlcnkgbGl2ZSBzb3VyY2UncyBzeW5jaHJvbml6YXRpb24sIHBsdXMgdGhlIG1haW50ZW5hbmNlIGxvb3BzLiBDYWxsZWQgb25jZSwgYnkgdGhlIHN0b3JlJ3MgaW5pdCAtIHRoZSBzdG9yZSdzIGluZGV4IG11c3QgYWxyZWFkeSBiZSBsb2FkZWQsIHNpbmNlIHNjYW5zIHdyaXRlIHN0cmFpZ2h0IGludG8gaXQuICovXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RhcnRTb3VyY2VTeW5jTG9vcHMoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKENPTkZJR19QT0xMX0lOVEVSVkFMLCAoKSA9PiB0aGlzLnBvbGxSb3V0aW5nQ29uZmlnKCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZUhpc3RvcnlMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICAvLyBSZWFkIGxpdmU6IHRoZSBsaW1pdCBjb21lcyBmcm9tIHRoZSBjb25maWcsIHNvIGEgc3RvcmUgdGhhdCBnYWlucyBvbmUgbGF0ZXIgc3RhcnRzIGVuZm9yY2luZyBpdCB3aXRob3V0IGJlaW5nIHJlc3RhcnRlZFxuICAgICAgICBydW5JbmZpbml0ZVBvbGwoRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlRGlza0xpbWl0KCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNrcyBldmVyeSBwZWVyIGZvciB0aGUgcm91dGluZyBjb25maWcsIGFuZCB0YWtlcyBpdCBpZiBpdCBpcyBuZXdlciB0aGFuIG91cnMuIFRoaXMgaXMgdGhlIHdob2xlXG4gICAgICogb2YgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbjogaXQgcmlkZXMgYmVzaWRlIHRoZSBzY2FucyByYXRoZXIgdGhhbiBiZWluZyBwYXJ0IG9mIHRoZW0sIGJlY2F1c2VcbiAgICAgKiBvbmUgc21hbGwgcmVhZCBpcyB3b3J0aCBkb2luZyBldmVyeSBmZXcgbWludXRlcyB3aGlsZSBhIGZ1bGwgbGlzdGluZyBpcyBub3QsIGFuZCBiZWNhdXNlIGFcbiAgICAgKiBjb25maWcgd2UgYXJlIG1pc3NpbmcgaXMgd2hhdCBzdG9wcyBldmVyeXRoaW5nIGVsc2UgZnJvbSBiZWluZyByaWdodC5cbiAgICAgKlxuICAgICAqIFRoZSBjb3B5IGlzIHN0b3JlZCB0aGUgc2FtZSB3YXkgYSBzY2FuIHN0b3JlcyBhbnl0aGluZyBpdCBwdWxscyAtIGFuIGludGVybmFsIHdyaXRlIGludG8gb3VyIG93blxuICAgICAqIHN0b3JlIC0gYW5kIHRoZSBzdG9yZSBub3RpY2VzIHRoYXQgZmlsZSBsYW5kaW5nIGFuZCByZS1jb25maWd1cmVzIGl0c2VsZi4gTm90aGluZyBoZXJlIGtub3dzIHdoYXRcbiAgICAgKiBhIGNvbmZpZyBtZWFuczsgaXQgb25seSBrbm93cyB0aGlzIG9uZSBmaWxlIGlzIHdvcnRoIGFza2luZyBmb3Igb2Z0ZW4uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc291cmNlc1tpXS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB0aGVpcnMgPSBhd2FpdCBzb3VyY2UuZ2V0MihST1VUSU5HX0ZJTEUsIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGVpcnMgfHwgIXRoZWlycy5kYXRhIHx8ICF0aGVpcnMuZGF0YS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uID0gZ2V0Q29uZmlnVmVyc2lvbihwYXJzZVJvdXRpbmdEYXRhKHRoZWlycy5kYXRhKSk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPD0gdGhpcy5zdG9yZS5yb3V0aW5nVmVyc2lvbigpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGluZyBjb25maWcgdmVyc2lvbiAke3ZlcnNpb259IGZvdW5kIG9uICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAod2UgaGF2ZSAke3RoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKX0sIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogdGFraW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgLy8gU3RhbXBlZCBOT1csIG5vdCB3aXRoIHRoZWlyIHdyaXRlIHRpbWU6IGNvbmZpZ3MgYXJlIG9yZGVyZWQgYnkgdmVyc2lvbiwgYW5kIHRoaXMgb25lIGlzIG5ld2VyIGJ5IHRoYXQgb3JkZXJpbmcuIFRoZWlyIGZpbGUgY2FuIGVhc2lseSBiZSBvbGRlciBieSB3cml0ZSB0aW1lIChvdXJzIHdhcyByZXdyaXR0ZW4gbG9jYWxseSBtb3JlIHJlY2VudGx5KSwgYW5kIHRoZSBzdG9yZSdzIG9ubHktdGFrZS10aGUtbGF0ZXN0IHJ1bGUgd291bGQgdGhlbiBkcm9wIGl0IC0gbGVhdmluZyB1cyBmaW5kaW5nIHRoZSBzYW1lIG5ld2VyIHZlcnNpb24gb24gZXZlcnkgcG9sbCBhbmQgbmV2ZXIgYWRvcHRpbmcgaXQuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQoeyBwYXRoOiBST1VUSU5HX0ZJTEUsIGRhdGE6IHRoZWlycy5kYXRhLCBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgcGVlciB0aGF0IGNhbm5vdCBhbnN3ZXIgaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhIHNvdXJjZSB0aGF0IGlzIGRvd247IHRoZSBuZXh0IHBvbGwgYXNrcyBhZ2FpblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmb3IgYSBuZXdlciByb3V0aW5nIGNvbmZpZyBmYWlsZWQgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTdG9wcyBldmVyeSBzb3VyY2UncyBsb29wcyAodGhlIHN0b3JlJ3Mgb3duIHN0b3AgdG9rZW4gc3RvcHMgdGhlIG1haW50ZW5hbmNlIGxvb3BzKS4gKi9cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc3RhdGUgb2YgdGhpcy5zdGF0ZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBzbG90IHRoZSBzdG9yZSBqdXN0IGFwcGVuZGVkIHRvIGl0cyBzb3VyY2VzIGFycmF5OiBpdCBzdGFydHMgZnJvbSBub3RoaW5nLCBzbyBpdCBnZXRzIGEgZnVsbCBzY2FuLiAqL1xuICAgIHB1YmxpYyBhZGRTb3VyY2Uoc2xvdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGVzW3Nsb3RdID0gbmV3U291cmNlU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zdGFydFNvdXJjZVN5bmNMb29wcyhzbG90KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgc2xvdCBzdGF5cyBpbiB0aGUgc3RvcmUncyBhcnJheXMgZm9yZXZlciAocnVubmluZyBsb29wcyBob2xkIHNsb3QgbnVtYmVycyk7IGl0IGp1c3QgZ29lcyBkZWFkIC0gbG9vcHMgc3RvcCwgYW5kIGl0cyBpbmRleCBlbnRyaWVzIGRyb3AgKG90aGVyIHNvdXJjZXMnIHNjYW5zIHJlLWZpbmQgYW55IGNvcHkgdGhhdCdzIHN0aWxsIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBuZXcgY29uZmlnKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlU291cmNlKHNsb3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzbG90XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc3RvcmUuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIHN0YXRlLmRlYWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGxldCBzb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zbG90U291cmNlc0xpc3RJbmRleChzbG90KTtcbiAgICAgICAgLy8gVGhlIHNhbWUgVVJMIGNhbiBiZSBhbm90aGVyIGxpdmUgc2xvdCAob25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cpIC0gdGhlIGVuZHBvaW50IGlzIHN0aWxsIGNvbmZpZ3VyZWQsIHNvIGl0cyBlbnRyaWVzIHN0YXlcbiAgICAgICAgaWYgKHNvdXJjZXNMaXN0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0b3JlLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IHNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEZvcmdvdHRlbiwgbm90IGRlbGV0ZWQ6IHRoZSBmaWxlcyBzdGlsbCBleGlzdCB3aGVyZXZlciB0aGF0IHNvdXJjZSBwdXQgdGhlbSwgd2UganVzdCBubyBsb25nZXIgaGF2ZSBhIHdheSB0byByZWFjaCB0aGVtXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBkcm9wcGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIGFuZCAke2Ryb3BwZWR9IGluZGV4IGVudHJpZXMgaXQgaGVsZCB3ZXJlIGRyb3BwZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIChpdHMgVVJMIGlzIHN0aWxsIHNlcnZlZCBieSBhbm90aGVyIHNsb3QsIHNvIGl0cyBpbmRleCBlbnRyaWVzIHN0YXkpYCk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYSBzbG90IGlzIHN0aWxsIGNvbmZpZ3VyZWQuIERlYWQgc2xvdHMgYXJlIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuICovXG4gICAgcHVibGljIGlzTGl2ZShzbG90OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdG9yZS5zb3VyY2VzW3Nsb3RdICYmICF0aGlzLnN0YXRlc1tzbG90XT8uZGVhZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWN0aXZpdGllcygpOiBTeW5jQWN0aXZpdHlbXSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5hY3Rpdml0aWVzXTtcbiAgICB9XG5cbiAgICAvKiogQSBrZXkgd2FzIGp1c3Qgc2VydmVkLCBzbyBpdCBnb2VzIHRvIHRoZSBiYWNrIG9mIHRoZSBldmljdGlvbiBxdWV1ZS4gKi9cbiAgICBwdWJsaWMgbm90ZUFjY2VzcyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3RBY2Nlc3Muc2V0KGtleSwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgaW5kZXggc3RpbGwgaG9sZHMgZXhhY3RseSB0aGUgZW50cnkgYSBwYXNzIHBpY2tlZCB1cCBlYXJsaWVyLiBJbmRleCByb3dzIGFyZSByZWFkIG91dCBvZiB0aGUgZGF0YWJhc2UgcGVyIGxvb2t1cCwgc28gdGhpcyBjb21wYXJlcyB0aGUgcm93LCBub3QgdGhlIG9iamVjdCAtIGEgd3JpdGUgbGFuZGluZyBtaWQtcGFzcyBjaGFuZ2VzIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0aHJlZS5cbiAgICBwcml2YXRlIGVudHJ5VW5jaGFuZ2VkKGtleTogc3RyaW5nLCBlbnRyeTogSW5kZXhFbnRyeSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQud3JpdGVUaW1lID09PSBlbnRyeS53cml0ZVRpbWUgJiYgY3VycmVudC5zaXplID09PSBlbnRyeS5zaXplICYmIGN1cnJlbnQuc291cmNlc0xpc3RJbmRleCA9PT0gZW50cnkuc291cmNlc0xpc3RJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IEFyY2hpdmVzU3luY1N0YXR1cyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiB0aGlzLnN0YXRlcy5ldmVyeSh4ID0+IHguc2NhbkNvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogdGhpcy5zdG9yZS5pbmRleFNpemUoKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc3RvcmUuc291cmNlcy5tYXAoKHgsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3M6IHgudmFsaWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBMaXN0aW5ncyBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LCBzbyB0aGV5IG11c3Qgd2FpdCBmb3Igb3VyIG93biBiYXNlIHNvdXJjZSdzIGluaXRpYWwgc2NhbiAod2hpY2ggbWlnaHQgbGFnIG1pbnV0ZXMpIGJlZm9yZSB0aGV5IGFyZSB0cnVzdHdvcnRoeS4gVGhlIGJhc2UgKGxvY2FsIGRpc2spIGlzIGltcGxpY2l0bHkgcmVxdWlyZWQgLSByZW1vdGUgc291cmNlcyBhcmUgbm90LCB0aGV5IGNvbWUgYW5kIGdvLiAqL1xuICAgIHB1YmxpYyBhc3luYyB3YWl0Rm9yUmVxdWlyZWRTY2FucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZXNbMF0uaW5pdGlhbFNjYW4ucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2UoMCkoKTtcbiAgICB9XG5cbiAgICAvKiogT25lIHN5bmNocm9uaXphdGlvbiByb3VuZCBvZiBhIHNvdXJjZTogdGhlIFBVTEwgZGlyZWN0aW9uIGFsd2F5cyAoaXRzIGxpc3RpbmcsIGFwcGxpZWQgdG8gb3VyIGluZGV4KSwgYW5kIHdpdGggXCJwdXNoXCIgdGhlIHB1c2ggZGlyZWN0aW9uIHRvbyAod2hhdCBvdXIgaW5kZXggc2F5cyB0aGUgc291cmNlIGlzIG1pc3NpbmcsIHdyaXR0ZW4gdG8gaXQpLiBQdXNoIGlzIGFuIGFyZ3VtZW50IHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY2FsbCBiZWNhdXNlIGl0IGNhbm5vdCBydW4gd2l0aG91dCB0aGUgcHVsbCdzIGxpc3RpbmcgLSB0aGUgaW5kZXggYWxvbmUgY2Fubm90IHNheSB3aGF0IHRoZSBzb3VyY2UgYWxyZWFkeSBob2xkcy4gTGlzdGluZ3MgdW5ibG9jayAoaW5pdGlhbFNjYW4pIGJldHdlZW4gdGhlIGhhbHZlcywgc28gdGhleSBuZXZlciB3YWl0IGJlaGluZCBhIHB1c2guIE9ubHkgb25lIHJvdW5kIHBlciBTT1VSQ0UgcnVucyBhdCBhIHRpbWUgKGNhY2hlIGtleXMgdGhlIHNlcmlhbGl6ZXIgYnkgc291cmNlIGluZGV4KS4gKi9cbiAgICBwcml2YXRlIHN5bmNTb3VyY2UgPSBjYWNoZSgoc291cmNlSW5kZXg6IG51bWJlcikgPT4gcnVuSW5TZXJpYWwoYXN5bmMgKHB1c2g/OiBcInB1c2hcIik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBsZXQgbGlzdGluZyA9IGF3YWl0IHRoaXMucHVsbFNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAocHVzaCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wdXNoU291cmNlKHNvdXJjZUluZGV4LCBsaXN0aW5nKTtcbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKToganVzdCBpdHMgY2hhbmdlcyBzaW5jZSB0aGUgYm91bmRhcnkgbmVpZ2hib3Job29kLCB3aXRoIG1hdGNoaW5nIHZhbHVlcyBwdWxsZWQgb250byBvdXIgb3duIGRpc2suICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzaW5jZTogY29uZmlnLnNpbmNlLCByb3V0ZTogY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUgfSk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBjb25maWcuc2luY2UsIHJvdXRlczogY29uZmlnLnJvdXRlICYmIFtjb25maWcucm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkuZmlsdGVyZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShmaWxlLnBhdGgpO1xuICAgICAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAoYW4gZW1wdHkgZmlsZSBpcyBhIG1pc3NpbmcgZmlsZSksIHNvIGl0IGlzIHRha2VuIGFzIG9uZVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB0YWxseS50b21ic3RvbmUrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBzb3VyY2UsIHRvOiB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLCBwYXRoOiBmaWxlLnBhdGgsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpOiBvdXIgb3duIGRpc2sgYWxyZWFkeSBob2xkaW5nIHNvbWV0aGluZyBuZXdlciBpcyB0aGUgYm91bmRhcnkgc2NhbiB3b3JraW5nIGFzIGludGVuZGVkIChvdXIgd3JpdGVzIHNpbmNlIHRoZSBib3VuZGFyeSBvdXRyYW5rIHRoZSBuZWlnaGJvcidzKSwgb25seSBhIGdlbnVpbmVseSB1bnJlYWRhYmxlIGZpbGUgaXMgd29ydGggYSB3YXJuaW5nXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsICYmIGxvY2FsLndyaXRlVGltZSA+IGZpbGUuY3JlYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5Mb2NhbE5ld2VyXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGZpbGUucGF0aCwgdGhlaXJXcml0ZVRpbWU6IG5ldyBEYXRlKGZpbGUuY3JlYXRlVGltZSkudG9JU09TdHJpbmcoKSwgdGhlaXJTaXplOiBmaWxlLnNpemUsIGxvY2FsV3JpdGVUaW1lOiBuZXcgRGF0ZShsb2NhbC53cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCksIGxvY2FsU2l6ZTogbG9jYWwuc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGxvY2FsLndyaXRlVGltZSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQm91bmRhcnkgc2NhbiBjb3VsZCBub3QgY29weSAke2ZpbGUucGF0aH0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIGNoYW5nZSBmZWVkIGxpc3RlZCBpdCAoJHtmaWxlLnNpemV9IGJ5dGVzLCB3cml0ZVRpbWUgJHtuZXcgRGF0ZShmaWxlLmNyZWF0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBidXQgdGhlIHJlYWQgZm91bmQgbm90aGluZ2ApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwgZmlsZS5wYXRoLCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICBpZiAoY29waWVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGNvcGllZC53cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51cGRhdGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbGx5Lm5ldysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBzaW5jZTogY29uZmlnLnNpbmNlLCBjaGFuZ2VzOiBjaGFuZ2VzLmxlbmd0aCwgbmV3UGF0aHM6IHRhbGx5Lm5ldywgdXBkYXRlZDogdGFsbHkudXBkYXRlZCwgdG9tYnN0b25lczogdGFsbHkudG9tYnN0b25lLCB1bmNoYW5nZWQ6IHRhbGx5LnVuY2hhbmdlZCB9KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcGVyLXNvdXJjZSBsb29wcyDilIDilIBcblxuICAgIC8vIFNsb3QgMCBpcyBleGVtcHQ6IG91ciBvd24gZGlzayBhbnN3ZXJzIGZvciBldmVyeSB3aW5kb3cgdGhpcyBzdG9yZSBFVkVSIGhlbGQsIGFuZCBzY2FubmluZyBpdCBpcyB3aGF0IGtlZXBzIHRoZSBpbmRleCBob25lc3QgYWJvdXQgdGhlbS4gUmVhZCBsaXZlIGVhY2ggY2FsbCAtIHVwZGF0ZVNvdXJjZXMgbW92ZXMgdGhlIHdpbmRvd3Mgb24gcnVubmluZyBzbG90cywgc28gYSBzb3VyY2UgZ29lcyBzdGFsZSAob3IgY29tZXMgYmFjaykgd2hpbGUgaXRzIGxvb3BzIHJ1bi5cbiAgICBwcml2YXRlIHdpbmRvd3NBbGxvd1NjYW5uaW5nKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0udmFsaWRXaW5kb3dzLnNvbWUodyA9PiB3WzFdID4gRGF0ZS5ub3coKSAtIFNDQU5fU1RBTEVfV0lORE9XX0dSQUNFKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0U291cmNlU3luY0xvb3BzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5yZWdpc3RlclNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgc291cmNlT2JqID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZU9iai5zb3VyY2U7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gSWYgYSBzbG90IGV2ZXIgZ2V0cyBUV08gb2YgdGhlc2UsIGl0cyBsb29wcyBhcmUgZG91YmxlZCAtIGV2ZXJ5IHBvbGwgYW5kIGZ1bGwgc3luYyBydW5zIHR3aWNlXG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNvdXJjZVN5bmNTdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzb3VyY2VJbmRleCwgdXJsOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnVybCwgaW50ZXJtZWRpYXRlOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSB9KTtcbiAgICAgICAgLy8gUmVhZCBsaXZlIGZvciBldmVyeSBwYXNzLCBub3QgY2FwdHVyZWQgLSB0aGUgc3RvcmUncyBzb3VyY2UgbGlzdCBjYW4gY2hhbmdlIHdoaWxlIGxvb3BzIHJ1blxuICAgICAgICBsZXQgbm9GdWxsU3luYyA9ICgpID0+IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0ubm9GdWxsU3luYztcbiAgICAgICAgLy8gQW4gaW50ZXJtZWRpYXRlIGlzIGEgZGVwbG95IHN3aXRjaG92ZXIncyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIFBPUlQgb250byBhIHNvdXJjZSB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBzYW1lIGJ1Y2tldCwgcmVhY2hhYmxlIGFub3RoZXIgd2F5IGZvciBhIGZldyBtaW51dGVzLiBTY2FubmluZyBpdCB3b3VsZCBsaXN0IGV4YWN0bHkgd2hhdCBzY2FubmluZyB0aGF0IHNvdXJjZSBsaXN0cywgYWdhaW5zdCBhIHBvcnQgdGhhdCBpcyBhYm91dCB0byBkaXNhcHBlYXIgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkLCBhbmQgdGhlIHNvdXJjZSBpdCB3YXMgc3BsaXQgb3V0IG9mIGNvdmVycyBpdCBmb3IgYXMgbG9uZyBhcyBpdCBleGlzdHMgYW5kIGFmdGVyIGl0IGlzIGdvbmUuXG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVja2VkIHBlciB0aWNrLCBuZXZlciBkZWNpZGVkIG9uY2U6IHRoZSB3aW5kb3dzIG1vdmUgb24gcnVubmluZyBzbG90cyAoc2VlIHVwZGF0ZVNvdXJjZXMpLCBzbyBhIHNvdXJjZSBnb2VzIHN0YWxlIG1pZC1saWZlIGFuZCBjYW4gY29tZSBiYWNrIGlmIGEgY29uZmlnIGV4dGVuZHMgdGhlbS4gTG9nZ2VkIG9ubHkgb24gZWFjaCB0cmFuc2l0aW9uIGludG8gc3RhbGVuZXNzLlxuICAgICAgICBsZXQgbG9nZ2VkU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNraXBTdGFsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvd3NBbGxvd1NjYW5uaW5nKHNvdXJjZUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlZFN0YWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghbG9nZ2VkU3RhbGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblNraXBwZWRTdGFsZVdpbmRvd3NcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgdmFsaWRXaW5kb3dzOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnZhbGlkV2luZG93cy5tYXAodyA9PiBbbmV3IERhdGUod1swXSkudG9JU09TdHJpbmcoKSwgbmV3IERhdGUod1sxXSkudG9JU09TdHJpbmcoKV0pLCBncmFjZU1zOiBTQ0FOX1NUQUxFX1dJTkRPV19HUkFDRSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBbiBhbHJlYWR5LXN0YWxlIHNvdXJjZSBza2lwcyBnZXRDb25maWcgZW50aXJlbHk6IGl0cyBlbmRwb2ludCBpcyBvZnRlbiBsb25nIGdvbmUsIGFuZCByZXRyeWluZyB0aGF0IGV2ZXJ5IDMwcyBmb3JldmVyIGlzIG5vaXNlIGFib3V0IGEgc291cmNlIHdlIHdvdWxkIG5vdCBzY2FuIGFueXdheSAoaWYgaXRzIHdpbmRvd3MgYXJlIGxhdGVyIGV4dGVuZGVkLCB0aGUgZnVsbC1yb3VuZCBwb2xsIGJlbG93IHBpY2tzIGl0IHVwIC0ganVzdCB3aXRob3V0IGNoYW5nZSBwb2xsaW5nIHVudGlsIGEgcmVzdGFydClcbiAgICAgICAgd2hpbGUgKCFza2lwU3RhbGUoKSAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgc291cmNlLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyID0gISFjb25maWcuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiaW5pdGlhbFNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgIC8vIEhvdXJseSBmb3Igb3VyIG93biBkaXNrIChubyBzb3VyY2VDb25maWcgLSBhIGNoZWFwIGxvY2FsIHdhbGssIGFuZCBob3cgYSBzaWJsaW5nIHByb2Nlc3MncyB3cml0ZXMgaW50byB0aGUgc2hhcmVkIGZvbGRlciBhcmUgZm91bmQpIGFuZCBmb3IgcmVtb3RlIHBlZXJzIChpbmRleC1iYWNrZWQsIGNoZWFwIGxpc3RpbmdzKTsgdGhlIHNsb3cgaW50ZXJ2YWwgaXMgb25seSBmb3Igc291cmNlcyB3aGVyZSBhIGZ1bGwgbGlzdGluZyBpcyBnZW51aW5lbHkgZXhwZW5zaXZlIChiYWNrYmxhemUpXG4gICAgICAgIGxldCBwb2xsSW50ZXJ2YWwgPSAoIXNvdXJjZU9iai5zb3VyY2VDb25maWcgfHwgc291cmNlT2JqLnNvdXJjZUNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiKSAmJiBGVUxMX1JFU0NBTl9JTlRFUlZBTCB8fCBGVUxMX1JFU0NBTl9OT05fUkVNT1RFX0lOVEVSVkFMO1xuICAgICAgICAvLyBCb3RoIGxvb3BzIGJlbG93IHJ1biBvbmUgYXQgYSB0aW1lOiBhIGNoYW5nZS1wb2xsIHRpY2sgbGFuZGluZyBtaWQgZnVsbCByb3VuZCB3b3VsZCBvdGhlcndpc2Ugc3RhcnQgYSBzZWNvbmQgY29weSBwYXNzIG92ZXIgdGhlIHNhbWUgcGVuZGluZyBsaXN0LCBkb3dubG9hZGluZyBldmVyeXRoaW5nIHR3aWNlXG4gICAgICAgIGxldCBzZXJpYWwgPSBydW5JblNlcmlhbChhc3luYyAoZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBhd2FpdCBmbmMoKSk7XG4gICAgICAgIGF3YWl0IHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KHBvbGxJbnRlcnZhbCwgKCkgPT4gc2VyaWFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwU3RhbGUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4KShcInB1c2hcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCkoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsICgpID0+IHNlcmlhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBTdGFsZSgpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gQSBzY2FuIHRoYXQgaGFzIG5vdCBzdWNjZWVkZWQgeWV0IGlzIHJldHJpZWQgSEVSRSwgYmVmb3JlIGFueXRoaW5nIGVsc2UgLSBwb2xsaW5nIGNoYW5nZXMgYW5kIGNvcHlpbmcgYWdhaW5zdCBhIG5ldmVyLXNjYW5uZWQgc291cmNlIHdvdWxkIHJ1biBvbiBhcmJpdHJhcmlseSBzdGFsZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmICghc3RhdGUuc2NhblN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2Uoc291cmNlSW5kZXgpKFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KSgpO1xuICAgICAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIFBVTEwgZGlyZWN0aW9uOiBhIGZ1bGwgbWV0YWRhdGEgc2NhbiAoc2l6ZSwgd3JpdGVUaW1lLCBwYXRoKSBvZiBvbmUgc291cmNlLCBhcHBsaWVkIHRvIG91ciBpbmRleC4gUmV0dXJucyB0aGUgc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcHVzaFNvdXJjZSB1c2VzIGZvciB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLlxuICAgIHByaXZhdGUgYXN5bmMgcHVsbFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0geyB0eXBlOiBcIm1ldGFkYXRhU2NhblwiLCBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc3RhcnRUaW1lOiBzY2FuU3RhcnQgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpIH0pO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGlsbCBydW5uaW5nICgke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cywgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pYCk7XG4gICAgICAgIH0sIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAvLyBUaGUgbGlzdGluZyByZXF1ZXN0IGRlbGliZXJhdGVseSB0YWtlcyBubyB0aW1lIG9yIHJvdXRlIGZpbHRlcnM6IG91ciBzbG93ZXN0IHNvdXJjZXMgKGJhY2tibGF6ZSkgc3VwcG9ydCBuZWl0aGVyLCBzbyBmaWx0ZXJpbmcgd291bGQgaGFwcGVuIGFmdGVyIHRoZSBmdWxsIGZldGNoIGFueXdheSAtIGxpdHRsZSBiZW5lZml0LCBtb3JlIHJvb20gZm9yIGRlc3luY2hyb25pemF0aW9uLiBBbmQgaWYgYSBmdWxsIGxpc3RpbmcgZXZlciBiZWNvbWVzIHRvbyBiaWcgdG8gc2VuZCBvdmVyIHRoZSBuZXR3b3JrLCBpdCBpcyBhbHNvIHRvbyBiaWcgZm9yIHRoZSByZWNlaXZpbmcgcHJvY2VzcyB0byBob2xkIGluIG1lbW9yeSAtIHRoZSBmaXggaXMgbW9yZSByb3V0aW5nIHNoYXJkcyAoZWFjaCBzdG9yaW5nIGFuZCBzZW5kaW5nIGxlc3MpLCBub3QgZmlsdGVyaW5nLlxuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gV2hhdCB3ZSBiZWxpZXZlIHRoZSBzb3VyY2UgaGFzOiB3aGljaGV2ZXIgaXMgbGFyZ2VyIG9mIGl0cyBwcmV2aW91cyBsaXN0aW5nIGFuZCB0aGUgaW5kZXggZW50cmllcyBuYW1pbmcgaXQgYXMgaG9sZGVyLiBGaWxlcyBkbyBub3QganVzdCB2YW5pc2ggLSBhIGxpc3RpbmcgZmFyIGJlbG93IHRoaXMgbWVhbnMgdGhlIG90aGVyIGVuZCBpcyBicmllZmx5IGJyb2tlbiwgYW5kIGJlbGlldmluZyBpdCB3b3VsZCBwdXJnZSBldmVyeXRoaW5nIGl0IGhlbGQuXG4gICAgICAgICAgICAgICAgbGV0IGhlbGQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBzY2FubmVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4KSBoZWxkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IE1hdGgubWF4KHN0YXRlLnNjYW5uZWRDb3VudCwgaGVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXhwZWN0ZWQgPiAwICYmIGZpbGVzLmxlbmd0aCA8IGV4cGVjdGVkIC8gMikpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0cyA+PSBTVVNQSUNJT1VTX1NDQU5fUkVUUklFUykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgU1RJTEwgbGlzdHMgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHdoZXJlIH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkLCBhZnRlciAke2F0dGVtcHRzfSByZXRyaWVzIC0gYWNjZXB0aW5nIHRoZSBsaXN0aW5nIGFzIHRoZSB0cnV0aGApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgbGlzdGVkICR7ZmlsZXMubGVuZ3RofSBmaWxlcywgYnV0IH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkIChwcmV2aW91cyBsaXN0aW5nICR7c3RhdGUuc2Nhbm5lZENvdW50fSwgaW5kZXggZW50cmllcyBpdCBob2xkcyAke2hlbGR9KSAtIHRoZSBvdGhlciBlbmQgaXMgcHJvYmFibHkgYnJpZWZseSBicm9rZW47IGFza2luZyBhZ2FpbiBpbiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSAvIDEwMDB9cyAocmV0cnkgJHthdHRlbXB0c30gb2YgJHtTVVNQSUNJT1VTX1NDQU5fUkVUUklFU30pYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCB3aGlsZSB0aGUgbGlzdGluZyB3YXMgaW4gZmxpZ2h0OyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm4gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgaW5kZXhTaXplQmVmb3JlID0gdGhpcy5zdG9yZS5pbmRleFNpemUoKTtcbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgbGV0IG5ld1BhdGhzID0gMDtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgc2Vlbi5zZXQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoZmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIG5ld1BhdGhzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICAvLyBFbnRyaWVzIHRoaXMgc291cmNlIHdhcyB0aGUgaG9sZGVyIG9mLCBidXQgdGhhdCBpdHMgbGlzdGluZyBkaWQgbm90IG1lbnRpb246IG91ciBvd24gZGlzayB0YWtlcyBvdmVyIGFzIGhvbGRlciB3aGVuIGl0IGhhcyBhIGNvcHksIGFuZCBvbmx5IHdpdGggbm8gbG9jYWwgY29weSBlaXRoZXIgaXMgdGhlIGVudHJ5IGZvcmdvdHRlbiAtIHdlIHdlcmUgd3JvbmcgYWJvdXQgd2hlcmUgdGhlIGZpbGUgaXMsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBpdCBoYXZpbmcgYmVlbiBkZWxldGVkLiBFbnRyaWVzIGNoYW5nZWQgYWZ0ZXIgdGhlIHNjYW4gc3RhcnRlZCBhcmUga2VwdDogdGhlIGxpc3RpbmcgbWF5IHNpbXBseSBwcmVkYXRlIHRoZW0uIFRvbWJzdG9uZXMgYXJlIG5vdCB3YWxrZWQgaGVyZSBhdCBhbGwsIGJlY2F1c2UgdGhleSBhcmUgbm90IGZpbGVzIGEgbGlzdGluZyBjb3VsZCB2b3VjaCBmb3IuXG4gICAgICAgIGxldCByZW1vdmVkRnJvbUluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJlcG9pbnRlZFRvTG9jYWwgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSBzY2FubmVkU291cmNlc0xpc3RJbmRleCAmJiBlbnRyeS5jaGFuZ2VkQXQgPCBzY2FuU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb2ludGVkVG9Mb2NhbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICByZW1vdmVkRnJvbUluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3VudGVkIG9ubHkgd2hlbiB0aGUgc291cmNlIFNIT1VMRCBob2xkIHRoZSBlbnRyeSAoaXRzIHJvdXRlIG1hdGNoZXMpIC0gdGhlc2UgYXJlIHdoYXQgdGhlIHJlY29uY2lsZSBwYXNzIHB1c2hlcyB0byBpdCAod2hpY2ggYWxzbyBpZ25vcmVzIHRoZSB2YWxpZCB3aW5kb3c6IHN5bmNocm9uaXphdGlvbiBtb3ZlcyBleGlzdGluZyB2YWx1ZXMsIHRoZSB3aW5kb3cgb25seSByb3V0ZXMgZnJlc2ggd3JpdGVzKVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbWlzc2luZ09uU291cmNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBsaXN0ZWQ6IGZpbGVzLmxlbmd0aCwgaW5kZXhlZEJlZm9yZTogaW5kZXhTaXplQmVmb3JlLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkLCBvdXRzaWRlUm91dGU6IHRhbGx5LmZpbHRlcmVkLCBtaXNzaW5nT25Tb3VyY2UsIHJlcG9pbnRlZFRvTG9jYWwsIHJlbW92ZWRGcm9tSW5kZXggfSk7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBNYXRoLm1heChzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCBzY2FuU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUCk7XG4gICAgICAgIHN0YXRlLnNjYW5TdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gc2VlbjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHVzaCBkaXJlY3Rpb24gb2Ygc3luY2hyb25pemF0aW9uOiBldmVyeXRoaW5nIHdlIGtub3cgdGhhdCB0aGUgc291cmNlIGlzIG1pc3NpbmcgKG9yIGhvbGRzIGFuIG9sZGVyIGNvcHkgb2YpIGlzIHdyaXR0ZW4gdG8gaXQg4oCUIGluY2x1ZGluZyBkZWxldGlvbnMsIGFzIHRvbWJzdG9uZSB3cml0ZXMuIFRoaXMgaXMgd2hhdCBoZWFscyBhIHNvdXJjZSB3aG9zZSBiYWNrZ3JvdW5kIHdyaXRlcyBmYWlsZWQgKGUuZy4gaXQgd2FzIGRvd24pOiB0aGUgbmV4dCBzY2FuIHNlZXMgd2hhdCdzIG1pc3NpbmcgYW5kIHJlLXNlbmRzIGl0LiBBIGZhaWxpbmcgZmlsZSBpcyBza2lwcGVkLCBub3QgZmF0YWwgKGltbXV0YWJsZSB0YXJnZXRzIGFyZSBoYW5kbGVkIGJ5IGZvcmNlU2V0SW1tdXRhYmxlLCBhbmQgb25lIHVucmVhZGFibGUgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCBvZiB0aGUgcGFzcykgLSBvbmx5IGEgcnVuIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzICh0aGUgc291cmNlIGl0c2VsZiBpcyBkb3duKSBhYm9ydHMgdW50aWwgdGhlIG5leHQgc2NhbiBjeWNsZS5cbiAgICBwcml2YXRlIGFzeW5jIHB1c2hTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlciwgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHZhbGlkV2luZG93cywgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IGFjY2VwdHNXcml0ZXMgPSB3aW5kb3dzQWNjZXB0V3JpdGVzKHZhbGlkV2luZG93cyk7XG4gICAgICAgIGxldCB0YXJnZXRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHB1c2hlZCA9IDA7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIEZpbGVzIGZpcnN0LCB0aGVuIHRoZSBkZWxldGlvbnMgLSB0d28gd2Fsa3Mgbm93IHRoYXQgdGhleSBhcmUgdHdvIG1hcHMsIGFuZCB0aGUgZGVsZXRpb25zIG9uZSBpcyB0aGUgc2hvcnQgb25lXG4gICAgICAgIGxldCBwdXNoYWJsZTogeyBrZXk6IHN0cmluZzsgd3JpdGVUaW1lOiBudW1iZXI7IGVudHJ5PzogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSB0YXJnZXRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHB1c2hhYmxlLnB1c2goeyBrZXksIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBlbnRyeSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHsga2V5LCB3cml0ZVRpbWUsIGVudHJ5IH0gb2YgcHVzaGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgbm90IHJlY29uY2lsZWQ6IGl0IHByb3BhZ2F0ZXMgYnkgYmVpbmcgYXNrZWQgZm9yLCBvbiBpdHMgb3duIHNjaGVkdWxlIChzZWUgcG9sbFJvdXRpbmdDb25maWcpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhY2NlcHRzV3JpdGVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRoZWlyVGltZSA9IGxpc3RpbmcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGhlaXJUaW1lICE9PSB1bmRlZmluZWQgJiYgdGhlaXJUaW1lID49IHdyaXRlVGltZSkgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBvbmx5IG5lZWRzIHB1c2hpbmcgd2hpbGUgdGhlIHNvdXJjZSBzdGlsbCBob2xkcyBhbiBvbGRlciBjb3B5LiBJdCB0cmF2ZWxzIGFzIGRlbCAobmV2ZXIgYXMgYW4gZW1wdHkgc2V0IC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycyksIHdpdGggdGhlIE9SSUdJTkFMIGRlbGV0aW9uIHRpbWUgc28gb3JkZXJpbmcgc3Vydml2ZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5kZWwoa2V5LCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBob2xkZXIgPSBhd2FpdCB0aGlzLnN0b3JlLmdldEVudHJ5SG9sZGVyKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IGhvbGRlciwgdG86IHNvdXJjZSwgcGF0aDoga2V5LCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpLiBUaGUgc291cmNlIGhhdmluZyBhIE5FV0VSIGZpbGUgdGhhbiBvdXIgaW5kZXggKHRoZSBsaXN0aW5nIHdlIHB1c2hlZCBmcm9tIHdhcyBzdGFsZSkgaXMgYWRvcHRlZCBleGFjdGx5IHRoZSB3YXkgdGhlIHB1bGwgZGlyZWN0aW9uIGFkb3B0cyBhIGxpc3RpbmcgZW50cnkgLSBhbmQgcHVzaGluZyBvdXIgc3RhbGUgY29weSBzdG9wcy4gT3RoZXJ3aXNlIHRoZSBIT0xERVIgY291bGQgbm90IHByb2R1Y2UgdGhlIGZpbGUsIHdoaWNoIHRoZSBuZXh0IHJvdW5kJ3MgcHVsbCByZS1yZXNvbHZlczsgZWl0aGVyIHdheSwgc2lsZW5jZSBoZXJlIHdhcyB0aGUgYnVnLlxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlycyAmJiB0aGVpcnMud3JpdGVUaW1lID4gd3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogdGhlaXJzLndyaXRlVGltZSwgc2l6ZTogdGhlaXJzLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJwdXNoRm91bmROZXdlck9uU291cmNlXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgb3VyV3JpdGVUaW1lOiBuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCksIHRoZWlyV3JpdGVUaW1lOiBuZXcgRGF0ZSh0aGVpcnMud3JpdGVUaW1lKS50b0lTT1N0cmluZygpLCBvdXJTaXplOiBlbnRyeS5zaXplLCB0aGVpclNpemU6IHRoZWlycy5zaXplIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicHVzaENvcHlVbmF2YWlsYWJsZVwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGhvbGRlcjogaG9sZGVyLmdldERlYnVnTmFtZSgpLCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCksIHNvdXJjZUhhczogdGhlaXJzICYmIGAke3RoZWlycy5zaXplfSBieXRlcyBhdCAke25ldyBEYXRlKHRoZWlycy53cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9YCB8fCBcIm5vdGhpbmdcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFNZTkNfRVJST1JfTE9HX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZUZhaWx1cmVzID49IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwYXVzZSBwZXIgZmFpbHVyZSwgc28gYSBkb3duIG5ldHdvcmsgdGFrZXMgbWludXRlcyB0byBidXJuIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIGluc3RlYWQgb2YgYW4gaW5zdGFudFxuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVjb25jaWxpbmcgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMsICR7ZmFpbGVkfSBmYWlsZWQke2Fib3J0ZWQgJiYgYCBiZWZvcmUgYWJvcnRpbmcgdGhlIHBhc3MgKCR7Y29uc2VjdXRpdmVGYWlsdXJlc30gY29uc2VjdXRpdmUgZmFpbHVyZXMgLSB0aGUgc291cmNlIGxvb2tzIGRvd247IHRoZSBuZXh0IHNjYW4gY3ljbGUgcmV0cmllcylgIHx8IFwiXCJ9LiBGaXJzdCBlcnJvcnM6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicmVjb25jaWxlRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHB1c2hlZCwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB2YWxpZCB3aW5kb3cgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIGhlcmU6IGl0IGRlY2lkZXMgd2hlcmUgV1JJVEVTIHJvdXRlLCBidXQgYSBzY2FuIGlzIHVzIGFza2luZyBhIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMgLSBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGUgd2luZG93ICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS4gT25seSB0aGUgcm91dGUgZmlsdGVyczogYSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGxlZ2l0aW1hdGVseSBpbmNsdWRlcyBrZXlzIHRoYXQgYXJlbid0IG91cnMuXG4gICAgICAgICAgICBsZXQgeyByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMsIGFuZCBhIHRpZSBrZWVwcyB3aGF0IHdlIGhhdmUgLSBvdGhlcndpc2UgZXZlcnkgcmVzY2FuIG9mIGFuIHVuY2hhbmdlZCBmaWxlIHdvdWxkIHJlLXJlY29yZCBpdCwgbW92aW5nIGl0cyBob2xkZXIgYW5kIHdyaXRpbmcgYSBsb2cgcmVjb3JkIGZvciBub3RoaW5nLiBjdXJyZW50V3JpdGVUaW1lIGNvdW50cyBkZWxldGlvbnMsIHNvIGEgbGlzdGluZyB0aGF0IHN0aWxsIHNob3dzIGEgZmlsZSB3ZSBrbm93IHdhcyBkZWxldGVkIGRvZXMgbm90IHJlc3VycmVjdCBpdC5cbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKSkgcmV0dXJuIFwidW5jaGFuZ2VkXCI7XG4gICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAtIGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUgLSBzbyB0aGF0IGlzIHdoYXQgaXQgaXMgdGFrZW4gYXNcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFwidG9tYnN0b25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCByb3V0ZXM6IHJvdXRlICYmIFtyb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9sbHMgcnVuIGNvbnN0YW50bHksIHNvIG9ubHkgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBjaGFuZ2VkIHRoZSBpbmRleCBnZXQgYW4gZW50cnlcbiAgICAgICAgaWYgKHRhbGx5Lm5ldyB8fCB0YWxseS51cGRhdGVkIHx8IHRhbGx5LnRvbWJzdG9uZSkge1xuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiY2hhbmdlc1BvbGxcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgY2hhbmdlczogY2hhbmdlcy5sZW5ndGgsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ICs9IGNoYW5nZXMubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gcG9sbFN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVA7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWRzIHRoZSBmaWxlcyBhIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHByZXNlcnZpbmcgdGhlaXIgbW9kaWZpZWQgdGltZXMg4oCUIHNvIGEgbmV3ZXIgbG9jYWwgd3JpdGUgYWx3YXlzIHdpbnMuIFNraXBwZWQgZm9yIG5vRnVsbFN5bmMgc291cmNlcyAoZnJvbnRpbmcgYSBsYXJnZSBkYXRhYmFzZSB3aXRob3V0IGNvcHlpbmcgaXQpOyByZWFkcyBzdGlsbCBkb3duLWNhY2hlIGxhemlseS4gT25seSBvbmUgcGFzcyBwZXIgU09VUkNFIHJ1bnMgYXQgYSB0aW1lIChjYWNoZSBrZXlzIHRoZSBzZXJpYWxpemVyIGJ5IHNvdXJjZSBpbmRleCkgLSB0d28gcGFzc2VzIG92ZXIgdGhlIHNhbWUgcGVuZGluZyBsaXN0IHdvdWxkIGRvd25sb2FkIGV2ZXJ5dGhpbmcgdHdpY2UuXG4gICAgcHJpdmF0ZSBjb3B5U291cmNlRmlsZXMgPSBjYWNoZSgoc291cmNlSW5kZXg6IG51bWJlcikgPT4gcnVuSW5TZXJpYWwoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybjtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gY29waWVkU291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwZW5kaW5nLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bGxTeW5jXCIsXG4gICAgICAgICAgICBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGRvbmVGaWxlczogMCxcbiAgICAgICAgICAgIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLFxuICAgICAgICAgICAgZG9uZUJ5dGVzOiAwLFxuICAgICAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImRlbHRhU3luY1N0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgYnl0ZXM6IHRvdGFsQnl0ZXMgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc0xvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbG9nUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzc0xvZ2dlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBEZWx0YSBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7YWN0aXZpdHkuZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKWApKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbChsb2dQcm9ncmVzcywgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBzbG93RXJyb3JUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGFjdGl2aXR5LnN0YXJ0VGltZTtcbiAgICAgICAgICAgIGxldCBkb25lRmlsZXMgPSBhY3Rpdml0eS5kb25lRmlsZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBkb25lQnl0ZXMgPSBhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBieXRlc1BlclNlY29uZCA9IGRvbmVCeXRlcyAvIChlbGFwc2VkIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nQnl0ZXMgPSB0b3RhbEJ5dGVzIC0gZG9uZUJ5dGVzO1xuICAgICAgICAgICAgbGV0IGV0YVRleHQgPSBcInVua25vd24gKG5vIGJ5dGVzIHRyYW5zZmVycmVkIHlldClcIjtcbiAgICAgICAgICAgIGlmIChieXRlc1BlclNlY29uZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nTXMgPSByZW1haW5pbmdCeXRlcyAvIGJ5dGVzUGVyU2Vjb25kICogMTAwMDtcbiAgICAgICAgICAgICAgICBldGFUZXh0ID0gYCR7Zm9ybWF0VGltZShyZW1haW5pbmdNcyl9IHJlbWFpbmluZywgY29tcGxldGluZyBhcm91bmQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgcmVtYWluaW5nTXMpLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGVsdGEgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pIGhhcyBiZWVuIHJ1bm5pbmcgZm9yICR7Zm9ybWF0VGltZShlbGFwc2VkKX06ICR7ZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoZG9uZUZpbGVzIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGRvbmVCeXRlcyl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIGRvbmVCeXRlcyAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihieXRlc1BlclNlY29uZCl9Qi9zLiBFc3RpbWF0ZWQgJHtldGFUZXh0fS5gKTtcbiAgICAgICAgfSwgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwpO1xuICAgICAgICAoc2xvd0Vycm9yVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEZpbGVzID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IG1pc3NpbmdPblNvdXJjZSA9IDA7XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgY2Fubm90IGdpdmUgdXMgdGhlIGZpbGUgKGl0cyByZWFkIGhhZCBub3RoaW5nLCBvciBpdCBlcnJvcmVkKS4gUmV0cnlpbmcgdGhlIHNhbWUgZW50cnkgZm9yZXZlciBpcyBub3QgYW4gYW5zd2VyOiBpZiBvdXIgb3duIGRpc2sgaG9sZHMgYSBjb3B5LCBJVCBiZWNvbWVzIHRoZSBob2xkZXI7IHdpdGggbm8gbG9jYWwgY29weSBlaXRoZXIsIHRoZSBlbnRyeSBpcyBwdXJnZWQgLSBmb3Jnb3R0ZW4sIG5vdCBkZWxldGVkLCBleGFjdGx5IGxpa2UgYSByZWFkIHRoYXQgY29tZXMgdXAgZW1wdHkgZXZlcnl3aGVyZSAtIGFuZCB0aGUgbmV4dCBmdWxsIHB1bGwgcmUtZmluZHMgaXQgaWYgaXQgZXhpc3RzIGFueXdoZXJlLlxuICAgICAgICBsZXQgcmVzb2x2ZVVuYXZhaWxhYmxlID0gYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBlbnRyeTogSW5kZXhFbnRyeSwgZXh0cmE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmFzZSA9IHsgZXZlbnQsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgZXhwZWN0ZWRTaXplOiBlbnRyeS5zaXplLCBleHBlY3RlZFdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCAuLi5leHRyYSB9O1xuICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbG9jYWwgY29weSBjYW4gYmUgTkVXRVIgdGhhbiB0aGUgZW50cnkgKHdoaWNoIGlzIGV4YWN0bHkgd2h5IGNvcHlBcmNoaXZlRmlsZSByZWZ1c2VzIHRvIG92ZXJ3cml0ZSBpdCAtIHNlZSBpdHMgZGVzdGluYXRpb24gY2hlY2spLCBzbyB0aGUgcmVwb2ludCBrZWVwcyB0aGUgbmV3ZXIgb2YgdGhlIHR3byB0aW1lcyByYXRoZXIgdGhhbiByb2xsaW5nIHRoZSBpbmRleCBiYWNrXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IE1hdGgubWF4KGVudHJ5LndyaXRlVGltZSwgbG9jYWwud3JpdGVUaW1lKSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwicmVwb2ludGVkIHRvIG91ciBsb2NhbCBjb3B5XCIsIGxvY2FsU2l6ZTogbG9jYWwuc2l6ZSwgbG9jYWxXcml0ZVRpbWU6IG5ldyBEYXRlKGxvY2FsLndyaXRlVGltZSkudG9JU09TdHJpbmcoKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgPD0gZW50cnkud3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcInB1cmdlZCAtIG5laXRoZXIgdGhlIHNvdXJjZSBub3Igb3VyIGRpc2sgaGFzIGl0LCBzbyBpdCBkb2VzIG5vdCBleGlzdFwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgbmV3ZXIgd3JpdGUgbGFuZGVkIHdoaWxlIHdlIHdlcmUgY2hlY2tpbmcgLSB0aGUgZW50cnkgaXMgbm8gbG9uZ2VyIHRoZSBvbmUgd2UgZm91bmQgdW5hdmFpbGFibGUsIHNvIGl0IGlzIGxlZnQgYWxvbmVcbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwia2VwdCAtIGEgbmV3ZXIgd3JpdGUgYXBwZWFyZWQgd2hpbGUgY2hlY2tpbmdcIiwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghYWJvcnRlZCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGtleSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZEJ5dGVzICs9IGNvcGllZC5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgZ2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3B5IGNhcnJpZXMgdGhlIHNvdXJjZSdzIHdyaXRlIHRpbWUsIGFuZCB0aGUgaW5kZXggY29tbWl0cyBpdCB1bmRlciB0aGUgbm9ybWFsIG9yZGVyaW5nIHJ1bGUgKD49IHRoZSBjdXJyZW50IHRpbWUgd2lucykgLSBpdCByZWZ1c2luZyBtZWFucyBhIE5FV0VSIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSBjb3BpZWQsIHdoaWNoIG11c3QgYmUgc2FpZCwgbm90IHN3YWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29tbWl0U3VwZXJzZWRlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGNvcGllZFdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJkZWx0YVN5bmNNaXNzaW5nT25Tb3VyY2VcIiwga2V5LCBlbnRyeSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGluZyBmaWxlIHJlc29sdmVzIGV4YWN0bHkgbGlrZSBhIG1pc3Npbmcgb25lICh0aGUgc291cmNlIGNhbm5vdCBnaXZlIGl0IHRvIHVzIGVpdGhlciB3YXkpLCBzbyBpdCBuZXZlciB3ZWRnZXMgdGhlIHBhc3Mgb24gcmV0cmllcyBmb3JldmVyIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiB0aGUgc291cmNlIHJlY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzb2x2ZVVuYXZhaWxhYmxlKFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBrZXksIGVudHJ5LCB7IGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmVzb2x2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApLCByZXNvbHZlRXJyb3I6IFN0cmluZygocmVzb2x2ZUVycm9yIGFzIEVycm9yKS5zdGFjayA/PyByZXNvbHZlRXJyb3IpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImRlbHRhU3luY0ZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkaWZmQmFzZWQ6IHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lLCB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgdG90YWxCeXRlcywgcHJvY2Vzc2VkRmlsZXM6IGFjdGl2aXR5LmRvbmVGaWxlcywgY29waWVkRmlsZXMsIGNvcGllZEJ5dGVzLCBtaXNzaW5nT25Tb3VyY2UsIGZhaWxlZCwgYWJvcnRlZCB9KTtcbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8vIOKUgOKUgCBtYWludGVuYW5jZSDilIDilIBcblxuICAgIC8vIHJlYWRlckRpc2tMaW1pdDogdGhlIGRpc2sgaXMgb25seSBhIGJvdW5kZWQgcmVhZCBjYWNoZSwgc28gb25jZSBpdCBleGNlZWRzIHRoZSBsaW1pdCwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlsZXMgYXJlIGRlbGV0ZWQgZnJvbSBpdCAtIGJ1dCBPTkxZIHdoZW4gYW5vdGhlciBzb3VyY2UgdmVyaWZpYWJseSBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnkgcmVwb2ludHMgdG8gdGhhdCBzb3VyY2Ugc28gcmVhZHMga2VlcCB3b3JraW5nIChyZS1jYWNoaW5nIG9uIHRoZSBuZXh0IHJlYWQpLlxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5zdG9yZS5yZWFkZXJEaXNrTGltaXQ7XG4gICAgICAgIGlmICghbGltaXQgfHwgdGhpcy5ldmljdGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5zdG9yZS5pbmRleFRvdGFscygpO1xuICAgICAgICAvLyBDb3VudGVkIGRvd24gYXMgd2UgZXZpY3QsIHJhdGhlciB0aGFuIHJlLXJlYWQgcGVyIGZpbGU6IGEgcGFzcyBvbmx5IGV2ZXIgcmVtb3ZlcyBieXRlcyBmcm9tIHRoZSBkaXNrLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBkdXJpbmcgaXQgaXMgcGlja2VkIHVwIGJ5IHRoZSBuZXh0IHBhc3NcbiAgICAgICAgbGV0IGRpc2tCeXRlcyA9IHRvdGFscy5zbG90c1swXS5ieXRlQ291bnQ7XG4gICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIGxldCBldmljdGVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgZXZpY3RlZEJ5dGVzID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4IHx8IGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGVhc3QgcmVjZW50bHkgUkVBRCBmaXJzdDsgYSBrZXkgbm9ib2R5IGhhcyByZWFkIHNpbmNlIHdlIHN0YXJ0ZWQgZmFsbHMgYmFjayB0byB3aGVuIHdlIGxhc3QgY2hhbmdlZCBpdFxuICAgICAgICAgICAgc29ydChjYW5kaWRhdGVzLCB4ID0+IHRoaXMubGFzdEFjY2Vzcy5nZXQoeC5rZXkpIHx8IHguZW50cnkuY2hhbmdlZEF0KTtcbiAgICAgICAgICAgIGZvciAobGV0IHsga2V5LCBlbnRyeSB9IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZGlza0J5dGVzIDw9IGxpbWl0KSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50cnlVbmNoYW5nZWQoa2V5LCBlbnRyeSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBob2xkZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoaG9sZGVyKSB9KTtcbiAgICAgICAgICAgICAgICBldmljdGVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICBldmljdGVkQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICBkaXNrQnl0ZXMgLT0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmljdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGlzayBjYWNoZSBvdmVyIHJlYWRlckRpc2tMaW1pdCAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBldmljdGVkICR7ZXZpY3RlZEZpbGVzfSBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihldmljdGVkQnl0ZXMpfUIpLCBub3cgYXQgJHtmb3JtYXROdW1iZXIoZGlza0J5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKGxpbWl0KX1CYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb21ic3RvbmVzIG9ubHkgbmVlZCB0byBleGlzdCBsb25nIGVub3VnaCBmb3IgZXZlcnkgc3RvcmUgdG8gbGVhcm4gb2YgdGhlIGRlbGV0aW9uOyBleHBpcmVkIG9uZXMgYXJlIGZvcmdvdHRlbiBlbnRpcmVseS4gQSB3YWxrIG9mIHRoZSB0b21ic3RvbmVzIGFsb25lLCB3aGljaCBpcyB3aHkgaXQgY2FuIHJ1biBvZnRlbiBhbmQgY29zdCBub3RoaW5nLiBUaGUgcGh5c2ljYWwgZW1wdHkgZmlsZSBpcyByZW1vdmVkIG9ubHkgb24gYmFja2JsYXplIHNvdXJjZXM6IHJlbW90ZSBzdG9yZXMgZXhwaXJlIHRoZWlyIG93biB0b21ic3RvbmVzIChhIGRlbCB0aGVyZSB3b3VsZCBqdXN0IG1pbnQgYSBmcmVzaCBvbmUpLCBhbmQgb3VyIG93biBkaXNrIG5ldmVyIHN0b3JlZCBhbnl0aGluZyBmb3IgaXQuXG4gICAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVG9tYnN0b25lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBUT01CU1RPTkVfRVhQSVJZO1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLndyaXRlVGltZSA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICAvLyBBIE1BUktFRCBkZWxldGlvbiBuZXZlciBleHBpcmVzIGJ5IHRpbWUgLSBpdHMgYnl0ZXMgYXJlIHN0aWxsIG9uIGRpc2ssIGFuZCBwdXJnaW5nIHRoZSB0b21ic3RvbmUgd291bGQgbGV0IHRoZSBuZXh0IGRpc2sgc2NhbiByZXN1cnJlY3QgdGhlbSBhcyBsaXZlLiBSZXRlbnRpb24gZXhwaXJlcyBpdCBieSBTSVpFIChlbmZvcmNlSGlzdG9yeUxpbWl0KTsgb25seSBvbmNlIHRoZSBieXRlcyBhcmUgZ29uZSBkb2VzIHRoZSBwbGFpbiB0b21ic3RvbmUgYWdlIG91dCBoZXJlLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuZ2V0TWFya2VkRW50cnkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRW50cnkgPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dzQWNjZXB0V3JpdGVzKHNvdXJjZUVudHJ5LnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VFbnRyeS5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB2b2lkIHNvdXJjZS5kZWwoa2V5KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVtb3ZpbmcgZXhwaXJlZCB0b21ic3RvbmUgJHtrZXl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGlvbiBoaXN0b3J5IHJldGVudGlvbjogbWFya2VkIGZpbGVzIGtlZXAgdGhlaXIgYnl0ZXMgb24gb3VyIGRpc2sgdW50aWwgdGhlIGhpc3Rvcnkgb3V0Z3Jvd3MgbWF4KEhJU1RPUllfTUlOX0JZVEVTLCBsaXZlIGJ5dGVzICogaGlzdG9yeSBmYWN0b3IpOyB0aGVuIHRoZSBPTERFU1QgZGVsZXRpb25zIGxvc2UgdGhlaXIgYnl0ZXMgYW5kIGJlY29tZSBwbGFpbiB0b21ic3RvbmVzLCB3aGljaCBhZ2Ugb3V0IG5vcm1hbGx5IChjbGVhbnVwVG9tYnN0b25lcylcbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VIaXN0b3J5TGltaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoSElTVE9SWV9NSU5fQllURVMsIHRoaXMuc3RvcmUuaW5kZXhUb3RhbHMoKS5ieXRlQ291bnQgKiBhd2FpdCBnZXRIaXN0b3J5RmFjdG9yKCkpO1xuICAgICAgICBsZXQgbWFya2VkOiB7IGtleTogc3RyaW5nOyBzaXplOiBudW1iZXI7IGRlbGV0ZVRpbWU6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIG1hcmtlZC5wdXNoKHsga2V5LCBzaXplOiBlbnRyeS5zaXplLCBkZWxldGVUaW1lOiBlbnRyeS5kZWxldGVUaW1lIH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXJ0ZWRXaXRoQnl0ZXMgPSB0b3RhbEJ5dGVzO1xuICAgICAgICBzb3J0KG1hcmtlZCwgeCA9PiB4LmRlbGV0ZVRpbWUpO1xuICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgIGxldCBkcm9wcGVkQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCB7IGtleSwgc2l6ZSB9IG9mIG1hcmtlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG90YWxCeXRlcyA8PSBhbGxvd2VkKSBicmVhaztcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZHJvcE1hcmtlZEhpc3Rvcnkoa2V5KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgLT0gc2l6ZTtcbiAgICAgICAgICAgIGRyb3BwZWQrKztcbiAgICAgICAgICAgIGRyb3BwZWRCeXRlcyArPSBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGlvbiBoaXN0b3J5IG9mIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9IG91dGdyZXcgaXRzIGJ1ZGdldCAoJHtmb3JtYXROdW1iZXIoc3RhcnRlZFdpdGhCeXRlcyl9QiBrZXB0IHZzICR7Zm9ybWF0TnVtYmVyKGFsbG93ZWQpfUIgYWxsb3dlZCk6IGRyb3BwZWQgdGhlICR7ZHJvcHBlZH0gb2xkZXN0IG1hcmtlZCBmaWxlcyAoJHtmb3JtYXROdW1iZXIoZHJvcHBlZEJ5dGVzKX1CKTsgdGhlaXIgdG9tYnN0b25lcyByZW1haW4gdW50aWwgdGhleSBhZ2Ugb3V0YCk7XG4gICAgfVxufVxuIl19
828
+ /* _JS_SOURCE_HASH = "2d5e9c653ce54aeb06b6372d9addbd3e3e50fb8c07b5573187f12b3977cf911c"; */