sliftutils 1.7.48 → 1.7.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +99 -38
- package/package.json +1 -1
- package/storage/ArchivesDisk.d.ts +5 -5
- package/storage/ArchivesDisk.ts +19 -5
- package/storage/IArchives.d.ts +36 -7
- package/storage/IArchives.ts +76 -8
- package/storage/backblaze.d.ts +4 -4
- package/storage/backblaze.ts +89 -36
- package/storage/dist/ArchivesDisk.ts.cache +8 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +86 -36
- package/storage/remoteStorage/ArchivesRemote.d.ts +4 -5
- package/storage/remoteStorage/ArchivesRemote.ts +7 -7
- package/storage/remoteStorage/ArchivesUrl.d.ts +2 -1
- package/storage/remoteStorage/ArchivesUrl.ts +13 -3
- package/storage/remoteStorage/blobStore.d.ts +15 -6
- package/storage/remoteStorage/blobStore.ts +198 -115
- package/storage/remoteStorage/createArchives.d.ts +4 -5
- package/storage/remoteStorage/createArchives.ts +6 -11
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +15 -4
- package/storage/remoteStorage/dist/blobStore.ts.cache +194 -108
- package/storage/remoteStorage/dist/createArchives.ts.cache +4 -9
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +15 -3
- package/storage/remoteStorage/dist/sourcesList.ts.cache +79 -0
- package/storage/remoteStorage/dist/storageController.ts.cache +7 -10
- package/storage/remoteStorage/dist/storageServerState.ts.cache +50 -18
- package/storage/remoteStorage/remoteConfig.d.ts +3 -1
- package/storage/remoteStorage/remoteConfig.ts +11 -1
- package/storage/remoteStorage/sourcesList.d.ts +15 -0
- package/storage/remoteStorage/sourcesList.ts +69 -0
- package/storage/remoteStorage/storageController.d.ts +4 -4
- package/storage/remoteStorage/storageController.ts +11 -14
- package/storage/remoteStorage/storageServerState.d.ts +3 -0
- package/storage/remoteStorage/storageServerState.ts +40 -15
|
@@ -15,6 +15,7 @@ const backblaze_1 = require("../backblaze");
|
|
|
15
15
|
const remoteConfig_1 = require("./remoteConfig");
|
|
16
16
|
const BulkDatabaseBase_1 = require("../BulkDatabase2/BulkDatabaseBase");
|
|
17
17
|
const FileFolderAPI_1 = require("../FileFolderAPI");
|
|
18
|
+
const sourcesList_1 = require("./sourcesList");
|
|
18
19
|
// The storage engine of the remote storage server. Data lives in synchronization sources (at minimum an ArchivesDisk, the local disk); BlobStore keeps an index of every file (path, last modified time, size, and which source currently holds the data) in a BulkDatabase2, and synchronizes the index from all sources (see ArchivesSource in IArchives.ts). Every startup fully rescans each source's metadata, so the index self-heals; the file with the highest write time wins across all sources, so multiple sources need no stacking order.
|
|
19
20
|
exports.DEFAULT_FAST_WRITE_DELAY = misc_1.timeInMinute * 5;
|
|
20
21
|
const FAST_FLUSH_POLL = 1000 * 15;
|
|
@@ -22,10 +23,11 @@ const FAST_FLUSH_POLL = 1000 * 15;
|
|
|
22
23
|
exports.WINDOW_END_FLUSH_MARGIN = misc_1.timeInMinute * 5;
|
|
23
24
|
// Index changes are buffered in memory and written to the BulkDatabase2 in batches
|
|
24
25
|
const INDEX_FLUSH_INTERVAL = 1000 * 30;
|
|
25
|
-
// Sources
|
|
26
|
+
// Sources with a native (index-backed) change feed are polled this often
|
|
26
27
|
const CHANGES_POLL_INTERVAL = 1000 * 60;
|
|
27
|
-
//
|
|
28
|
+
// Full metadata rescans. supportsChangesAfter is the heuristic for "one of our own storage servers": their index-backed listings are cheap, so hourly is fine. Everything else (backblaze, plain disk) pays the full listing cost, so it rescans much less often.
|
|
28
29
|
const FULL_RESCAN_INTERVAL = 1000 * 60 * 60;
|
|
30
|
+
const FULL_RESCAN_UNINDEXED_INTERVAL = 1000 * 60 * 60 * 6;
|
|
29
31
|
// On a request for a file the index doesn't know, changes-after sources are re-polled, at most this often
|
|
30
32
|
const MISS_CHECK_INTERVAL = 1000 * 5;
|
|
31
33
|
// Change polls re-request this much overlap, so clock skew between us and a source can't drop changes
|
|
@@ -41,6 +43,9 @@ const DISK_LIMIT_CHECK_INTERVAL = 1000 * 60;
|
|
|
41
43
|
const FULL_SYNC_PARALLEL = 8;
|
|
42
44
|
// A full sync running longer than this is console.errored (and again every interval after), so a sync that will take days is loud instead of a quiet console.log every minute
|
|
43
45
|
const FULL_SYNC_SLOW_ERROR_INTERVAL = 1000 * 60 * 60;
|
|
46
|
+
// A reconcile pass skips failing files (one bad value must not stop the rest), but this many failures in a row means the target itself is down, so the pass aborts until the next scan cycle
|
|
47
|
+
const RECONCILE_MAX_CONSECUTIVE_FAILURES = 5;
|
|
48
|
+
const RECONCILE_ERROR_LOG_LIMIT = 3;
|
|
44
49
|
function newScanTally() {
|
|
45
50
|
return { filtered: 0, new: 0, updated: 0, tombstone: 0, unchanged: 0 };
|
|
46
51
|
}
|
|
@@ -65,8 +70,8 @@ class BlobStore {
|
|
|
65
70
|
this.sources = sources;
|
|
66
71
|
this.config = config;
|
|
67
72
|
this.stopped = { stop: false };
|
|
68
|
-
// The index's BulkDatabase2 files live under <folder>/index
|
|
69
|
-
this.index = new BulkDatabaseBase_1.BulkDatabaseBase("
|
|
73
|
+
// The index's BulkDatabase2 files live under <folder>/index. "blobIndex2": the "blobIndex" generation persisted sources-array positions as the holding source, which are not stable across runs - its entries are unusable, so it is simply never read again.
|
|
74
|
+
this.index = new BulkDatabaseBase_1.BulkDatabaseBase("blobIndex2", BulkDatabaseBase_1.noopReactiveDeps, async (p) => {
|
|
70
75
|
let base = new FileFolderAPI_1.NodeJSDirectoryHandleWrapper(path_1.default.join(this.folder, "index"));
|
|
71
76
|
for (let part of p.split("/")) {
|
|
72
77
|
if (part)
|
|
@@ -88,8 +93,16 @@ class BlobStore {
|
|
|
88
93
|
this.overlay = new Map();
|
|
89
94
|
this.sourceStates = this.sources.map(() => newSourceState());
|
|
90
95
|
this.syncStarted = false;
|
|
96
|
+
// The persistent identities behind IndexEntry.sourcesListIndex (see SourcesList)
|
|
97
|
+
this.sourcesList = new sourcesList_1.SourcesList(path_1.default.join(this.folder, "index", "sourcesList.txt"));
|
|
98
|
+
// Per slot: the persistent sourcesListIndex of that slot's URL, filled by registerSlot before the slot's sync runs
|
|
99
|
+
this.slotSourcesListIndexes = [];
|
|
100
|
+
this.slotRegistrations = [];
|
|
91
101
|
this.init = (0, caching_1.lazy)(async () => {
|
|
92
102
|
var _a;
|
|
103
|
+
for (let i = 0; i < this.sources.length; i++) {
|
|
104
|
+
await this.registerSlot(i);
|
|
105
|
+
}
|
|
93
106
|
await this.loadIndex();
|
|
94
107
|
this.syncStarted = true;
|
|
95
108
|
for (let i = 0; i < this.sources.length; i++) {
|
|
@@ -110,6 +123,44 @@ class BlobStore {
|
|
|
110
123
|
isLive(sourceIndex) {
|
|
111
124
|
return !!this.sources[sourceIndex] && !this.sourceStates[sourceIndex].dead;
|
|
112
125
|
}
|
|
126
|
+
registerSlot(slot) {
|
|
127
|
+
let existing = this.slotRegistrations[slot];
|
|
128
|
+
if (existing)
|
|
129
|
+
return existing;
|
|
130
|
+
let registration = this.sourcesList.ensure(this.sources[slot].url).then(index => {
|
|
131
|
+
this.slotSourcesListIndexes[slot] = index;
|
|
132
|
+
});
|
|
133
|
+
this.slotRegistrations[slot] = registration;
|
|
134
|
+
return registration;
|
|
135
|
+
}
|
|
136
|
+
// The persistent sourcesListIndex of a slot - only valid once the slot's registration resolved (init and runSourceSync guarantee that before any indexing happens)
|
|
137
|
+
sourcesListIndexOfSlot(slot) {
|
|
138
|
+
var _a;
|
|
139
|
+
let index = this.slotSourcesListIndexes[slot];
|
|
140
|
+
if (index === undefined) {
|
|
141
|
+
throw new Error(`Source slot ${slot} (${(_a = this.sources[slot]) === null || _a === void 0 ? void 0 : _a.url}) has no registered sourcesListIndex yet (store ${this.folder})`);
|
|
142
|
+
}
|
|
143
|
+
return index;
|
|
144
|
+
}
|
|
145
|
+
// The live slot currently serving a persistent sourcesListIndex, or undefined when no configured source has that URL anymore. Linear, but the sources list is tiny and this is always current (slots dying, or several slots sharing one URL across valid windows, need no bookkeeping).
|
|
146
|
+
slotForSourcesListIndex(sourcesListIndex) {
|
|
147
|
+
for (let i = 0; i < this.slotSourcesListIndexes.length; i++) {
|
|
148
|
+
if (this.slotSourcesListIndexes[i] === sourcesListIndex && this.isLive(i))
|
|
149
|
+
return i;
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
// The IArchives currently holding an entry's bytes: the live slot when the holder is still configured, otherwise resolved (cached) straight from its persisted URL - windows/routes decide when a source is scanned or written, but for reading bytes we know it holds, the URL alone is enough
|
|
154
|
+
async getEntryHolder(entry) {
|
|
155
|
+
var _a, _b;
|
|
156
|
+
let slot = this.slotForSourcesListIndex(entry.sourcesListIndex);
|
|
157
|
+
if (slot !== undefined)
|
|
158
|
+
return this.sources[slot].source;
|
|
159
|
+
let url = this.sourcesList.getUrl(entry.sourcesListIndex) || await this.sourcesList.getUrlReloading(entry.sourcesListIndex);
|
|
160
|
+
if (!url)
|
|
161
|
+
return undefined;
|
|
162
|
+
return (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.resolveSourceUrl) === null || _b === void 0 ? void 0 : _b.call(_a, url);
|
|
163
|
+
}
|
|
113
164
|
// Stops all synchronization scans/polls and flushes pending writes. Only used when the store genuinely cannot continue (rawDisk flip, process shutdown) - routine config changes go through updateSources instead, which the store survives.
|
|
114
165
|
async dispose() {
|
|
115
166
|
this.stopped.stop = true;
|
|
@@ -120,24 +171,24 @@ class BlobStore {
|
|
|
120
171
|
await this.flushIndex();
|
|
121
172
|
}
|
|
122
173
|
async loadIndex() {
|
|
123
|
-
let [writeTimes, sizes,
|
|
174
|
+
let [writeTimes, sizes, sourcesListIndexes] = await Promise.all([
|
|
124
175
|
this.index.getColumn("writeTime"),
|
|
125
176
|
this.index.getColumn("size"),
|
|
126
|
-
this.index.getColumn("
|
|
177
|
+
this.index.getColumn("sourcesListIndex"),
|
|
127
178
|
]);
|
|
128
179
|
let sizeMap = new Map(sizes.map(x => [x.key, x.value]));
|
|
129
|
-
let
|
|
180
|
+
let sourcesListIndexMap = new Map(sourcesListIndexes.map(x => [x.key, x.value]));
|
|
130
181
|
for (let entry of writeTimes) {
|
|
131
182
|
let size = sizeMap.get(entry.key);
|
|
132
|
-
let
|
|
133
|
-
// Explicit checks, as 0 is a valid size and a valid
|
|
134
|
-
if (size === undefined ||
|
|
183
|
+
let sourcesListIndex = sourcesListIndexMap.get(entry.key);
|
|
184
|
+
// Explicit checks, as 0 is a valid size and a valid sourcesListIndex
|
|
185
|
+
if (size === undefined || sourcesListIndex === undefined)
|
|
135
186
|
continue;
|
|
136
|
-
// The routing config is only ever read off our own disk (see
|
|
187
|
+
// The routing config is only ever read off our own disk (see updateScanIndex), and a loaded bucket always has it there - a persisted entry pointing elsewhere is stale
|
|
137
188
|
if (entry.key === remoteConfig_1.ROUTING_FILE) {
|
|
138
|
-
|
|
189
|
+
sourcesListIndex = this.sourcesListIndexOfSlot(0);
|
|
139
190
|
}
|
|
140
|
-
let full = { writeTime: entry.value, size,
|
|
191
|
+
let full = { writeTime: entry.value, size, sourcesListIndex, changedAt: entry.time, lastAccess: entry.time };
|
|
141
192
|
this.mem.set(entry.key, full);
|
|
142
193
|
this.countEntry(full, 1);
|
|
143
194
|
}
|
|
@@ -147,10 +198,11 @@ class BlobStore {
|
|
|
147
198
|
return;
|
|
148
199
|
this.indexFileCount += direction;
|
|
149
200
|
this.indexByteCount += entry.size * direction;
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
this.
|
|
201
|
+
// Entries can reference a source no longer configured (readable via getEntryHolder, but with no slot to count under)
|
|
202
|
+
let slot = this.slotForSourcesListIndex(entry.sourcesListIndex);
|
|
203
|
+
if (slot !== undefined) {
|
|
204
|
+
this.sourceFileCounts[slot] += direction;
|
|
205
|
+
this.sourceByteCounts[slot] += entry.size * direction;
|
|
154
206
|
}
|
|
155
207
|
}
|
|
156
208
|
setIndexEntry(key, entry) {
|
|
@@ -215,7 +267,7 @@ class BlobStore {
|
|
|
215
267
|
continue;
|
|
216
268
|
}
|
|
217
269
|
let source = spec.create();
|
|
218
|
-
this.sources.push({ source, validWindow: spec.validWindow, route: spec.route, noFullSync: spec.noFullSync, identity: spec.identity });
|
|
270
|
+
this.sources.push({ source, url: spec.url, validWindow: spec.validWindow, route: spec.route, noFullSync: spec.noFullSync, identity: spec.identity });
|
|
219
271
|
this.sourceStates.push(newSourceState());
|
|
220
272
|
this.sourceFileCounts.push(0);
|
|
221
273
|
this.sourceByteCounts.push(0);
|
|
@@ -252,14 +304,20 @@ class BlobStore {
|
|
|
252
304
|
state.stopped.stop = true;
|
|
253
305
|
state.scanComplete = true;
|
|
254
306
|
state.initialScan.resolve(undefined);
|
|
255
|
-
let
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
this.
|
|
260
|
-
|
|
307
|
+
let sourcesListIndex = this.slotSourcesListIndexes[sourceIndex];
|
|
308
|
+
// The same URL can be another live slot (one entry per valid window) - the endpoint is still configured, so its entries stay
|
|
309
|
+
if (sourcesListIndex !== undefined && this.slotForSourcesListIndex(sourcesListIndex) === undefined) {
|
|
310
|
+
let dropped = 0;
|
|
311
|
+
for (let [key, entry] of this.mem) {
|
|
312
|
+
if (entry.sourcesListIndex !== sourcesListIndex)
|
|
313
|
+
continue;
|
|
314
|
+
this.deleteIndexEntry(key);
|
|
315
|
+
dropped++;
|
|
316
|
+
}
|
|
317
|
+
console.log(`Removed sync source ${source.getDebugName()} (store ${this.folder}): its scans are stopped and ${dropped} index entries it held were dropped`);
|
|
318
|
+
return;
|
|
261
319
|
}
|
|
262
|
-
console.log(`Removed sync source ${source.getDebugName()} (store ${this.folder}): its scans are stopped
|
|
320
|
+
console.log(`Removed sync source ${source.getDebugName()} (store ${this.folder}): its scans are stopped (its URL is still served by another slot, so its index entries stay)`);
|
|
263
321
|
}
|
|
264
322
|
/** 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. */
|
|
265
323
|
async rescanBase() {
|
|
@@ -271,16 +329,10 @@ class BlobStore {
|
|
|
271
329
|
await this.init();
|
|
272
330
|
let scanStart = Date.now();
|
|
273
331
|
console.log(`Boundary scan of ${source.getDebugName()} starting: changes since ${new Date(config.since).toISOString()}, route ${JSON.stringify(config.route || IArchives_1.FULL_ROUTE)} (store ${this.folder})`);
|
|
274
|
-
let changes;
|
|
275
|
-
if (source.getChangesAfter) {
|
|
276
|
-
changes = await source.getChangesAfter(config.since);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
changes = (await source.findInfo("")).filter(x => x.createTime > config.since);
|
|
280
|
-
}
|
|
332
|
+
let changes = await source.getChangesAfter2({ time: config.since, routes: config.route && [config.route] || undefined });
|
|
281
333
|
let tally = newScanTally();
|
|
282
334
|
for (let file of changes) {
|
|
283
|
-
if (file.path === remoteConfig_1.ROUTING_FILE
|
|
335
|
+
if (file.path === remoteConfig_1.ROUTING_FILE) {
|
|
284
336
|
tally.filtered++;
|
|
285
337
|
continue;
|
|
286
338
|
}
|
|
@@ -293,7 +345,7 @@ class BlobStore {
|
|
|
293
345
|
}
|
|
294
346
|
if (file.size === 0) {
|
|
295
347
|
// A tombstone stores nothing on our own source - the index entry alone records it
|
|
296
|
-
this.setIndexEntry(file.path, { writeTime: file.createTime, size: 0,
|
|
348
|
+
this.setIndexEntry(file.path, { writeTime: file.createTime, size: 0, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
|
|
297
349
|
tally.tombstone++;
|
|
298
350
|
continue;
|
|
299
351
|
}
|
|
@@ -301,12 +353,12 @@ class BlobStore {
|
|
|
301
353
|
if (!result)
|
|
302
354
|
continue;
|
|
303
355
|
if (result.data.length === 0) {
|
|
304
|
-
this.setIndexEntry(file.path, { writeTime: result.writeTime, size: 0,
|
|
356
|
+
this.setIndexEntry(file.path, { writeTime: result.writeTime, size: 0, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
|
|
305
357
|
tally.tombstone++;
|
|
306
358
|
continue;
|
|
307
359
|
}
|
|
308
|
-
await this.sources[0].source.set(file.path, result.data, { lastModified: result.writeTime });
|
|
309
|
-
this.setIndexEntry(file.path, { writeTime: result.writeTime, size: result.data.length,
|
|
360
|
+
await this.sources[0].source.set(file.path, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
|
|
361
|
+
this.setIndexEntry(file.path, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
|
|
310
362
|
if (entry || overlayEntry) {
|
|
311
363
|
tally.updated++;
|
|
312
364
|
}
|
|
@@ -341,10 +393,10 @@ class BlobStore {
|
|
|
341
393
|
continue;
|
|
342
394
|
fileCount++;
|
|
343
395
|
byteCount += entry.size;
|
|
344
|
-
let
|
|
345
|
-
if (
|
|
346
|
-
|
|
347
|
-
|
|
396
|
+
let slot = this.slotForSourcesListIndex(entry.sourcesListIndex);
|
|
397
|
+
if (slot !== undefined) {
|
|
398
|
+
sources[slot].fileCount++;
|
|
399
|
+
sources[slot].byteCount += entry.size;
|
|
348
400
|
}
|
|
349
401
|
}
|
|
350
402
|
return { fileCount, byteCount, sources: sources.filter((x, i) => this.isLive(i)) };
|
|
@@ -358,7 +410,7 @@ class BlobStore {
|
|
|
358
410
|
let deletes = [];
|
|
359
411
|
for (let [key, entry] of dirty) {
|
|
360
412
|
if (entry) {
|
|
361
|
-
writes.push({ key, writeTime: entry.writeTime, size: entry.size,
|
|
413
|
+
writes.push({ key, writeTime: entry.writeTime, size: entry.size, sourcesListIndex: entry.sourcesListIndex });
|
|
362
414
|
}
|
|
363
415
|
else {
|
|
364
416
|
deletes.push(key);
|
|
@@ -371,6 +423,7 @@ class BlobStore {
|
|
|
371
423
|
}
|
|
372
424
|
// ── synchronization ──
|
|
373
425
|
async runSourceSync(sourceIndex) {
|
|
426
|
+
await this.registerSlot(sourceIndex);
|
|
374
427
|
let { source } = this.sources[sourceIndex];
|
|
375
428
|
let state = this.sourceStates[sourceIndex];
|
|
376
429
|
// Read live for every pass, not captured - updateSources can change it while loops run
|
|
@@ -379,7 +432,7 @@ class BlobStore {
|
|
|
379
432
|
while (!this.stopped.stop && !state.stopped.stop) {
|
|
380
433
|
try {
|
|
381
434
|
let config = await source.getConfig();
|
|
382
|
-
state.supportsChangesAfter = !!
|
|
435
|
+
state.supportsChangesAfter = !!config.supportsChangesAfter;
|
|
383
436
|
listing = await this.scanSource(sourceIndex);
|
|
384
437
|
break;
|
|
385
438
|
}
|
|
@@ -416,7 +469,7 @@ class BlobStore {
|
|
|
416
469
|
}, state.stopped);
|
|
417
470
|
}
|
|
418
471
|
else {
|
|
419
|
-
(0, batching_1.runInfinitePoll)(
|
|
472
|
+
(0, batching_1.runInfinitePoll)(FULL_RESCAN_UNINDEXED_INTERVAL, async () => {
|
|
420
473
|
let rescan = await this.scanSource(sourceIndex);
|
|
421
474
|
await this.reconcileSource(sourceIndex, rescan);
|
|
422
475
|
if (!noFullSync())
|
|
@@ -437,6 +490,7 @@ class BlobStore {
|
|
|
437
490
|
console.log(`Metadata scan of ${source.getDebugName()} still running (${Math.round((Date.now() - scanStart) / 1000)}s, store ${this.folder})`);
|
|
438
491
|
}, SYNC_PROGRESS_LOG_INTERVAL);
|
|
439
492
|
(_b = (_a = progressTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
493
|
+
// The listing request deliberately takes no time or route filters: our slowest sources (backblaze) support neither, so filtering would happen after the full fetch anyway - little benefit, more room for desynchronization. And if a full listing ever becomes too big to send over the network, it is also too big for the receiving process to hold in memory - the fix is more routing shards (each storing and sending less), not filtering.
|
|
440
494
|
let files;
|
|
441
495
|
try {
|
|
442
496
|
files = await source.findInfo("");
|
|
@@ -457,16 +511,17 @@ class BlobStore {
|
|
|
457
511
|
if (!this.mem.has(file.path)) {
|
|
458
512
|
newPaths++;
|
|
459
513
|
}
|
|
460
|
-
tally[this.
|
|
514
|
+
tally[this.updateScanIndex(sourceIndex, file)]++;
|
|
461
515
|
}
|
|
462
516
|
state.scannedCount = files.length;
|
|
463
517
|
// Index entries this source was the holder of, but that vanished from it (e.g. deleted while we were offline), come out of the index. Entries changed after the scan started are kept — the scan listing may simply predate them. Tombstones have no physical file for a listing to vouch for, so they're exempt (cleanupTombstones expires them instead).
|
|
464
518
|
let removedFromIndex = 0;
|
|
465
519
|
let missingOnSource = 0;
|
|
520
|
+
let scannedSourcesListIndex = this.sourcesListIndexOfSlot(sourceIndex);
|
|
466
521
|
for (let [key, entry] of this.mem) {
|
|
467
522
|
if (seen.has(key))
|
|
468
523
|
continue;
|
|
469
|
-
if (entry.
|
|
524
|
+
if (entry.sourcesListIndex === scannedSourcesListIndex && entry.size !== 0 && entry.changedAt < scanStart) {
|
|
470
525
|
this.deleteIndexEntry(key);
|
|
471
526
|
removedFromIndex++;
|
|
472
527
|
continue;
|
|
@@ -487,47 +542,73 @@ class BlobStore {
|
|
|
487
542
|
state.changesAfterTime = Math.max(state.changesAfterTime, scanStart - CHANGES_POLL_OVERLAP);
|
|
488
543
|
return seen;
|
|
489
544
|
}
|
|
490
|
-
// The push direction of synchronization: everything we know that the source is missing (or holds an older copy of) is written to it — including deletions, as tombstone writes. This is what heals a source whose background writes failed (e.g. it was down): the next scan sees what's missing and re-sends it.
|
|
545
|
+
// The push direction of synchronization: everything we know that the source is missing (or holds an older copy of) is written to it — including deletions, as tombstone writes. This is what heals a source whose background writes failed (e.g. it was down): the next scan sees what's missing and re-sends it. A failing file is skipped, not fatal (immutable targets are handled by forceSetImmutable, and one unreadable value must not stop the rest of the pass) - only a run of consecutive failures (the source itself is down) aborts until the next scan cycle.
|
|
491
546
|
async reconcileSource(sourceIndex, listing) {
|
|
492
547
|
var _a;
|
|
493
548
|
let { source, validWindow, route } = this.sources[sourceIndex];
|
|
494
549
|
let state = this.sourceStates[sourceIndex];
|
|
495
550
|
let acceptsWrites = (0, IArchives_1.windowAcceptsWrites)(validWindow);
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
551
|
+
let targetSourcesListIndex = this.sourcesListIndexOfSlot(sourceIndex);
|
|
552
|
+
let pushed = 0;
|
|
553
|
+
let failed = 0;
|
|
554
|
+
let consecutiveFailures = 0;
|
|
555
|
+
let errors = [];
|
|
556
|
+
let aborted = false;
|
|
557
|
+
for (let [key, entry] of this.mem) {
|
|
558
|
+
if (this.stopped.stop || state.stopped.stop)
|
|
559
|
+
return;
|
|
560
|
+
if (entry.sourcesListIndex === targetSourcesListIndex)
|
|
561
|
+
continue;
|
|
562
|
+
// The routing file is NEVER synchronized between storage nodes - it is only ever written directly to each node, and only ever read off our own disk
|
|
563
|
+
if (key === remoteConfig_1.ROUTING_FILE)
|
|
564
|
+
continue;
|
|
565
|
+
if (!acceptsWrites)
|
|
566
|
+
continue;
|
|
567
|
+
if (!(0, remoteConfig_1.routeContains)(route, (0, remoteConfig_1.getRoute)(key)))
|
|
568
|
+
continue;
|
|
569
|
+
let theirTime = listing.get(key);
|
|
570
|
+
if (theirTime !== undefined && theirTime >= entry.writeTime)
|
|
571
|
+
continue;
|
|
572
|
+
try {
|
|
512
573
|
if (entry.size === 0) {
|
|
513
574
|
// A deletion only needs pushing while the source still holds an older copy
|
|
514
575
|
if (theirTime === undefined)
|
|
515
576
|
continue;
|
|
516
|
-
await source.set(key, Buffer.alloc(0), { lastModified: entry.writeTime });
|
|
577
|
+
await source.set(key, Buffer.alloc(0), { lastModified: entry.writeTime, forceSetImmutable: true, noChecks: true });
|
|
578
|
+
pushed++;
|
|
579
|
+
consecutiveFailures = 0;
|
|
517
580
|
continue;
|
|
518
581
|
}
|
|
519
|
-
let
|
|
582
|
+
let holder = await this.getEntryHolder(entry);
|
|
583
|
+
if (!holder)
|
|
584
|
+
continue;
|
|
585
|
+
let result = await holder.get2(key);
|
|
520
586
|
if (!result)
|
|
521
587
|
continue;
|
|
522
|
-
await source.set(key, result.data, { lastModified: result.writeTime });
|
|
588
|
+
await source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
|
|
589
|
+
pushed++;
|
|
590
|
+
consecutiveFailures = 0;
|
|
591
|
+
}
|
|
592
|
+
catch (e) {
|
|
593
|
+
failed++;
|
|
594
|
+
consecutiveFailures++;
|
|
595
|
+
if (errors.length < RECONCILE_ERROR_LOG_LIMIT) {
|
|
596
|
+
errors.push(`${key}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
597
|
+
}
|
|
598
|
+
if (consecutiveFailures >= RECONCILE_MAX_CONSECUTIVE_FAILURES) {
|
|
599
|
+
aborted = true;
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
523
602
|
}
|
|
524
603
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
604
|
+
if (failed) {
|
|
605
|
+
console.error(`Reconciling sync source ${source.getDebugName()} (store ${this.folder}): pushed ${pushed} files, ${failed} failed${aborted && ` before aborting the pass (${consecutiveFailures} consecutive failures - the source looks down; the next scan cycle retries)` || ""}. First errors: ${errors.join(" | ")}`);
|
|
606
|
+
}
|
|
607
|
+
else if (pushed) {
|
|
608
|
+
console.log(`Reconciled sync source ${source.getDebugName()} (store ${this.folder}): pushed ${pushed} files it was missing or held older copies of`);
|
|
528
609
|
}
|
|
529
610
|
}
|
|
530
|
-
|
|
611
|
+
updateScanIndex(sourceIndex, file) {
|
|
531
612
|
// An in-flight scan can outlive its source's removal; its results are dead
|
|
532
613
|
if (!this.isLive(sourceIndex))
|
|
533
614
|
return "filtered";
|
|
@@ -549,7 +630,7 @@ class BlobStore {
|
|
|
549
630
|
// The highest write time wins across all sources (ties keep the existing entry)
|
|
550
631
|
if (existing && file.createTime <= existing.writeTime)
|
|
551
632
|
return "unchanged";
|
|
552
|
-
this.setIndexEntry(file.path, { writeTime: file.createTime, size: file.size,
|
|
633
|
+
this.setIndexEntry(file.path, { writeTime: file.createTime, size: file.size, sourcesListIndex: this.sourcesListIndexOfSlot(sourceIndex) });
|
|
553
634
|
if (file.size === 0)
|
|
554
635
|
return "tombstone";
|
|
555
636
|
if (existing)
|
|
@@ -557,15 +638,13 @@ class BlobStore {
|
|
|
557
638
|
return "new";
|
|
558
639
|
}
|
|
559
640
|
async pollChanges(sourceIndex) {
|
|
560
|
-
let { source } = this.sources[sourceIndex];
|
|
561
|
-
if (!source.getChangesAfter)
|
|
562
|
-
return;
|
|
641
|
+
let { source, route } = this.sources[sourceIndex];
|
|
563
642
|
let state = this.sourceStates[sourceIndex];
|
|
564
643
|
let pollStart = Date.now();
|
|
565
|
-
let changes = await source.
|
|
644
|
+
let changes = await source.getChangesAfter2({ time: state.changesAfterTime, routes: route && [route] || undefined });
|
|
566
645
|
let tally = newScanTally();
|
|
567
646
|
for (let file of changes) {
|
|
568
|
-
tally[this.
|
|
647
|
+
tally[this.updateScanIndex(sourceIndex, file)]++;
|
|
569
648
|
}
|
|
570
649
|
// Polls run constantly, so only the ones that actually changed the index get a line
|
|
571
650
|
if (tally.new || tally.updated || tally.tombstone) {
|
|
@@ -583,8 +662,9 @@ class BlobStore {
|
|
|
583
662
|
let state = this.sourceStates[sourceIndex];
|
|
584
663
|
let pending = [];
|
|
585
664
|
let totalBytes = 0;
|
|
665
|
+
let copiedSourcesListIndex = this.sourcesListIndexOfSlot(sourceIndex);
|
|
586
666
|
for (let [key, entry] of this.mem) {
|
|
587
|
-
if (entry.
|
|
667
|
+
if (entry.sourcesListIndex !== copiedSourcesListIndex)
|
|
588
668
|
continue;
|
|
589
669
|
if (entry.size === 0)
|
|
590
670
|
continue;
|
|
@@ -635,10 +715,10 @@ class BlobStore {
|
|
|
635
715
|
let { key, entry } = pending[index];
|
|
636
716
|
let result = await source.get2(key);
|
|
637
717
|
if (result) {
|
|
638
|
-
await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime });
|
|
718
|
+
await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
|
|
639
719
|
// Only move the entry's source if it wasn't changed while we copied
|
|
640
720
|
if (this.mem.get(key) === entry) {
|
|
641
|
-
this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length,
|
|
721
|
+
this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
|
|
642
722
|
}
|
|
643
723
|
}
|
|
644
724
|
activity.doneFiles = (activity.doneFiles || 0) + 1;
|
|
@@ -665,7 +745,7 @@ class BlobStore {
|
|
|
665
745
|
}
|
|
666
746
|
}
|
|
667
747
|
}
|
|
668
|
-
// findInfo and
|
|
748
|
+
// findInfo and getChangesAfter2 list from the index, so they must wait for our own base source's initial scan (which might lag minutes) before the listing is trustworthy. The base (local disk) is implicitly required - remote sources are not, they come and go.
|
|
669
749
|
async waitForRequiredScans() {
|
|
670
750
|
await this.sourceStates[0].initialScan.promise;
|
|
671
751
|
}
|
|
@@ -679,7 +759,7 @@ class BlobStore {
|
|
|
679
759
|
if (i === 0 && !state.scanComplete) {
|
|
680
760
|
let info = await source.getInfo(key);
|
|
681
761
|
if (info) {
|
|
682
|
-
this.
|
|
762
|
+
this.updateScanIndex(i, { path: key, createTime: info.writeTime, size: info.size });
|
|
683
763
|
}
|
|
684
764
|
continue;
|
|
685
765
|
}
|
|
@@ -690,13 +770,10 @@ class BlobStore {
|
|
|
690
770
|
}
|
|
691
771
|
}
|
|
692
772
|
async getIndexEntry(key) {
|
|
773
|
+
// An entry whose holder is no longer in the source list is still valid - getEntryHolder resolves the persisted URL directly (and get2's fallback loop covers a holder that is gone entirely)
|
|
693
774
|
let entry = this.mem.get(key);
|
|
694
|
-
if (entry
|
|
775
|
+
if (entry)
|
|
695
776
|
return entry;
|
|
696
|
-
if (entry) {
|
|
697
|
-
// The source list changed and this entry's source no longer exists; treat as missing
|
|
698
|
-
this.deleteIndexEntry(key);
|
|
699
|
-
}
|
|
700
777
|
await this.checkMissingKey(key);
|
|
701
778
|
return this.mem.get(key);
|
|
702
779
|
}
|
|
@@ -726,18 +803,20 @@ class BlobStore {
|
|
|
726
803
|
if (entry.size === 0)
|
|
727
804
|
return undefined;
|
|
728
805
|
entry.lastAccess = Date.now();
|
|
729
|
-
let
|
|
806
|
+
let holderArchives = await this.getEntryHolder(entry);
|
|
730
807
|
let result;
|
|
731
808
|
let holderError;
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
809
|
+
if (holderArchives) {
|
|
810
|
+
try {
|
|
811
|
+
result = await holderArchives.get2(key, { range });
|
|
812
|
+
}
|
|
813
|
+
catch (e) {
|
|
814
|
+
holderError = e;
|
|
815
|
+
}
|
|
737
816
|
}
|
|
738
817
|
if (result) {
|
|
739
818
|
// Ranged reads can't populate a cache (they're partial)
|
|
740
|
-
if (
|
|
819
|
+
if (this.slotForSourcesListIndex(entry.sourcesListIndex) !== 0 && !range) {
|
|
741
820
|
await this.cacheRead(key, result);
|
|
742
821
|
}
|
|
743
822
|
return result;
|
|
@@ -749,8 +828,9 @@ class BlobStore {
|
|
|
749
828
|
return undefined;
|
|
750
829
|
}
|
|
751
830
|
// The holder is down or lost the file. ANY other source's copy beats no value - even an OLDER one - and it's copied onto our disk so the next read doesn't depend on luck.
|
|
831
|
+
let holderSlot = this.slotForSourcesListIndex(entry.sourcesListIndex);
|
|
752
832
|
for (let i = 0; i < this.sources.length; i++) {
|
|
753
|
-
if (i ===
|
|
833
|
+
if (i === holderSlot || !this.isLive(i))
|
|
754
834
|
continue;
|
|
755
835
|
let fallback;
|
|
756
836
|
try {
|
|
@@ -776,8 +856,8 @@ class BlobStore {
|
|
|
776
856
|
}
|
|
777
857
|
// The read's bytes came from a remote source, so write them onto our own base source (the local disk), which becomes the entry's new holder - reads only pay the remote fetch once
|
|
778
858
|
async cacheRead(key, result) {
|
|
779
|
-
await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime });
|
|
780
|
-
this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length,
|
|
859
|
+
await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
|
|
860
|
+
this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
|
|
781
861
|
}
|
|
782
862
|
async set(key, data, config) {
|
|
783
863
|
var _a, _b;
|
|
@@ -846,9 +926,9 @@ class BlobStore {
|
|
|
846
926
|
await this.sources[first].source.del(key);
|
|
847
927
|
}
|
|
848
928
|
else {
|
|
849
|
-
await this.sources[first].source.set(key, data, { lastModified: writeTime });
|
|
929
|
+
await this.sources[first].source.set(key, data, { lastModified: writeTime, noChecks: true });
|
|
850
930
|
}
|
|
851
|
-
this.setIndexEntry(key, { writeTime, size: data.length,
|
|
931
|
+
this.setIndexEntry(key, { writeTime, size: data.length, sourcesListIndex: this.sourcesListIndexOfSlot(first) });
|
|
852
932
|
if (isRouting)
|
|
853
933
|
return;
|
|
854
934
|
let route = (0, remoteConfig_1.getRoute)(key);
|
|
@@ -856,7 +936,7 @@ class BlobStore {
|
|
|
856
936
|
if (!(0, remoteConfig_1.routeContains)(this.sources[i].route, route))
|
|
857
937
|
continue;
|
|
858
938
|
// Downstream sources receive tombstones as actual empty writes, so their listings show the deletion (size 0) and other stores scan it in as a tombstone
|
|
859
|
-
void this.sources[i].source.set(key, data, { lastModified: writeTime }).catch((e) => {
|
|
939
|
+
void this.sources[i].source.set(key, data, { lastModified: writeTime, forceSetImmutable: true, noChecks: true }).catch((e) => {
|
|
860
940
|
var _a;
|
|
861
941
|
console.error(`Background write of ${key} to sync source ${this.sources[i].source.getDebugName()} failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
862
942
|
});
|
|
@@ -898,20 +978,25 @@ class BlobStore {
|
|
|
898
978
|
(0, misc_1.sort)(files, x => x.path);
|
|
899
979
|
return files;
|
|
900
980
|
}
|
|
901
|
-
// All files changed after
|
|
902
|
-
async
|
|
981
|
+
// All files changed after config.time — fast, straight from the in-memory index. Filters on when WE learned of the change (changedAt), so files synchronized late (with old write times) are still reported. Deletions ARE reported, as size-0 tombstone entries — that's how they propagate to stores syncing from us. config.routes lets a store syncing a partial shard ask for just its slice.
|
|
982
|
+
async getChangesAfter2(config) {
|
|
903
983
|
await this.init();
|
|
904
984
|
await this.waitForRequiredScans();
|
|
985
|
+
let inRoutes = (key) => !config.routes || config.routes.some(route => (0, remoteConfig_1.routeContains)(route, (0, remoteConfig_1.getRoute)(key)));
|
|
905
986
|
let files = [];
|
|
906
987
|
for (let [key, entry] of this.mem) {
|
|
907
|
-
if (entry.changedAt <= time)
|
|
988
|
+
if (entry.changedAt <= config.time)
|
|
908
989
|
continue;
|
|
909
990
|
if (this.overlay.has(key))
|
|
910
991
|
continue;
|
|
992
|
+
if (!inRoutes(key))
|
|
993
|
+
continue;
|
|
911
994
|
files.push({ path: key, createTime: entry.writeTime, size: entry.size });
|
|
912
995
|
}
|
|
913
996
|
for (let [key, overlayEntry] of this.overlay) {
|
|
914
|
-
if (overlayEntry.t <= time)
|
|
997
|
+
if (overlayEntry.t <= config.time)
|
|
998
|
+
continue;
|
|
999
|
+
if (!inRoutes(key))
|
|
915
1000
|
continue;
|
|
916
1001
|
files.push({ path: key, createTime: overlayEntry.t, size: overlayEntry.data.length });
|
|
917
1002
|
}
|
|
@@ -957,7 +1042,7 @@ class BlobStore {
|
|
|
957
1042
|
this.overlay.delete(key);
|
|
958
1043
|
let info = await disk.getInfo(key);
|
|
959
1044
|
if (info) {
|
|
960
|
-
this.setIndexEntry(key, { writeTime: info.writeTime, size: info.size,
|
|
1045
|
+
this.setIndexEntry(key, { writeTime: info.writeTime, size: info.size, sourcesListIndex: this.sourcesListIndexOfSlot(sourceIndex) });
|
|
961
1046
|
}
|
|
962
1047
|
}
|
|
963
1048
|
async cancelLargeUpload(id) {
|
|
@@ -986,9 +1071,10 @@ class BlobStore {
|
|
|
986
1071
|
let evictedFiles = 0;
|
|
987
1072
|
let evictedBytes = 0;
|
|
988
1073
|
try {
|
|
1074
|
+
let baseSourcesListIndex = this.sourcesListIndexOfSlot(0);
|
|
989
1075
|
let candidates = [];
|
|
990
1076
|
for (let [key, entry] of this.mem) {
|
|
991
|
-
if (entry.
|
|
1077
|
+
if (entry.sourcesListIndex !== baseSourcesListIndex || entry.size === 0 || key === remoteConfig_1.ROUTING_FILE)
|
|
992
1078
|
continue;
|
|
993
1079
|
candidates.push({ key, entry });
|
|
994
1080
|
}
|
|
@@ -1018,7 +1104,7 @@ class BlobStore {
|
|
|
1018
1104
|
if (holder === undefined)
|
|
1019
1105
|
continue;
|
|
1020
1106
|
await this.sources[0].source.del(key);
|
|
1021
|
-
this.setIndexEntry(key, { writeTime: entry.writeTime, size: entry.size,
|
|
1107
|
+
this.setIndexEntry(key, { writeTime: entry.writeTime, size: entry.size, sourcesListIndex: this.sourcesListIndexOfSlot(holder) });
|
|
1022
1108
|
evictedFiles++;
|
|
1023
1109
|
evictedBytes += entry.size;
|
|
1024
1110
|
}
|
|
@@ -1059,5 +1145,5 @@ class BlobStore {
|
|
|
1059
1145
|
}
|
|
1060
1146
|
}
|
|
1061
1147
|
exports.BlobStore = BlobStore;
|
|
1062
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsMkRBQXNFO0FBQ3RFLG1EQUEwRTtBQUMxRSxrRUFBaUY7QUFDakYsNENBR3NCO0FBQ3RCLGtEQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsaURBQXVFO0FBQ3ZFLHdFQUF1RjtBQUN2RixvREFBOEY7QUFFOUYsdWhCQUF1aEI7QUFFMWdCLFFBQUEsd0JBQXdCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDekQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxtTkFBbU47QUFDdE0sUUFBQSx1QkFBdUIsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN4RCxtRkFBbUY7QUFDbkYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLDZEQUE2RDtBQUM3RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbUZBQW1GO0FBQ25GLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsMEdBQTBHO0FBQzFHLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyQyxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxvTEFBb0w7QUFDcEwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsbUZBQW1GO0FBQ25GLE1BQU0sMEJBQTBC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IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCwgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0LCBwcm9taXNlT2JqIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlc1N5bmNTdGF0dXMsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd0FjY2VwdHNXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrLCBhcHBseUZpbmRJbmZvU2hhcGUgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IEJ1bGtEYXRhYmFzZUJhc2UsIG5vb3BSZWFjdGl2ZURlcHMgfSBmcm9tIFwiLi4vQnVsa0RhdGFiYXNlMi9CdWxrRGF0YWJhc2VCYXNlXCI7XG5pbXBvcnQgeyB3cmFwSGFuZGxlLCBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyLCBEaXJlY3RvcnlXcmFwcGVyIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBzeW5jaHJvbml6ZXMgdGhlIGluZGV4IGZyb20gYWxsIHNvdXJjZXMgKHNlZSBBcmNoaXZlc1NvdXJjZSBpbiBJQXJjaGl2ZXMudHMpLiBFdmVyeSBzdGFydHVwIGZ1bGx5IHJlc2NhbnMgZWFjaCBzb3VyY2UncyBtZXRhZGF0YSwgc28gdGhlIGluZGV4IHNlbGYtaGVhbHM7IHRoZSBmaWxlIHdpdGggdGhlIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcywgc28gbXVsdGlwbGUgc291cmNlcyBuZWVkIG5vIHN0YWNraW5nIG9yZGVyLlxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZID0gdGltZUluTWludXRlICogNTtcbmNvbnN0IEZBU1RfRkxVU0hfUE9MTCA9IDEwMDAgKiAxNTtcbi8vIEZhc3Qgd3JpdGVzIGFyZSBuZXZlciBkZWxheWVkIHBhc3Qgb3VyIG93biB2YWxpZCB3aW5kb3csIGFuZCB3aXRoaW4gdGhpcyBtYXJnaW4gb2YgdGhlIHdpbmRvdydzIGVuZCB0aGV5IHdyaXRlIHRocm91Z2ggaW1tZWRpYXRlbHkgLSBzbyB3aGVuIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSB0YWtlcyBvdmVyLCB0aGUgd3JpdGVzIGFyZSBhbHJlYWR5IG9uIGRpc2tcbmV4cG9ydCBjb25zdCBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTiA9IHRpbWVJbk1pbnV0ZSAqIDU7XG4vLyBJbmRleCBjaGFuZ2VzIGFyZSBidWZmZXJlZCBpbiBtZW1vcnkgYW5kIHdyaXR0ZW4gdG8gdGhlIEJ1bGtEYXRhYmFzZTIgaW4gYmF0Y2hlc1xuY29uc3QgSU5ERVhfRkxVU0hfSU5URVJWQUwgPSAxMDAwICogMzA7XG4vLyBTb3VyY2VzIHRoYXQgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgYXJlIHBvbGxlZCB0aGlzIG9mdGVuXG5jb25zdCBDSEFOR0VTX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBTb3VyY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgZ2V0IGEgZnVsbCBtZXRhZGF0YSByZXNjYW4gdGhpcyBvZnRlblxuY29uc3QgRlVMTF9SRVNDQU5fSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIE9uIGEgcmVxdWVzdCBmb3IgYSBmaWxlIHRoZSBpbmRleCBkb2Vzbid0IGtub3csIGNoYW5nZXMtYWZ0ZXIgc291cmNlcyBhcmUgcmUtcG9sbGVkLCBhdCBtb3N0IHRoaXMgb2Z0ZW5cbmNvbnN0IE1JU1NfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNTtcbi8vIENoYW5nZSBwb2xscyByZS1yZXF1ZXN0IHRoaXMgbXVjaCBvdmVybGFwLCBzbyBjbG9jayBza2V3IGJldHdlZW4gdXMgYW5kIGEgc291cmNlIGNhbid0IGRyb3AgY2hhbmdlc1xuY29uc3QgQ0hBTkdFU19QT0xMX09WRVJMQVAgPSB0aW1lSW5NaW51dGU7XG5jb25zdCBTQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgd2hhdCBsZXRzIGEgZGVsZXRpb24gcHJvcGFnYXRlL3JlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgYW5kIGl0IGV4cGlyZXMgYWZ0ZXIgdGhpcyBsb25nXG5jb25zdCBUT01CU1RPTkVfRVhQSVJZID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5jb25zdCBUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gV2hpbGUgYSBtZXRhZGF0YSBzY2FuIG9yIGZ1bGwgc3luYyBpcyBydW5uaW5nLCBpdHMgcHJvZ3Jlc3MgaXMgbG9nZ2VkIHRoaXMgb2Z0ZW5cbmNvbnN0IFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuY29uc3QgRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgc3luY3MgZG93bmxvYWQgdGhpcyBtYW55IGZpbGVzIGNvbmN1cnJlbnRseSAoaGlnaC1sYXRlbmN5IHNvdXJjZXMgbGlrZSBiYWNrYmxhemUgd291bGQgb3RoZXJ3aXNlIGNyYXdsIG9uZSByb3VuZC10cmlwIGF0IGEgdGltZSlcbmNvbnN0IEZVTExfU1lOQ19QQVJBTExFTCA9IDg7XG4vLyBBIGZ1bGwgc3luYyBydW5uaW5nIGxvbmdlciB0aGFuIHRoaXMgaXMgY29uc29sZS5lcnJvcmVkIChhbmQgYWdhaW4gZXZlcnkgaW50ZXJ2YWwgYWZ0ZXIpLCBzbyBhIHN5bmMgdGhhdCB3aWxsIHRha2UgZGF5cyBpcyBsb3VkIGluc3RlYWQgb2YgYSBxdWlldCBjb25zb2xlLmxvZyBldmVyeSBtaW51dGVcbmNvbnN0IEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG5cbmV4cG9ydCB0eXBlIFdyaXRlQ29uZmlnID0ge1xuICAgIC8vIFJlc29sdmUgb25jZSB0aGUgd3JpdGUgaXMgaW4gbWVtb3J5OyBmbHVzaCB0byB0aGUgc291cmNlcyBhZnRlciB3cml0ZURlbGF5LCBjb2FsZXNjaW5nIHdyaXRlcyB0byB0aGUgc2FtZSBrZXkgKG9ubHkgdGhlIGxhdGVzdCBpcyB3cml0dGVuKS4gRGF0YSBpcyBsb3N0IGlmIHRoZSBwcm9jZXNzIGNyYXNoZXMgZmlyc3QuXG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICAvLyBTdGFtcHMgdGhlIHdyaXRlIHdpdGggdGhpcyBsYXN0LXdyaXRlIHRpbWUgaW5zdGVhZCBvZiBub3cuIE9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgZmlsZSdzIHRpbWUgbm8tb3BzOyBtb3JlIHRoYW4gMTUgbWludXRlcyBpbiB0aGUgZnV0dXJlIHRocm93cy4gU2VlIElBcmNoaXZlcy5zZXQuXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyO1xufTtcblxuLy8gV2hhdCB0aGUgc3RvcmFnZSBzZXJ2ZXIgbmVlZHMgZnJvbSBhIGJ1Y2tldCdzIHN0b3JlLiBCbG9iU3RvcmUgaW1wbGVtZW50cyBpdCBmdWxseTsgQXJjaGl2ZXNEaXNrIGFsc28gc2F0aXNmaWVzIGl0ICh1c2VkIGRpcmVjdGx5IGZvciByYXdEaXNrIGJ1Y2tldHMpLCBtaW51cyB0aGUgb3B0aW9uYWwgaW5kZXgtYmFja2VkIG1ldGhvZHMuXG5leHBvcnQgdHlwZSBJQnVja2V0U3RvcmUgPSB7XG4gICAgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD47XG4gICAgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogV3JpdGVDb25maWcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPjtcbiAgICBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZT86IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICBnZXRDaGFuZ2VzQWZ0ZXI/KHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+O1xuICAgIGdldFN5bmNTdGF0dXM/KCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPjtcbiAgICBnZXRTeW5jUHJvZ3Jlc3M/KCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfTtcbiAgICBjb21wdXRlSW5kZXhUb3RhbHM/KCk6IFByb21pc2U8eyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfT47XG4gICAgc3RhcnRMYXJnZVVwbG9hZCgpOiBQcm9taXNlPHN0cmluZz47XG4gICAgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgICBmaW5pc2hMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgY2FuY2VsTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59O1xuXG50eXBlIE92ZXJsYXlFbnRyeSA9IHtcbiAgICAvLyBBIHplcm8tbGVuZ3RoIGJ1ZmZlciBpcyBhIHBlbmRpbmcgZGVsZXRlICh0b21ic3RvbmUpXG4gICAgZGF0YTogQnVmZmVyO1xuICAgIHQ6IG51bWJlcjtcbiAgICBmbHVzaEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgcm93IG9mIHRoZSBCdWxrRGF0YWJhc2UyIGluZGV4IChrZXkgaXMgdGhlIGZpbGUgcGF0aClcbnR5cGUgQmxvYkluZGV4RW50cnkgPSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgd3JpdGVUaW1lOiBudW1iZXI7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhIChhbiBpbmRleCBpbnRvIHRoZSBzb3VyY2VzIGFycmF5KVxuICAgIHNvdXJjZTogbnVtYmVyO1xufTtcbnR5cGUgSW5kZXhFbnRyeSA9IHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgc291cmNlOiBudW1iZXI7XG4gICAgLy8gV2hlbiBXRSBsYXN0IGNoYW5nZWQgdGhpcyBlbnRyeSAobm90IHRoZSBmaWxlJ3Mgd3JpdGUgdGltZSkg4oCUIHdoYXQgZ2V0Q2hhbmdlc0FmdGVyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkIGFzIGNoYW5nZXNcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbiAgICAvLyBJbi1tZW1vcnkgb25seSAobm90IHBlcnNpc3RlZCk6IHdoZW4gdGhlIGZpbGUgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVIGV2aWN0aW9uLiBTdGFydHMgYXMgY2hhbmdlZEF0IG9uIGxvYWQuXG4gICAgbGFzdEFjY2VzczogbnVtYmVyO1xufTtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlciBwb2xsc1xuICAgIGNoYW5nZXNBZnRlclRpbWU6IG51bWJlcjtcbiAgICBsYXN0TWlzc0NoZWNrOiBudW1iZXI7XG4gICAgLy8gUGVyLXNsb3Qgc3RvcCB0b2tlbjogYSByZW1vdmVkIHNvdXJjZSdzIGxvb3BzIHN0b3Agd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc3RvcmVcbiAgICBzdG9wcGVkOiB7IHN0b3A6IGJvb2xlYW4gfTtcbiAgICAvLyBTb3VyY2Ugc2xvdHMgYXJlIHN0YWJsZSBmb3JldmVyIChpbmRleCBlbnRyaWVzIHJlZmVyZW5jZSBzb3VyY2VzIGJ5IHNsb3QgbnVtYmVyKSwgc28gYSByZW1vdmVkIHNvdXJjZSdzIHNsb3Qgc3RheXMgaW4gdGhlIGFycmF5cywgbWFya2VkIGRlYWQgLSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkXG4gICAgZGVhZD86IGJvb2xlYW47XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xufTtcblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5mdW5jdGlvbiBmb3JtYXRTY2FuVGFsbHkodGFsbHk6IFNjYW5UYWxseSwgdG90YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IHBjdCA9IChuOiBudW1iZXIpID0+IGAke01hdGgucm91bmQobiAvIE1hdGgubWF4KHRvdGFsLCAxKSAqIDEwMDApIC8gMTB9JWA7XG4gICAgcmV0dXJuIGAke3RhbGx5Lm5ld30gbmV3IHBhdGhzICgke3BjdCh0YWxseS5uZXcpfSksICR7dGFsbHkudXBkYXRlZH0gbmV3ZXIgd3JpdGVzICgke3BjdCh0YWxseS51cGRhdGVkKX0pLCAke3RhbGx5LnRvbWJzdG9uZX0gZGVsZXRpb25zICgke3BjdCh0YWxseS50b21ic3RvbmUpfSksICR7dGFsbHkudW5jaGFuZ2VkfSB1bmNoYW5nZWQgKCR7cGN0KHRhbGx5LnVuY2hhbmdlZCl9KSwgJHt0YWxseS5maWx0ZXJlZH0gb3V0c2lkZSB3aW5kb3cvcm91dGUgKCR7cGN0KHRhbGx5LmZpbHRlcmVkKX0pYDtcbn1cblxuZnVuY3Rpb24gbmV3U291cmNlU3RhdGUoKTogU291cmNlU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBmYWxzZSxcbiAgICAgICAgaW5pdGlhbFNjYW46IHByb21pc2VPYmooKSxcbiAgICAgICAgc2NhbkNvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBsYXN0TWlzc0NoZWNrOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEJsb2JTdG9yZSBpbXBsZW1lbnRzIElCdWNrZXRTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc/OiB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb24pIOKAlCBob3cgdGhlIHN0b3JhZ2Ugc2VydmVyIG5vdGljZXMgcm91dGluZyBjb25maWcgdXBkYXRlcy5cbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkPzogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gTFJVLWJvdW5kIHRoZSBkaXNrIChiYXNlIHNvdXJjZSkgdG8gdGhpcyBtYW55IGJ5dGVzOyBzZWUgQ29tbW9uQ29uZmlnLnJlYWRlckRpc2tMaW1pdFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgICAgICAgICAgLy8gRXZlcnkgYWNjZXB0ZWQgd3JpdGUgKFwib3JpZ2luYWxcIikgYW5kIGV2ZXJ5IHdyaXRlIHRoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcyAoXCJmbHVzaGVkXCIpLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSwgc28gdGhlIHR3byBjb3VudHMgZGlmZmVyLlxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ/OiAoa2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgIH1cbiAgICApIHsgfVxuXG4gICAgcHJpdmF0ZSBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuXG4gICAgLy8gVGhlIGluZGV4J3MgQnVsa0RhdGFiYXNlMiBmaWxlcyBsaXZlIHVuZGVyIDxmb2xkZXI+L2luZGV4XG4gICAgcHJpdmF0ZSBpbmRleCA9IG5ldyBCdWxrRGF0YWJhc2VCYXNlPEJsb2JJbmRleEVudHJ5PihcImJsb2JJbmRleFwiLCBub29wUmVhY3RpdmVEZXBzLCBhc3luYyAocDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBiYXNlOiBEaXJlY3RvcnlXcmFwcGVyID0gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcImluZGV4XCIpKTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICAgICAgaWYgKHBhcnQpIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcEhhbmRsZShiYXNlKTtcbiAgICB9KTtcbiAgICAvLyBUaGUgaW4tbWVtb3J5IGNvcHkgb2YgdGhlIGluZGV4LiBBbGwgcmVhZHMgYXJlIHNlcnZlZCBmcm9tIGl0OyBjaGFuZ2VzIGFyZSBidWZmZXJlZCBpbiBkaXJ0eSBhbmQgZmx1c2hlZCB0byB0aGUgQnVsa0RhdGFiYXNlMiBpbiBiYXRjaGVzICh1bmRlZmluZWQgPSBkZWxldGUpLlxuICAgIHByaXZhdGUgbWVtID0gbmV3IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+KCk7XG4gICAgLy8gTGl2ZSB0b3RhbHMgb3ZlciBtZW0gKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBhZGp1c3RlZCBvbiBldmVyeSBtdXRhdGlvbiBhbmQgcmVjb21wdXRlZCBvbiBsb2FkIC0gc28gYW55IGRyaWZ0IGhlYWxzIG9uIHJlc3RhcnQuIGNvbXB1dGVJbmRleFRvdGFscyBnaXZlcyB0aGUgd2Fsay10aGUtaW5kZXggdHJ1dGguXG4gICAgcHJpdmF0ZSBpbmRleEZpbGVDb3VudCA9IDA7XG4gICAgcHJpdmF0ZSBpbmRleEJ5dGVDb3VudCA9IDA7XG4gICAgLy8gVGhlIHNhbWUgdG90YWxzIHBlciBob2xkaW5nIHNvdXJjZSAoaW5kZXggMCA9IG91ciBkaXNrLCB3aGljaCByZWFkZXJEaXNrTGltaXQgYm91bmRzKVxuICAgIHByaXZhdGUgc291cmNlRmlsZUNvdW50cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gMCk7XG4gICAgcHJpdmF0ZSBzb3VyY2VCeXRlQ291bnRzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAwKTtcbiAgICAvLyBCYWNrZ3JvdW5kIHNjYW5zIC8gZnVsbCBzeW5jcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIHN5bmNBY3Rpdml0aWVzID0gbmV3IFNldDxTeW5jQWN0aXZpdHk+KCk7XG4gICAgcHJpdmF0ZSBkaXJ0eSA9IG5ldyBNYXA8c3RyaW5nLCBJbmRleEVudHJ5IHwgdW5kZWZpbmVkPigpO1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVybGF5RW50cnk+KCk7XG4gICAgcHJpdmF0ZSBzb3VyY2VTdGF0ZXMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+IG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgIHByaXZhdGUgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XSAmJiAhdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdLmRlYWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5Tb3VyY2VTeW5jKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChGQVNUX0ZMVVNIX1BPTEwsICgpID0+IHRoaXMuZmx1c2hPdmVybGF5KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChJTkRFWF9GTFVTSF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5mbHVzaEluZGV4KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdCkge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIHNjYW5zL3BvbGxzIGFuZCBmbHVzaGVzIHBlbmRpbmcgd3JpdGVzLiBPbmx5IHVzZWQgd2hlbiB0aGUgc3RvcmUgZ2VudWluZWx5IGNhbm5vdCBjb250aW51ZSAocmF3RGlzayBmbGlwLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBzdGF0ZSBvZiB0aGlzLnNvdXJjZVN0YXRlcykge1xuICAgICAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoT3ZlcmxheSh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaEluZGV4KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBbd3JpdGVUaW1lcywgc2l6ZXMsIHNvdXJjZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5pbmRleC5nZXRDb2x1bW4oXCJ3cml0ZVRpbWVcIiksXG4gICAgICAgICAgICB0aGlzLmluZGV4LmdldENvbHVtbihcInNpemVcIiksXG4gICAgICAgICAgICB0aGlzLmluZGV4LmdldENvbHVtbihcInNvdXJjZVwiKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCBzaXplTWFwID0gbmV3IE1hcChzaXplcy5tYXAoeCA9PiBbeC5rZXksIHgudmFsdWVdKSk7XG4gICAgICAgIGxldCBzb3VyY2VNYXAgPSBuZXcgTWFwKHNvdXJjZXMubWFwKHggPT4gW3gua2V5LCB4LnZhbHVlXSkpO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB3cml0ZVRpbWVzKSB7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHNpemVNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlTWFwLmdldChlbnRyeS5rZXkpO1xuICAgICAgICAgICAgLy8gRXhwbGljaXQgY2hlY2tzLCBhcyAwIGlzIGEgdmFsaWQgc2l6ZSBhbmQgYSB2YWxpZCBzb3VyY2UgbnVtYmVyXG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgYXBwbHlTY2FubmVkKSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlXG4gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZ1bGw6IEluZGV4RW50cnkgPSB7IHdyaXRlVGltZTogZW50cnkudmFsdWUsIHNpemUsIHNvdXJjZSwgY2hhbmdlZEF0OiBlbnRyeS50aW1lLCBsYXN0QWNjZXNzOiBlbnRyeS50aW1lIH07XG4gICAgICAgICAgICB0aGlzLm1lbS5zZXQoZW50cnkua2V5LCBmdWxsKTtcbiAgICAgICAgICAgIHRoaXMuY291bnRFbnRyeShmdWxsLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY291bnRFbnRyeShlbnRyeTogSW5kZXhFbnRyeSB8IHVuZGVmaW5lZCwgZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5zaXplID09PSAwKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW5kZXhGaWxlQ291bnQgKz0gZGlyZWN0aW9uO1xuICAgICAgICB0aGlzLmluZGV4Qnl0ZUNvdW50ICs9IGVudHJ5LnNpemUgKiBkaXJlY3Rpb247XG4gICAgICAgIC8vIEEgc3RhbGUgZW50cnkgY2FuIHJlZmVyZW5jZSBhIHNvdXJjZSB0aGF0IG5vIGxvbmdlciBleGlzdHMgKGdldEluZGV4RW50cnkgY2xlYW5zIHRob3NlKVxuICAgICAgICBpZiAodGhpcy5zb3VyY2VzW2VudHJ5LnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlRmlsZUNvdW50c1tlbnRyeS5zb3VyY2VdICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQnl0ZUNvdW50c1tlbnRyeS5zb3VyY2VdICs9IGVudHJ5LnNpemUgKiBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgbGV0IGZ1bGw6IEluZGV4RW50cnkgPSB7IC4uLmVudHJ5LCBjaGFuZ2VkQXQ6IERhdGUubm93KCksIGxhc3RBY2Nlc3M6IERhdGUubm93KCkgfTtcbiAgICAgICAgdGhpcy5jb3VudEVudHJ5KHRoaXMubWVtLmdldChrZXkpLCAtMSk7XG4gICAgICAgIHRoaXMuY291bnRFbnRyeShmdWxsLCAxKTtcbiAgICAgICAgdGhpcy5tZW0uc2V0KGtleSwgZnVsbCk7XG4gICAgICAgIHRoaXMuZGlydHkuc2V0KGtleSwgZnVsbCk7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgZGVsZXRlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLm1lbS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFleGlzdGluZykgcmV0dXJuO1xuICAgICAgICB0aGlzLmNvdW50RW50cnkoZXhpc3RpbmcsIC0xKTtcbiAgICAgICAgdGhpcy5tZW0uZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMuZGlydHkuc2V0KGtleSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKiogQXBwbGllcyBhIGNvbmZpZyBjaGFuZ2UgdG8gdGhlIFJVTk5JTkcgc3RvcmU6IHdpbmRvd3Mvcm91dGVzIHVwZGF0ZSBpbiBwbGFjZSwgbmV3IHNvdXJjZXMgYXJlIGFkZGVkICh0aGVpciBzeW5jIHN0YXJ0cyBpbW1lZGlhdGVseSksIGFuZCByZW1vdmVkIHNvdXJjZXMnIHNsb3RzIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXMgZHJvcCkuIFRoZSBzdG9yZSBzdXJ2aXZlcyBldmVyeSByb3V0aW5lIGNvbmZpZyBldm9sdXRpb24gLSBpdCBpcyBuZXZlciBkZXN0cm95ZWQgZm9yIGEgc291cmNlLWxpc3QgY2hhbmdlLCBvbmx5IGZvciBzdHJ1Y3R1cmFsIGZsaXBzIGl0IGNhbm5vdCBleHByZXNzIChyYXdEaXNrKS4gUGVuZGluZyBmYXN0IHdyaXRlcyBhcmUgcmUtY2FwcGVkIHRvIHRoZSBuZXcgZmx1c2ggZGVhZGxpbmUgKGZsdXNoaW5nIGltbWVkaWF0ZWx5IHdoZW4gaXQgaGFzIGFscmVhZHkgcGFzc2VkKS4gKi9cbiAgICBwdWJsaWMgdXBkYXRlU291cmNlcyhzcGVjczogQmxvYlNvdXJjZVNwZWNbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXNwZWNzLmxlbmd0aCB8fCBzcGVjc1swXS5pZGVudGl0eSAhPT0gXCJkaXNrXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlU291cmNlcyBleHBlY3RzIHRoZSBkaXNrIHNvdXJjZSBmaXJzdCAoaWRlbnRpdHkgXCJkaXNrXCIpLCBnb3QgJHtKU09OLnN0cmluZ2lmeShzcGVjcy5tYXAoeCA9PiB4LmlkZW50aXR5KSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2V0V2luZG93ID0gKGk6IG51bWJlciwgd2luZG93OiBbbnVtYmVyLCBudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgaWYgKG9sZFswXSA9PT0gd2luZG93WzBdICYmIG9sZFsxXSA9PT0gd2luZG93WzFdKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93IGNoYW5nZWQgZm9yICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogWyR7b2xkLmpvaW4oXCIsIFwiKX1dIC0+IFske3dpbmRvdy5qb2luKFwiLCBcIil9XWApO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93ID0gd2luZG93O1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3coMCwgc3BlY3NbMF0udmFsaWRXaW5kb3cpO1xuICAgICAgICAvLyBMaXZlIHNsb3RzIHBhaXIgd2l0aCBzcGVjcyBieSBpZGVudGl0eSwgaW4gb3JkZXIgKHRoZSBzYW1lIGVuZHBvaW50IGNhbiBhcHBlYXIgc2V2ZXJhbCB0aW1lcywgZS5nLiBvbmUgZW50cnkgcGVyIHdpbmRvdylcbiAgICAgICAgbGV0IGxpdmVCeUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICAgICAgICBsZXQgb3JpZ2luYWxMZW5ndGggPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9yaWdpbmFsTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGlkID0gdGhpcy5zb3VyY2VzW2ldLmlkZW50aXR5O1xuICAgICAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBsaXZlQnlJZGVudGl0eS5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGxpdmVCeUlkZW50aXR5LnNldChpZCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcy5zbGljZSgxKSkge1xuICAgICAgICAgICAgbGV0IHNsb3QgPSBsaXZlQnlJZGVudGl0eS5nZXQoc3BlYy5pZGVudGl0eSk/LnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93KHNsb3QsIHNwZWMudmFsaWRXaW5kb3cpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc291cmNlc1tzbG90XTtcbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGUgY2hhbmdlZCBmb3IgJHtleGlzdGluZy5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpfWApO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yb3V0ZSA9IHNwZWMucm91dGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB2YWxpZFdpbmRvdzogc3BlYy52YWxpZFdpbmRvdywgcm91dGU6IHNwZWMucm91dGUsIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYywgaWRlbnRpdHk6IHNwZWMuaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVN0YXRlcy5wdXNoKG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VGaWxlQ291bnRzLnB1c2goMCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUJ5dGVDb3VudHMucHVzaCgwKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMucnVuU291cmNlU3luYyh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU291cmNlKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWFkbGluZSA9IHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd1sxXSAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgICAgICBsZXQgcmVjYXBwZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLm92ZXJsYXkudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5mbHVzaEF0IDw9IGRlYWRsaW5lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVudHJ5LmZsdXNoQXQgPSBkZWFkbGluZTtcbiAgICAgICAgICAgIHJlY2FwcGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2FwcGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmUtY2FwcGVkICR7cmVjYXBwZWR9IHBlbmRpbmcgZmFzdCB3cml0ZXMgdG8gdGhlIG5ldyBmbHVzaCBkZWFkbGluZSAke25ldyBEYXRlKGRlYWRsaW5lKS50b0lTT1N0cmluZygpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICBpZiAoZGVhZGxpbmUgPD0gRGF0ZS5ub3coKSkge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaE92ZXJsYXkoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEZsdXNoaW5nIGZhc3Qgd3JpdGVzIGFmdGVyIGEgdmFsaWQgd2luZG93IGNoYW5nZSBmYWlsZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHNsb3Qgc3RheXMgaW4gdGhlIGFycmF5cyBmb3JldmVyIChpbmRleCBlbnRyaWVzIHJlZmVyZW5jZSBzb3VyY2VzIGJ5IHNsb3QgbnVtYmVyKTsgaXQganVzdCBnb2VzIGRlYWQgLSBsb29wcyBzdG9wLCBhbmQgaXRzIGluZGV4IGVudHJpZXMgZHJvcCAob3RoZXIgc291cmNlcycgc2NhbnMgcmUtZmluZCBhbnkgY29weSB0aGF0J3Mgc3RpbGwgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG5ldyBjb25maWcpXG4gICAgcHJpdmF0ZSByZW1vdmVTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdLnNvdXJjZTtcbiAgICAgICAgc3RhdGUuZGVhZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgbGV0IGRyb3BwZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgIT09IHNvdXJjZUluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBpdHMgc2NhbnMgYXJlIHN0b3BwZWQgYW5kICR7ZHJvcHBlZH0gaW5kZXggZW50cmllcyBpdCBoZWxkIHdlcmUgZHJvcHBlZGApO1xuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNjYW5Tb3VyY2UoMCk7XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpOiBqdXN0IGl0cyBjaGFuZ2VzIHNpbmNlIHRoZSBib3VuZGFyeSBuZWlnaGJvcmhvb2QsIHdpdGggbWF0Y2hpbmcgdmFsdWVzIHB1bGxlZCBvbnRvIG91ciBvd24gZGlzay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gc3RhcnRpbmc6IGNoYW5nZXMgc2luY2UgJHtuZXcgRGF0ZShjb25maWcuc2luY2UpLnRvSVNPU3RyaW5nKCl9LCByb3V0ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICBsZXQgY2hhbmdlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcihjb25maWcuc2luY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlcyA9IChhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIikpLmZpbHRlcih4ID0+IHguY3JlYXRlVGltZSA+IGNvbmZpZy5zaW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFIHx8ICFyb3V0ZUNvbnRhaW5zKGNvbmZpZy5yb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHtcbiAgICAgICAgICAgICAgICB0YWxseS5maWx0ZXJlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWVtLmdldChmaWxlLnBhdGgpO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gb3ZlcmxheUVudHJ5ICYmIG92ZXJsYXlFbnRyeS50IHx8IGVudHJ5ICYmIGVudHJ5LndyaXRlVGltZSB8fCAwO1xuICAgICAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEEgdG9tYnN0b25lIHN0b3JlcyBub3RoaW5nIG9uIG91ciBvd24gc291cmNlIC0gdGhlIGluZGV4IGVudHJ5IGFsb25lIHJlY29yZHMgaXRcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBzaXplOiAwLCBzb3VyY2U6IDAgfSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc291cmNlLmdldDIoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogMCwgc291cmNlOiAwIH0pO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoZmlsZS5wYXRoLCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2U6IDAgfSk7XG4gICAgICAgICAgICBpZiAoZW50cnkgfHwgb3ZlcmxheUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudXBkYXRlZCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWxseS5uZXcrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmluaXNoZWQgaW4gJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc2NhblN0YXJ0KSAvIDEwMDApfXMgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtjaGFuZ2VzLmxlbmd0aH0gY2hhbmdlczogJHtmb3JtYXRTY2FuVGFsbHkodGFsbHksIGNoYW5nZXMubGVuZ3RoKX1gKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGNoZWFwIGFsd2F5cy1jdXJyZW50IHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRoaXMuaW5kZXhGaWxlQ291bnQsIGJ5dGVDb3VudDogdGhpcy5pbmRleEJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIGZpbGVDb3VudDogdGhpcy5zb3VyY2VGaWxlQ291bnRzW2ldLFxuICAgICAgICAgICAgICAgIGJ5dGVDb3VudDogdGhpcy5zb3VyY2VCeXRlQ291bnRzW2ldLFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiB0aGlzLmNvbmZpZz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogWy4uLnRoaXMuc3luY0FjdGl2aXRpZXNdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBXYWxrcyB0aGUgd2hvbGUgaW5kZXggZm9yIGV4YWN0IHRvdGFscyAtIG1vcmUgZXhwZW5zaXZlIHRoYW4gZ2V0U3luY1Byb2dyZXNzLCBidXQgaW1tdW5lIHRvIGFueSBkcmlmdCBpbiB0aGUgbWFpbnRhaW5lZCBjb3VudGVycyAoYW5kIGxvYWRzIHRoZSBpbmRleCBmaXJzdCwgc28gaXQncyBuZXZlciBjb2xkIHplcm9zKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgc291cmNlcyA9IHRoaXMuc291cmNlcy5tYXAoeCA9PiAoeyBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLCBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMubWVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbZW50cnkuc291cmNlXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UuZmlsZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgc291cmNlLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzb3VyY2VzOiBzb3VyY2VzLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuZGlydHkuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBsZXQgZGlydHkgPSB0aGlzLmRpcnR5O1xuICAgICAgICB0aGlzLmRpcnR5ID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgd3JpdGVzOiBCbG9iSW5kZXhFbnRyeVtdID0gW107XG4gICAgICAgIGxldCBkZWxldGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgZGlydHkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHdyaXRlcy5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlOiBlbnRyeS5zb3VyY2UgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3cml0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LndyaXRlQmF0Y2god3JpdGVzKTtcbiAgICAgICAgaWYgKGRlbGV0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LmRlbGV0ZUJhdGNoKGRlbGV0ZXMpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBzeW5jaHJvbml6YXRpb24g4pSA4pSAXG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blNvdXJjZVN5bmMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gUmVhZCBsaXZlIGZvciBldmVyeSBwYXNzLCBub3QgY2FwdHVyZWQgLSB1cGRhdGVTb3VyY2VzIGNhbiBjaGFuZ2UgaXQgd2hpbGUgbG9vcHMgcnVuXG4gICAgICAgIGxldCBub0Z1bGxTeW5jID0gKCkgPT4gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XS5ub0Z1bGxTeW5jO1xuICAgICAgICBsZXQgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCBzb3VyY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgPSAhIShjb25maWcuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgJiYgc291cmNlLmdldENoYW5nZXNBZnRlcik7XG4gICAgICAgICAgICAgICAgbGlzdGluZyA9IGF3YWl0IHRoaXMuc2NhblNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSW5pdGlhbCBzY2FuIG9mIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQsIHJldHJ5aW5nOmAsIGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICBpZiAobGlzdGluZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIGxpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9GdWxsU3luYygpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3B5aW5nIGZpbGVzIGZyb20gc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDpgLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgICAgICAvLyBDaGFuZ2UgcG9sbHMgb25seSBzaG93IHdoYXQgdGhlIHNvdXJjZSBIQVMsIG5ldmVyIHdoYXQgaXQncyBtaXNzaW5nLCBzbyBwdXNoZXMgcnVuIG9uIHRoZSBmdWxsLXJlc2NhbiBjYWRlbmNlIChmaW5kSW5mbyBvbiBhbiBpbmRleC1iYWNrZWQgc291cmNlIGlzIGNoZWFwKVxuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzID0gYXdhaXQgc291cmNlLmZpbmRJbmZvKFwiXCIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCBuZXcgTWFwKGZpbGVzLm1hcCh4ID0+IFt4LnBhdGgsIHguY3JlYXRlVGltZV0pKSk7XG4gICAgICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChGVUxMX1JFU0NBTl9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXNjYW4gPSBhd2FpdCB0aGlzLnNjYW5Tb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCByZXNjYW4pO1xuICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZ1bGwgbWV0YWRhdGEgc2NhbiAoc2l6ZSwgd3JpdGVUaW1lLCBwYXRoKSBvZiBvbmUgc291cmNlLCBhcHBsaWVkIHRvIHRoZSBpbmRleC4gUmV0dXJucyB0aGUgc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcmVjb25jaWxlU291cmNlIHVzZXMgZm9yIHRoZSBwdXNoIGRpcmVjdGlvbi5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Tb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHZhbGlkV2luZG93LCByb3V0ZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7IHR5cGU6IFwibWV0YWRhdGFTY2FuXCIsIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzdGFydFRpbWU6IHNjYW5TdGFydCB9O1xuICAgICAgICB0aGlzLnN5bmNBY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGFydGluZyAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpdml0aWVzLmRlbGV0ZShhY3Rpdml0eSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNvdXJjZSBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgd2hpbGUgdGhlIGxpc3Rpbmcgd2FzIGluIGZsaWdodDsgaXRzIHJlc3VsdHMgYXJlIGRlYWRcbiAgICAgICAgaWYgKHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuIG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IGluZGV4U2l6ZUJlZm9yZSA9IHRoaXMubWVtLnNpemU7XG4gICAgICAgIGxldCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGxldCBuZXdQYXRocyA9IDA7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHNlZW4uc2V0KGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tZW0uaGFzKGZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRocysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFsbHlbdGhpcy5hcHBseVNjYW5uZWQoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCA9IGZpbGVzLmxlbmd0aDtcbiAgICAgICAgLy8gSW5kZXggZW50cmllcyB0aGlzIHNvdXJjZSB3YXMgdGhlIGhvbGRlciBvZiwgYnV0IHRoYXQgdmFuaXNoZWQgZnJvbSBpdCAoZS5nLiBkZWxldGVkIHdoaWxlIHdlIHdlcmUgb2ZmbGluZSksIGNvbWUgb3V0IG9mIHRoZSBpbmRleC4gRW50cmllcyBjaGFuZ2VkIGFmdGVyIHRoZSBzY2FuIHN0YXJ0ZWQgYXJlIGtlcHQg4oCUIHRoZSBzY2FuIGxpc3RpbmcgbWF5IHNpbXBseSBwcmVkYXRlIHRoZW0uIFRvbWJzdG9uZXMgaGF2ZSBubyBwaHlzaWNhbCBmaWxlIGZvciBhIGxpc3RpbmcgdG8gdm91Y2ggZm9yLCBzbyB0aGV5J3JlIGV4ZW1wdCAoY2xlYW51cFRvbWJzdG9uZXMgZXhwaXJlcyB0aGVtIGluc3RlYWQpLlxuICAgICAgICBsZXQgcmVtb3ZlZEZyb21JbmRleCA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgPT09IHNvdXJjZUluZGV4ICYmIGVudHJ5LnNpemUgIT09IDAgJiYgZW50cnkuY2hhbmdlZEF0IDwgc2NhblN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZEZyb21JbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ291bnRlZCBvbmx5IHdoZW4gdGhlIHNvdXJjZSBTSE9VTEQgaG9sZCB0aGUgZW50cnkgKGl0cyB3aW5kb3cvcm91dGUgbWF0Y2gpIC0gdGhlc2UgYXJlIHdoYXQgdGhlIHJlY29uY2lsZSBwYXNzIHB1c2hlcyB0byBpdFxuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDAgfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LndyaXRlVGltZSA8IHZhbGlkV2luZG93WzBdIHx8IGVudHJ5LndyaXRlVGltZSA+IHZhbGlkV2luZG93WzFdKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbWlzc2luZ09uU291cmNlKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGVyY2VudGFnZXMgYXJlIG9mIHRoZSB1bmlvbiBvZiBib3RoIHNpZGVzIChvdXIgaW5kZXggKyB0aGVpciBsaXN0aW5nKSwgc28gZXZlcnkgY291bnQgaGFzIGEgc3RhYmxlIGRlbm9taW5hdG9yXG4gICAgICAgIGxldCB1bmlvbiA9IGluZGV4U2l6ZUJlZm9yZSArIG5ld1BhdGhzO1xuICAgICAgICBsZXQgcGN0ID0gKG46IG51bWJlcikgPT4gYCR7TWF0aC5yb3VuZChuIC8gTWF0aC5tYXgodW5pb24sIDEpICogMTAwMCkgLyAxMH0lYDtcbiAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZpbmlzaGVkIGluICR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zIChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7ZmlsZXMubGVuZ3RofSBsaXN0ZWQgdnMgJHtpbmRleFNpemVCZWZvcmV9IGluZGV4ZWQgKHVuaW9uICR7dW5pb259KTogJHtmb3JtYXRTY2FuVGFsbHkodGFsbHksIHVuaW9uKX0sICR7bWlzc2luZ09uU291cmNlfSBpbiBpbmRleCBidXQgbWlzc2luZyBvbiBzb3VyY2UgKCR7cGN0KG1pc3NpbmdPblNvdXJjZSl9KSwgJHtyZW1vdmVkRnJvbUluZGV4fSByZW1vdmVkIGZyb20gaW5kZXggKCR7cGN0KHJlbW92ZWRGcm9tSW5kZXgpfSlgKTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgcmV0dXJuIHNlZW47XG4gICAgfVxuXG4gICAgLy8gVGhlIHB1c2ggZGlyZWN0aW9uIG9mIHN5bmNocm9uaXphdGlvbjogZXZlcnl0aGluZyB3ZSBrbm93IHRoYXQgdGhlIHNvdXJjZSBpcyBtaXNzaW5nIChvciBob2xkcyBhbiBvbGRlciBjb3B5IG9mKSBpcyB3cml0dGVuIHRvIGl0IOKAlCBpbmNsdWRpbmcgZGVsZXRpb25zLCBhcyB0b21ic3RvbmUgd3JpdGVzLiBUaGlzIGlzIHdoYXQgaGVhbHMgYSBzb3VyY2Ugd2hvc2UgYmFja2dyb3VuZCB3cml0ZXMgZmFpbGVkIChlLmcuIGl0IHdhcyBkb3duKTogdGhlIG5leHQgc2NhbiBzZWVzIHdoYXQncyBtaXNzaW5nIGFuZCByZS1zZW5kcyBpdC5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3csIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBhY2NlcHRzV3JpdGVzID0gd2luZG93QWNjZXB0c1dyaXRlcyh2YWxpZFdpbmRvdyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZSA9PT0gc291cmNlSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlcyAtIGl0IGlzIG9ubHkgZXZlciB3cml0dGVuIGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgYW5kIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2tcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghYWNjZXB0c1dyaXRlcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWlyVGltZSA9IGxpc3RpbmcuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSAhPT0gdW5kZWZpbmVkICYmIHRoZWlyVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gb25seSBuZWVkcyBwdXNoaW5nIHdoaWxlIHRoZSBzb3VyY2Ugc3RpbGwgaG9sZHMgYW4gb2xkZXIgY29weVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhlaXJUaW1lID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzb3VyY2Uuc2V0KGtleSwgQnVmZmVyLmFsbG9jKDApLCB7IGxhc3RNb2RpZmllZDogZW50cnkud3JpdGVUaW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc291cmNlc1tlbnRyeS5zb3VyY2VdLnNvdXJjZS5nZXQyKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEFib3J0IHRoZSBwYXNzIGluc3RlYWQgb2YgbG9nZ2luZyBwZXIgZmlsZTsgdGhlIG5leHQgc2NhbiBjeWNsZSByZXRyaWVzXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZWNvbmNpbGluZyBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVNjYW5uZWQoc291cmNlSW5kZXg6IG51bWJlciwgZmlsZTogQXJjaGl2ZUZpbGVJbmZvKTogU2Nhbk91dGNvbWUge1xuICAgICAgICAvLyBBbiBpbi1mbGlnaHQgc2NhbiBjYW4gb3V0bGl2ZSBpdHMgc291cmNlJ3MgcmVtb3ZhbDsgaXRzIHJlc3VsdHMgYXJlIGRlYWRcbiAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShzb3VyY2VJbmRleCkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIE5FVkVSIHB1bGxlZCBmcm9tIG90aGVyIHNvdXJjZXMgLSBpdCBvbmx5IGV2ZXIgYXJyaXZlcyBhcyBhbiBleHBsaWNpdCwgdmVyc2lvbi12YWxpZGF0ZWQgd3JpdGUsIGFuZCBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrLiBSb3V0ZSBhbmQgdmFsaWQtd2luZG93IGZpbHRlcnMgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgZWl0aGVyOiBpdCBpcyB0aGUgZmlsZSBERUZJTklORyB0aGVtLCBzbyBmaWx0ZXJpbmcgaXQgd291bGQgbWVhbiBjZXJ0YWluIHNvdXJjZXMgY291bGQgbmV2ZXIgaGF2ZSB0aGVpciByb3V0aW5nIGNvbmZpZyB1cGRhdGVkLCBldmVyLlxuICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ICE9PSAwKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgdmFsaWRXaW5kb3csIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgbGV0IFt3aW5kb3dTdGFydCwgd2luZG93RW5kXSA9IHZhbGlkV2luZG93O1xuICAgICAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8IHdpbmRvd1N0YXJ0IHx8IGZpbGUuY3JlYXRlVGltZSA+IHdpbmRvd0VuZCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgICAgIC8vIEEgcGFydGlhbGx5LW92ZXJsYXBwaW5nIHNoYXJkJ3MgbGlzdGluZyBpbmNsdWRlcyBrZXlzIG91dHNpZGUgb3VyIHJvdXRlOyBpZ25vcmUgdGhlbVxuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShmaWxlLnBhdGgpKSkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLm1lbS5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgLy8gVGhlIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcyAodGllcyBrZWVwIHRoZSBleGlzdGluZyBlbnRyeSlcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIGZpbGUuY3JlYXRlVGltZSA8PSBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybiBcInVuY2hhbmdlZFwiO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBzaXplOiBmaWxlLnNpemUsIHNvdXJjZTogc291cmNlSW5kZXggfSk7XG4gICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHJldHVybiBcInRvbWJzdG9uZVwiO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgaWYgKCFzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyKSByZXR1cm47XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcihzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lKTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGFsbHlbdGhpcy5hcHBseVNjYW5uZWQoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvbGxzIHJ1biBjb25zdGFudGx5LCBzbyBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgaW5kZXggZ2V0IGEgbGluZVxuICAgICAgICBpZiAodGFsbHkubmV3IHx8IHRhbGx5LnVwZGF0ZWQgfHwgdGFsbHkudG9tYnN0b25lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlcyBwb2xsIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke2NoYW5nZXMubGVuZ3RofSBjaGFuZ2VzOiAke2Zvcm1hdFNjYW5UYWxseSh0YWxseSwgY2hhbmdlcy5sZW5ndGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCArPSBjaGFuZ2VzLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IHBvbGxTdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkcyB0aGUgZmlsZXMgYSBzb3VyY2UgY3VycmVudGx5IGhvbGRzIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCBwcmVzZXJ2aW5nIHRoZWlyIG1vZGlmaWVkIHRpbWVzIOKAlCBzbyBhIG5ld2VyIGxvY2FsIHdyaXRlIGFsd2F5cyB3aW5zLiBTa2lwcGVkIGZvciBub0Z1bGxTeW5jIHNvdXJjZXMgKGZyb250aW5nIGEgbGFyZ2UgZGF0YWJhc2Ugd2l0aG91dCBjb3B5aW5nIGl0KTsgcmVhZHMgc3RpbGwgZG93bi1jYWNoZSBsYXppbHkuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybjtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgIT09IHNvdXJjZUluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zaXplID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN5bmNBY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxldCBwcm9ncmVzc0xvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbG9nUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzc0xvZ2dlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7YWN0aXZpdHkuZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKWApO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKGxvZ1Byb2dyZXNzLCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IHNsb3dFcnJvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lO1xuICAgICAgICAgICAgbGV0IGRvbmVGaWxlcyA9IGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGRvbmVCeXRlcyA9IGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGJ5dGVzUGVyU2Vjb25kID0gZG9uZUJ5dGVzIC8gKGVsYXBzZWQgLyAxMDAwKTtcbiAgICAgICAgICAgIGxldCByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXMgLSBkb25lQnl0ZXM7XG4gICAgICAgICAgICBsZXQgZXRhVGV4dCA9IFwidW5rbm93biAobm8gYnl0ZXMgdHJhbnNmZXJyZWQgeWV0KVwiO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUGVyU2Vjb25kID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdNcyA9IHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNQZXJTZWNvbmQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIGV0YVRleHQgPSBgJHtmb3JtYXRUaW1lKHJlbWFpbmluZ01zKX0gcmVtYWluaW5nLCBjb21wbGV0aW5nIGFyb3VuZCAke25ldyBEYXRlKERhdGUubm93KCkgKyByZW1haW5pbmdNcykudG9JU09TdHJpbmcoKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgaGFzIGJlZW4gcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKGVsYXBzZWQpfTogJHtkb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeyhkb25lRmlsZXMgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoZG9uZUJ5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgZG9uZUJ5dGVzIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGJ5dGVzUGVyU2Vjb25kKX1CL3MuIEVzdGltYXRlZCAke2V0YVRleHR9LmApO1xuICAgICAgICB9LCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCk7XG4gICAgICAgIChzbG93RXJyb3JUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghZmFpbGVkICYmICF0aGlzLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsga2V5LCBlbnRyeSB9ID0gcGVuZGluZ1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBzb3VyY2UuZ2V0MihrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbW92ZSB0aGUgZW50cnkncyBzb3VyY2UgaWYgaXQgd2Fzbid0IGNoYW5nZWQgd2hpbGUgd2UgY29waWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW0uZ2V0KGtleSkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCwgc291cmNlOiAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgb3RoZXIgd29ya2VycyBwdWxsaW5nIG5ldyBmaWxlcywgdGhlbiBzdXJmYWNlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2xvd0Vycm9yVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbmRJbmZvIGFuZCBnZXRDaGFuZ2VzQWZ0ZXIgbGlzdCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZSBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhlIGxpc3RpbmcgaXMgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlIChsb2NhbCBkaXNrKSBpcyBpbXBsaWNpdGx5IHJlcXVpcmVkIC0gcmVtb3RlIHNvdXJjZXMgYXJlIG5vdCwgdGhleSBjb21lIGFuZCBnby5cbiAgICBwcml2YXRlIGFzeW5jIHdhaXRGb3JSZXF1aXJlZFNjYW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZVN0YXRlc1swXS5pbml0aWFsU2Nhbi5wcm9taXNlO1xuICAgIH1cblxuICAgIC8vIEEgcmVxdWVzdGVkIGZpbGUgaXNuJ3QgaW4gdGhlIGluZGV4OiBvdXIgb3duIGJhc2Ugc291cmNlIChpbXBsaWNpdGx5IHJlcXVpcmVkKSBpcyBjaGVja2VkIGRpcmVjdGx5IGlmIGl0cyBpbml0aWFsIHNjYW4gaGFzbid0IGZpbmlzaGVkLCBhbmQgY2hhbmdlcy1hZnRlciBzb3VyY2VzIGFyZSByZS1wb2xsZWQgKGF0IG1vc3QgZXZlcnkgNSBzZWNvbmRzKVxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tNaXNzaW5nS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhc3RhdGUuc2NhbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBzb3VyY2UuZ2V0SW5mbyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTY2FubmVkKGksIHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciAmJiBEYXRlLm5vdygpIC0gc3RhdGUubGFzdE1pc3NDaGVjayA+IE1JU1NfQ0hFQ0tfSU5URVJWQUwpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0TWlzc0NoZWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTxJbmRleEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWVtLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgJiYgdGhpcy5pc0xpdmUoZW50cnkuc291cmNlKSkgcmV0dXJuIGVudHJ5O1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgbGlzdCBjaGFuZ2VkIGFuZCB0aGlzIGVudHJ5J3Mgc291cmNlIG5vIGxvbmdlciBleGlzdHM7IHRyZWF0IGFzIG1pc3NpbmdcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tNaXNzaW5nS2V5KGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgZGF0YSBvcGVyYXRpb25zIOKUgOKUgFxuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihrZXksIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGtleTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgIGxldCBvdmVybGF5RW50cnkgPSB0aGlzLm92ZXJsYXkuZ2V0KGtleSk7XG4gICAgICAgIGlmIChvdmVybGF5RW50cnkpIHtcbiAgICAgICAgICAgIC8vIEFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUgKHRvbWJzdG9uZSlcbiAgICAgICAgICAgIGlmIChvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IG92ZXJsYXlFbnRyeS5kYXRhO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCBkYXRhLmxlbmd0aCksIE1hdGgubWluKHJhbmdlLmVuZCwgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogb3ZlcmxheUVudHJ5LnQsIHNpemUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW50cnkgPSBhd2FpdCB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGVudHJ5Lmxhc3RBY2Nlc3MgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgaG9sZGVyID0gZW50cnkuc291cmNlO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5zb3VyY2VzW2hvbGRlcl0uc291cmNlLmdldDIoa2V5LCB7IHJhbmdlIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBob2xkZXJFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gUmFuZ2VkIHJlYWRzIGNhbid0IHBvcHVsYXRlIGEgY2FjaGUgKHRoZXkncmUgcGFydGlhbClcbiAgICAgICAgICAgIGlmIChob2xkZXIgIT09IDAgJiYgIXJhbmdlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgLSBmYWxsaW5nIGJhY2sgdG8gYW5vdGhlciBzb3VyY2UncyBjb3B5IHdvdWxkIHN5bmNocm9uaXplIGl0IGJldHdlZW4gbm9kZXMgdGhyb3VnaCB0aGUgcmVhZCBwYXRoLCB3aGljaCBpdCBuZXZlciBpc1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBob2xkZXIgaXMgZG93biBvciBsb3N0IHRoZSBmaWxlLiBBTlkgb3RoZXIgc291cmNlJ3MgY29weSBiZWF0cyBubyB2YWx1ZSAtIGV2ZW4gYW4gT0xERVIgb25lIC0gYW5kIGl0J3MgY29waWVkIG9udG8gb3VyIGRpc2sgc28gdGhlIG5leHQgcmVhZCBkb2Vzbid0IGRlcGVuZCBvbiBsdWNrLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGhvbGRlciB8fCAhdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGZhbGxiYWNrOiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IGF3YWl0IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0MihrZXkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgZmFsbGJhY2spO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBmYWxsYmFjay5kYXRhO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIGRhdGEubGVuZ3RoKSwgTWF0aC5taW4ocmFuZ2UuZW5kLCBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBmYWxsYmFjay53cml0ZVRpbWUsIHNpemU6IGZhbGxiYWNrLnNpemUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAvLyBUaGUgaG9sZGVyIGFuc3dlcmVkIFwibm90IHRoZXJlXCIgYW5kIG5vIG90aGVyIHNvdXJjZSBoYXMgaXQgZWl0aGVyOiB0aGUgZW50cnkgd2FzIHN0YWxlXG4gICAgICAgIHRoaXMuZGVsZXRlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWFkJ3MgYnl0ZXMgY2FtZSBmcm9tIGEgcmVtb3RlIHNvdXJjZSwgc28gd3JpdGUgdGhlbSBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgd2hpY2ggYmVjb21lcyB0aGUgZW50cnkncyBuZXcgaG9sZGVyIC0gcmVhZHMgb25seSBwYXkgdGhlIHJlbW90ZSBmZXRjaCBvbmNlXG4gICAgcHJpdmF0ZSBhc3luYyBjYWNoZVJlYWQoa2V5OiBzdHJpbmcsIHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZTogMCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwib3JpZ2luYWxcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnPy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheUVudHJ5ID0gdGhpcy5vdmVybGF5LmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBvdmVybGF5RW50cnkgJiYgb3ZlcmxheUVudHJ5LnQgfHwgZW50cnkgJiYgZW50cnkud3JpdGVUaW1lIHx8IDA7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBjdXJyZW50VGltZSkgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgd3JpdGVUaW1lID0gbGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgIGlmIChjb25maWc/LmZhc3QpIHtcbiAgICAgICAgICAgIC8vIEEgd3JpdGVEZWxheSBvZiB6ZXJvIGlzIGEgcmVhbCBjaG9pY2UgKG5vIGRlbGF5IGF0IGFsbCksIHNvIG9ubHkgYW4gb21pdHRlZCBkZWxheSBnZXRzIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICBsZXQgd3JpdGVEZWxheSA9IGNvbmZpZy53cml0ZURlbGF5O1xuICAgICAgICAgICAgaWYgKHdyaXRlRGVsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHdyaXRlRGVsYXkgPSBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZGVsYXkgbmV2ZXIgZXh0ZW5kcyBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93J3MgZW5kIChtaW51cyB0aGUgbWFyZ2luLCBzbyB0aGUgd3JpdGVzIGFyZSBvbiBkaXNrIGJlZm9yZSB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciAtIGEgZGVwbG95IHN3aXRjaG92ZXIgaXMganVzdCB0aGlzIHRvbywgc2luY2UgaXRzIHJlbWFwIGVuZHMgb3VyIHdpbmRvdykuIFBhc3QgdGhhdCBwb2ludCBmYXN0IHdyaXRlcyB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgbGV0IGRlYWRsaW5lID0gdGhpcy5zb3VyY2VzWzBdLnZhbGlkV2luZG93WzFdIC0gV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4gICAgICAgICAgICBpZiAod3JpdGVEZWxheSA+IDAgJiYgRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZsdXNoQXQgPSBNYXRoLm1pbihEYXRlLm5vdygpICsgd3JpdGVEZWxheSwgZGVhZGxpbmUpO1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5zZXQoa2V5LCB7IGRhdGEsIHQ6IHdyaXRlVGltZSwgZmx1c2hBdCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIHdyaXRlVGltZSk7XG4gICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheS5kZWxldGUoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIHdyaXRlVGltZSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZywgY29uZmlnPzogV3JpdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lIHdyaXRlcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgb3JkZXJlZCBieSB3cml0ZSB0aW1lIGxpa2UgYW55IG90aGVyIHdyaXRlLCBwcm9wYWdhdGVzIHRocm91Z2ggc3luY2hyb25pemF0aW9uLCBhbmQgZXhwaXJlcyBhZnRlciBUT01CU1RPTkVfRVhQSVJZXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KGtleSwgQnVmZmVyLmFsbG9jKDApLCBjb25maWcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JpdGFibGVTb3VyY2VzKGNvbmZpZz86IHsgaWdub3JlV2luZG93PzogYm9vbGVhbiB9KTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgd3JpdGFibGU6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd0FjY2VwdHNXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93KSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlczogdGhlIHdyaXRlciB3cml0ZXMgaXQgZGlyZWN0bHkgdG8gZWFjaCBub2RlLCBzbyB3ZSBzdG9yZSBpdCBvbiBvdXIgb3duIGRpc2sgb25seSAobm8gdmFsaWQtd2luZG93IGZpbHRlciAtIHJvdXRpbmcvdmFsaWQgd2luZG93cyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGVtKSBhbmQgbmV2ZXIgZm9yd2FyZCBpdCB0byBvdGhlciBzb3VyY2VzLlxuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcImZsdXNoZWRcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgaXNSb3V0aW5nID0ga2V5ID09PSBST1VUSU5HX0ZJTEU7XG4gICAgICAgIGxldCB3cml0YWJsZSA9IHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKHsgaWdub3JlV2luZG93OiBpc1JvdXRpbmcgfSk7XG4gICAgICAgIGxldCBmaXJzdCA9IHdyaXRhYmxlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyAoZXZlcnkgc291cmNlJ3MgdmFsaWQgd2luZG93IGlzIGluIHRoZSBwYXN0KSwgc28gd3JpdGVzIGNhbm5vdCBiZSBzdG9yZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgb3VyIG93biAoZmlyc3QpIHNvdXJjZSBibG9ja3MgdGhlIHdyaXRlLiBEb3duc3RyZWFtIHNvdXJjZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGJhY2tncm91bmQ6IGEgZG93biBkb3duc3RyZWFtIHNvdXJjZSBtdXN0IG5vdCBmYWlsIG9yIHN0YWxsIHdyaXRlcywgYW5kIHJlY29uY2lsZVNvdXJjZSByZS1zZW5kcyBhbnl0aGluZyB0aGV5IG1pc3NlZCBvbmNlIHRoZXkgY29tZSBiYWNrLlxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEEgdG9tYnN0b25lIHN0b3JlcyBub3RoaW5nIG9uIG91ciBvd24gc291cmNlIC0gdGhlIGluZGV4IGVudHJ5IGFsb25lIHJlY29yZHMgaXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZSwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZTogZmlyc3QgfSk7XG4gICAgICAgIGlmIChpc1JvdXRpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERvd25zdHJlYW0gc291cmNlcyByZWNlaXZlIHRvbWJzdG9uZXMgYXMgYWN0dWFsIGVtcHR5IHdyaXRlcywgc28gdGhlaXIgbGlzdGluZ3Mgc2hvdyB0aGUgZGVsZXRpb24gKHNpemUgMCkgYW5kIG90aGVyIHN0b3JlcyBzY2FuIGl0IGluIGFzIGEgdG9tYnN0b25lXG4gICAgICAgICAgICB2b2lkIHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG92ZXJsYXlFbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZTogb3ZlcmxheUVudHJ5LmRhdGEubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVG9tYnN0b25lcyBhcmUgbWlzc2luZyBmaWxlcywgc28gbGlzdGluZ3MgaGlkZSB0aGVtXG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIG92ZXJsYXlFbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGluZm9zLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IG92ZXJsYXlFbnRyeS50LCBzaXplOiBvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVzID0gYXBwbHlGaW5kSW5mb1NoYXBlKEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpLCBwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIHRoZSBnaXZlbiB0aW1lIOKAlCBmYXN0LCBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnkgaW5kZXguIEZpbHRlcnMgb24gd2hlbiBXRSBsZWFybmVkIG9mIHRoZSBjaGFuZ2UgKGNoYW5nZWRBdCksIHNvIGZpbGVzIHN5bmNocm9uaXplZCBsYXRlICh3aXRoIG9sZCB3cml0ZSB0aW1lcykgYXJlIHN0aWxsIHJlcG9ydGVkLiBEZWxldGlvbnMgQVJFIHJlcG9ydGVkLCBhcyBzaXplLTAgdG9tYnN0b25lIGVudHJpZXMg4oCUIHRoYXQncyBob3cgdGhleSBwcm9wYWdhdGUgdG8gc3RvcmVzIHN5bmNpbmcgZnJvbSB1cy5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gdGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCBvdmVybGF5RW50cnldIG9mIHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS50IDw9IHRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogb3ZlcmxheUVudHJ5LnQsIHNpemU6IG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHRoaXMuc291cmNlU3RhdGVzLmV2ZXJ5KHggPT4geC5zY2FuQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiB0aGlzLm1lbS5zaXplLFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBsYXJnZSB1cGxvYWRzIOKUgOKUgFxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSlcblxuICAgIHByaXZhdGUgZ2V0RGlza1NvdXJjZSgpOiB7IGRpc2s6IEFyY2hpdmVzRGlzazsgc291cmNlSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzRGlzaykgcmV0dXJuIHsgZGlzazogc291cmNlLCBzb3VyY2VJbmRleDogaSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFyZ2UgdXBsb2FkcyByZXF1aXJlIGFuIEFyY2hpdmVzRGlzayBzb3VyY2UsIGFuZCB0aGlzIHN0b3JlIGhhcyBub25lIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChpZCwga2V5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhrZXkpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZTogc291cmNlSW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaE92ZXJsYXkoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIGVudHJ5LmZsdXNoQXQgPiBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGVudHJ5LmRhdGEsIGVudHJ5LnQpO1xuICAgICAgICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQgd2Fzbid0IG92ZXJ3cml0dGVuIHdoaWxlIHdlIHdlcmUgZmx1c2hpbmdcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXkuZ2V0KGtleSkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUJ5dGVDb3VudHNbMF0gPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIGxldCBldmljdGVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgZXZpY3RlZEJ5dGVzID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgIT09IDAgfHwgZW50cnkuc2l6ZSA9PT0gMCB8fCBrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnQoY2FuZGlkYXRlcywgeCA9PiB4LmVudHJ5Lmxhc3RBY2Nlc3MpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUJ5dGVDb3VudHNbMF0gPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lbS5nZXQoa2V5KSAhPT0gZW50cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBob2xkZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2U6IGhvbGRlciB9KTtcbiAgICAgICAgICAgICAgICBldmljdGVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICBldmljdGVkQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmljdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGlzayBjYWNoZSBvdmVyIHJlYWRlckRpc2tMaW1pdCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBldmljdGVkICR7ZXZpY3RlZEZpbGVzfSBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihldmljdGVkQnl0ZXMpfUIpLCBub3cgYXQgJHtmb3JtYXROdW1iZXIodGhpcy5zb3VyY2VCeXRlQ291bnRzWzBdKX1CLyR7Zm9ybWF0TnVtYmVyKHRoaXMuY29uZmlnPy5yZWFkZXJEaXNrTGltaXQgfHwgMCl9QmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVG9tYnN0b25lcyBvbmx5IG5lZWQgdG8gZXhpc3QgbG9uZyBlbm91Z2ggZm9yIGV2ZXJ5IHN0b3JlIHRvIGxlYXJuIG9mIHRoZSBkZWxldGlvbjsgZXhwaXJlZCBvbmVzIGNvbWUgb3V0IG9mIHRoZSBpbmRleC4gVGhlIHBoeXNpY2FsIGVtcHR5IGZpbGUgaXMgcmVtb3ZlZCBvbmx5IG9uIGJhY2tibGF6ZSBzb3VyY2VzOiByZW1vdGUgc3RvcmVzIGV4cGlyZSB0aGVpciBvd24gdG9tYnN0b25lcyAoYSBkZWwgdGhlcmUgd291bGQganVzdCBtaW50IGEgZnJlc2ggb25lKSwgYW5kIG91ciBvd24gZGlzayBuZXZlciBzdG9yZWQgYW55dGhpbmcgZm9yIGl0LlxuICAgIHByaXZhdGUgYXN5bmMgY2xlYW51cFRvbWJzdG9uZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gVE9NQlNUT05FX0VYUElSWTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zaXplICE9PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS53cml0ZVRpbWUgPiBjdXRvZmYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd0FjY2VwdHNXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3cpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlRW50cnkuc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdm9pZCBzb3VyY2UuZGVsKGtleSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlbW92aW5nIGV4cGlyZWQgdG9tYnN0b25lICR7a2V5fSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
1063
|
-
/* _JS_SOURCE_HASH = "
|
|
1148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsMkRBQXNFO0FBQ3RFLG1EQUEwRTtBQUMxRSxrRUFBaUY7QUFDakYsNENBR3NCO0FBQ3RCLGtEQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsaURBQXVFO0FBQ3ZFLHdFQUF1RjtBQUN2RixvREFBOEY7QUFDOUYsK0NBQTRDO0FBRTVDLHVoQkFBdWhCO0FBRTFnQixRQUFBLHdCQUF3QixHQUFHLG1CQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbEMsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsbUZBQW1GO0FBQ25GLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN2Qyx5RUFBeUU7QUFDekUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLGtRQUFrUTtBQUNsUSxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzVDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFELDBHQUEwRztBQUMxRyxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDckMsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxN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QUUsU0FBUztnQkFDOUIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLElBQUEsK0JBQW1CLEVBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztvQkFBRSxTQUFTO2dCQUM1RCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksNkJBQWlCLENBQUM7b0JBQUUsU0FBUztnQkFDckQsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztvQkFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdHLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUFsZ0NELDhCQWtnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCwgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0LCBwcm9taXNlT2JqIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQsXG4gICAgd2luZG93QWNjZXB0c1dyaXRlcywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucyB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQnVsa0RhdGFiYXNlQmFzZSwgbm9vcFJlYWN0aXZlRGVwcyB9IGZyb20gXCIuLi9CdWxrRGF0YWJhc2UyL0J1bGtEYXRhYmFzZUJhc2VcIjtcbmltcG9ydCB7IHdyYXBIYW5kbGUsIE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIsIERpcmVjdG9yeVdyYXBwZXIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuXG4vLyBUaGUgc3RvcmFnZSBlbmdpbmUgb2YgdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZlci4gRGF0YSBsaXZlcyBpbiBzeW5jaHJvbml6YXRpb24gc291cmNlcyAoYXQgbWluaW11bSBhbiBBcmNoaXZlc0Rpc2ssIHRoZSBsb2NhbCBkaXNrKTsgQmxvYlN0b3JlIGtlZXBzIGFuIGluZGV4IG9mIGV2ZXJ5IGZpbGUgKHBhdGgsIGxhc3QgbW9kaWZpZWQgdGltZSwgc2l6ZSwgYW5kIHdoaWNoIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgdGhlIGRhdGEpIGluIGEgQnVsa0RhdGFiYXNlMiwgYW5kIHN5bmNocm9uaXplcyB0aGUgaW5kZXggZnJvbSBhbGwgc291cmNlcyAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEV2ZXJ5IHN0YXJ0dXAgZnVsbHkgcmVzY2FucyBlYWNoIHNvdXJjZSdzIG1ldGFkYXRhLCBzbyB0aGUgaW5kZXggc2VsZi1oZWFsczsgdGhlIGZpbGUgd2l0aCB0aGUgaGlnaGVzdCB3cml0ZSB0aW1lIHdpbnMgYWNyb3NzIGFsbCBzb3VyY2VzLCBzbyBtdWx0aXBsZSBzb3VyY2VzIG5lZWQgbm8gc3RhY2tpbmcgb3JkZXIuXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVkgPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgRkFTVF9GTFVTSF9QT0xMID0gMTAwMCAqIDE1O1xuLy8gRmFzdCB3cml0ZXMgYXJlIG5ldmVyIGRlbGF5ZWQgcGFzdCBvdXIgb3duIHZhbGlkIHdpbmRvdywgYW5kIHdpdGhpbiB0aGlzIG1hcmdpbiBvZiB0aGUgd2luZG93J3MgZW5kIHRoZXkgd3JpdGUgdGhyb3VnaCBpbW1lZGlhdGVseSAtIHNvIHdoZW4gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIHRha2VzIG92ZXIsIHRoZSB3cml0ZXMgYXJlIGFscmVhZHkgb24gZGlza1xuZXhwb3J0IGNvbnN0IFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOID0gdGltZUluTWludXRlICogNTtcbi8vIEluZGV4IGNoYW5nZXMgYXJlIGJ1ZmZlcmVkIGluIG1lbW9yeSBhbmQgd3JpdHRlbiB0byB0aGUgQnVsa0RhdGFiYXNlMiBpbiBiYXRjaGVzXG5jb25zdCBJTkRFWF9GTFVTSF9JTlRFUlZBTCA9IDEwMDAgKiAzMDtcbi8vIFNvdXJjZXMgd2l0aCBhIG5hdGl2ZSAoaW5kZXgtYmFja2VkKSBjaGFuZ2UgZmVlZCBhcmUgcG9sbGVkIHRoaXMgb2Z0ZW5cbmNvbnN0IENIQU5HRVNfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgbWV0YWRhdGEgcmVzY2Fucy4gc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgaXMgdGhlIGhldXJpc3RpYyBmb3IgXCJvbmUgb2Ygb3VyIG93biBzdG9yYWdlIHNlcnZlcnNcIjogdGhlaXIgaW5kZXgtYmFja2VkIGxpc3RpbmdzIGFyZSBjaGVhcCwgc28gaG91cmx5IGlzIGZpbmUuIEV2ZXJ5dGhpbmcgZWxzZSAoYmFja2JsYXplLCBwbGFpbiBkaXNrKSBwYXlzIHRoZSBmdWxsIGxpc3RpbmcgY29zdCwgc28gaXQgcmVzY2FucyBtdWNoIGxlc3Mgb2Z0ZW4uXG5jb25zdCBGVUxMX1JFU0NBTl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuY29uc3QgRlVMTF9SRVNDQU5fVU5JTkRFWEVEX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiA2O1xuLy8gT24gYSByZXF1ZXN0IGZvciBhIGZpbGUgdGhlIGluZGV4IGRvZXNuJ3Qga25vdywgY2hhbmdlcy1hZnRlciBzb3VyY2VzIGFyZSByZS1wb2xsZWQsIGF0IG1vc3QgdGhpcyBvZnRlblxuY29uc3QgTUlTU19DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA1O1xuLy8gQ2hhbmdlIHBvbGxzIHJlLXJlcXVlc3QgdGhpcyBtdWNoIG92ZXJsYXAsIHNvIGNsb2NrIHNrZXcgYmV0d2VlbiB1cyBhbmQgYSBzb3VyY2UgY2FuJ3QgZHJvcCBjaGFuZ2VzXG5jb25zdCBDSEFOR0VTX1BPTExfT1ZFUkxBUCA9IHRpbWVJbk1pbnV0ZTtcbmNvbnN0IFNDQU5fUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG4vLyBEZWxldGVzIGFyZSB0b21ic3RvbmVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpcyB3aGF0IGxldHMgYSBkZWxldGlvbiBwcm9wYWdhdGUvcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLCBhbmQgaXQgZXhwaXJlcyBhZnRlciB0aGlzIGxvbmdcbmNvbnN0IFRPTUJTVE9ORV9FWFBJUlkgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogNztcbmNvbnN0IFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBXaGlsZSBhIG1ldGFkYXRhIHNjYW4gb3IgZnVsbCBzeW5jIGlzIHJ1bm5pbmcsIGl0cyBwcm9ncmVzcyBpcyBsb2dnZWQgdGhpcyBvZnRlblxuY29uc3QgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDAwICogNjA7XG5jb25zdCBESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gRnVsbCBzeW5jcyBkb3dubG9hZCB0aGlzIG1hbnkgZmlsZXMgY29uY3VycmVudGx5IChoaWdoLWxhdGVuY3kgc291cmNlcyBsaWtlIGJhY2tibGF6ZSB3b3VsZCBvdGhlcndpc2UgY3Jhd2wgb25lIHJvdW5kLXRyaXAgYXQgYSB0aW1lKVxuY29uc3QgRlVMTF9TWU5DX1BBUkFMTEVMID0gODtcbi8vIEEgZnVsbCBzeW5jIHJ1bm5pbmcgbG9uZ2VyIHRoYW4gdGhpcyBpcyBjb25zb2xlLmVycm9yZWQgKGFuZCBhZ2FpbiBldmVyeSBpbnRlcnZhbCBhZnRlciksIHNvIGEgc3luYyB0aGF0IHdpbGwgdGFrZSBkYXlzIGlzIGxvdWQgaW5zdGVhZCBvZiBhIHF1aWV0IGNvbnNvbGUubG9nIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIEEgcmVjb25jaWxlIHBhc3Mgc2tpcHMgZmFpbGluZyBmaWxlcyAob25lIGJhZCB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0KSwgYnV0IHRoaXMgbWFueSBmYWlsdXJlcyBpbiBhIHJvdyBtZWFucyB0aGUgdGFyZ2V0IGl0c2VsZiBpcyBkb3duLCBzbyB0aGUgcGFzcyBhYm9ydHMgdW50aWwgdGhlIG5leHQgc2NhbiBjeWNsZVxuY29uc3QgUkVDT05DSUxFX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUyA9IDU7XG5jb25zdCBSRUNPTkNJTEVfRVJST1JfTE9HX0xJTUlUID0gMztcblxuZXhwb3J0IHR5cGUgV3JpdGVDb25maWcgPSB7XG4gICAgLy8gUmVzb2x2ZSBvbmNlIHRoZSB3cml0ZSBpcyBpbiBtZW1vcnk7IGZsdXNoIHRvIHRoZSBzb3VyY2VzIGFmdGVyIHdyaXRlRGVsYXksIGNvYWxlc2Npbmcgd3JpdGVzIHRvIHRoZSBzYW1lIGtleSAob25seSB0aGUgbGF0ZXN0IGlzIHdyaXR0ZW4pLiBEYXRhIGlzIGxvc3QgaWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBmaXJzdC5cbiAgICBmYXN0PzogYm9vbGVhbjtcbiAgICB3cml0ZURlbGF5PzogbnVtYmVyO1xuICAgIC8vIFN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGlzIGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gT2xkZXIgdGhhbiB0aGUgY3VycmVudCBmaWxlJ3MgdGltZSBuby1vcHM7IG1vcmUgdGhhbiAxNSBtaW51dGVzIGluIHRoZSBmdXR1cmUgdGhyb3dzLiBTZWUgSUFyY2hpdmVzLnNldC5cbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG59O1xuXG4vLyBXaGF0IHRoZSBzdG9yYWdlIHNlcnZlciBuZWVkcyBmcm9tIGEgYnVja2V0J3Mgc3RvcmUuIEJsb2JTdG9yZSBpbXBsZW1lbnRzIGl0IGZ1bGx5OyBBcmNoaXZlc0Rpc2sgYWxzbyBzYXRpc2ZpZXMgaXQgKHVzZWQgZGlyZWN0bHkgZm9yIHJhd0Rpc2sgYnVja2V0cyksIG1pbnVzIHRoZSBvcHRpb25hbCBpbmRleC1iYWNrZWQgbWV0aG9kcy5cbmV4cG9ydCB0eXBlIElCdWNrZXRTdG9yZSA9IHtcbiAgICBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+O1xuICAgIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPjtcbiAgICBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogV3JpdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+O1xuICAgIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+O1xuICAgIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICBnZXRTeW5jU3RhdHVzPygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz47XG4gICAgZ2V0U3luY1Byb2dyZXNzPygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgIHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdO1xuICAgIH07XG4gICAgY29tcHV0ZUluZGV4VG90YWxzPygpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0+O1xuICAgIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD47XG4gICAgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxudHlwZSBPdmVybGF5RW50cnkgPSB7XG4gICAgLy8gQSB6ZXJvLWxlbmd0aCBidWZmZXIgaXMgYSBwZW5kaW5nIGRlbGV0ZSAodG9tYnN0b25lKVxuICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB0OiBudW1iZXI7XG4gICAgZmx1c2hBdDogbnVtYmVyO1xufTtcblxuLy8gT25lIHJvdyBvZiB0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCAoa2V5IGlzIHRoZSBmaWxlIHBhdGgpXG50eXBlIEJsb2JJbmRleEVudHJ5ID0ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG50eXBlIEluZGV4RW50cnkgPSB7XG4gICAgd3JpdGVUaW1lOiBudW1iZXI7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkIGFzIGNoYW5nZXNcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbiAgICAvLyBJbi1tZW1vcnkgb25seSAobm90IHBlcnNpc3RlZCk6IHdoZW4gdGhlIGZpbGUgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVIGV2aWN0aW9uLiBTdGFydHMgYXMgY2hhbmdlZEF0IG9uIGxvYWQuXG4gICAgbGFzdEFjY2VzczogbnVtYmVyO1xufTtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlcjIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgbGFzdE1pc3NDaGVjazogbnVtYmVyO1xuICAgIC8vIFBlci1zbG90IHN0b3AgdG9rZW46IGEgcmVtb3ZlZCBzb3VyY2UncyBsb29wcyBzdG9wIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0b3JlXG4gICAgc3RvcHBlZDogeyBzdG9wOiBib29sZWFuIH07XG4gICAgLy8gQSByZW1vdmVkIHNvdXJjZSdzIHNsb3Qgc3RheXMgaW4gdGhlIGFycmF5cyAodGhleSBhcmUgbmV2ZXIgc3BsaWNlZCwgc28gc2xvdCBudW1iZXJzIGhlbGQgYnkgcnVubmluZyBsb29wcyBzdGF5IG1lYW5pbmdmdWwpLCBtYXJrZWQgZGVhZCAtIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuIEluZGV4IGVudHJpZXMgZG9uJ3QgcmVmZXJlbmNlIHNsb3RzIGF0IGFsbDsgdGhleSBwZXJzaXN0IHRoZSBzb3VyY2VzIGxpc3QncyBzb3VyY2VzTGlzdEluZGV4LlxuICAgIGRlYWQ/OiBib29sZWFuO1xufTtcblxuLy8gT25lIHNvdXJjZSBvZiBhIGxpdmUgc291cmNlLWxpc3QgdXBkYXRlOyBzZWUgQmxvYlN0b3JlLnVwZGF0ZVNvdXJjZXNcbmV4cG9ydCB0eXBlIEJsb2JTb3VyY2VTcGVjID0ge1xuICAgIC8vIE1hdGNoZWQgYWdhaW5zdCBBcmNoaXZlc1NvdXJjZS5pZGVudGl0eSAoXCJkaXNrXCIgZm9yIHRoZSBiYXNlIHNsb3QpOyBlcXVhbCBpZGVudGl0aWVzIHBhaXIgb2ZmIGluIG9yZGVyXG4gICAgaWRlbnRpdHk6IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UudXJsXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIG5vRnVsbFN5bmM/OiBib29sZWFuO1xuICAgIC8vIE9ubHkgY2FsbGVkIGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYW4gZXhpc3RpbmcgbGl2ZSBzbG90XG4gICAgY3JlYXRlOiAoKSA9PiBJQXJjaGl2ZXM7XG59O1xuXG4vLyBXaGF0IGEgc2Nhbm5lZCBsaXN0aW5nIGVudHJ5IG1lYW50IHdoZW4gY29tcGFyZWQgYWdhaW5zdCBvdXIgaW5kZXhcbnR5cGUgU2Nhbk91dGNvbWUgPSBcImZpbHRlcmVkXCIgfCBcIm5ld1wiIHwgXCJ1cGRhdGVkXCIgfCBcInRvbWJzdG9uZVwiIHwgXCJ1bmNoYW5nZWRcIjtcbnR5cGUgU2NhblRhbGx5ID0gUmVjb3JkPFNjYW5PdXRjb21lLCBudW1iZXI+O1xuZnVuY3Rpb24gbmV3U2NhblRhbGx5KCk6IFNjYW5UYWxseSB7XG4gICAgcmV0dXJuIHsgZmlsdGVyZWQ6IDAsIG5ldzogMCwgdXBkYXRlZDogMCwgdG9tYnN0b25lOiAwLCB1bmNoYW5nZWQ6IDAgfTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFNjYW5UYWxseSh0YWxseTogU2NhblRhbGx5LCB0b3RhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBsZXQgcGN0ID0gKG46IG51bWJlcikgPT4gYCR7TWF0aC5yb3VuZChuIC8gTWF0aC5tYXgodG90YWwsIDEpICogMTAwMCkgLyAxMH0lYDtcbiAgICByZXR1cm4gYCR7dGFsbHkubmV3fSBuZXcgcGF0aHMgKCR7cGN0KHRhbGx5Lm5ldyl9KSwgJHt0YWxseS51cGRhdGVkfSBuZXdlciB3cml0ZXMgKCR7cGN0KHRhbGx5LnVwZGF0ZWQpfSksICR7dGFsbHkudG9tYnN0b25lfSBkZWxldGlvbnMgKCR7cGN0KHRhbGx5LnRvbWJzdG9uZSl9KSwgJHt0YWxseS51bmNoYW5nZWR9IHVuY2hhbmdlZCAoJHtwY3QodGFsbHkudW5jaGFuZ2VkKX0pLCAke3RhbGx5LmZpbHRlcmVkfSBvdXRzaWRlIHdpbmRvdy9yb3V0ZSAoJHtwY3QodGFsbHkuZmlsdGVyZWQpfSlgO1xufVxuXG5mdW5jdGlvbiBuZXdTb3VyY2VTdGF0ZSgpOiBTb3VyY2VTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FubmVkQ291bnQ6IDAsXG4gICAgICAgIGNoYW5nZXNBZnRlclRpbWU6IDAsXG4gICAgICAgIGxhc3RNaXNzQ2hlY2s6IDAsXG4gICAgICAgIHN0b3BwZWQ6IHsgc3RvcDogZmFsc2UgfSxcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQmxvYlN0b3JlIGltcGxlbWVudHMgSUJ1Y2tldFN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBmb2xkZXI6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdLFxuICAgICAgICBwcml2YXRlIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhIGtleSdzIGluZGV4IGVudHJ5IGNoYW5nZXMgKG91ciBvd24gd3JpdGVzIEFORCBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBMUlUtYm91bmQgdGhlIGRpc2sgKGJhc2Ugc291cmNlKSB0byB0aGlzIG1hbnkgYnl0ZXM7IHNlZSBDb21tb25Db25maWcucmVhZGVyRGlza0xpbWl0XG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgICAgICAvLyBFdmVyeSBhY2NlcHRlZCB3cml0ZSAoXCJvcmlnaW5hbFwiKSBhbmQgZXZlcnkgd3JpdGUgdGhhdCBhY3R1YWxseSByZWFjaGVkIHRoZSBzb3VyY2VzIChcImZsdXNoZWRcIikuIEZhc3Qgd3JpdGVzIGNvYWxlc2NlLCBzbyB0aGUgdHdvIGNvdW50cyBkaWZmZXIuXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZD86IChraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkgeyB9XG5cbiAgICBwcml2YXRlIHN0b3BwZWQgPSB7IHN0b3A6IGZhbHNlIH07XG5cbiAgICAvLyBUaGUgaW5kZXgncyBCdWxrRGF0YWJhc2UyIGZpbGVzIGxpdmUgdW5kZXIgPGZvbGRlcj4vaW5kZXguIFwiYmxvYkluZGV4MlwiOiB0aGUgXCJibG9iSW5kZXhcIiBnZW5lcmF0aW9uIHBlcnNpc3RlZCBzb3VyY2VzLWFycmF5IHBvc2l0aW9ucyBhcyB0aGUgaG9sZGluZyBzb3VyY2UsIHdoaWNoIGFyZSBub3Qgc3RhYmxlIGFjcm9zcyBydW5zIC0gaXRzIGVudHJpZXMgYXJlIHVudXNhYmxlLCBzbyBpdCBpcyBzaW1wbHkgbmV2ZXIgcmVhZCBhZ2Fpbi5cbiAgICBwcml2YXRlIGluZGV4ID0gbmV3IEJ1bGtEYXRhYmFzZUJhc2U8QmxvYkluZGV4RW50cnk+KFwiYmxvYkluZGV4MlwiLCBub29wUmVhY3RpdmVEZXBzLCBhc3luYyAocDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBiYXNlOiBEaXJlY3RvcnlXcmFwcGVyID0gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcImluZGV4XCIpKTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICAgICAgaWYgKHBhcnQpIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcEhhbmRsZShiYXNlKTtcbiAgICB9KTtcbiAgICAvLyBUaGUgaW4tbWVtb3J5IGNvcHkgb2YgdGhlIGluZGV4LiBBbGwgcmVhZHMgYXJlIHNlcnZlZCBmcm9tIGl0OyBjaGFuZ2VzIGFyZSBidWZmZXJlZCBpbiBkaXJ0eSBhbmQgZmx1c2hlZCB0byB0aGUgQnVsa0RhdGFiYXNlMiBpbiBiYXRjaGVzICh1bmRlZmluZWQgPSBkZWxldGUpLlxuICAgIHByaXZhdGUgbWVtID0gbmV3IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+KCk7XG4gICAgLy8gTGl2ZSB0b3RhbHMgb3ZlciBtZW0gKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBhZGp1c3RlZCBvbiBldmVyeSBtdXRhdGlvbiBhbmQgcmVjb21wdXRlZCBvbiBsb2FkIC0gc28gYW55IGRyaWZ0IGhlYWxzIG9uIHJlc3RhcnQuIGNvbXB1dGVJbmRleFRvdGFscyBnaXZlcyB0aGUgd2Fsay10aGUtaW5kZXggdHJ1dGguXG4gICAgcHJpdmF0ZSBpbmRleEZpbGVDb3VudCA9IDA7XG4gICAgcHJpdmF0ZSBpbmRleEJ5dGVDb3VudCA9IDA7XG4gICAgLy8gVGhlIHNhbWUgdG90YWxzIHBlciBob2xkaW5nIHNvdXJjZSAoaW5kZXggMCA9IG91ciBkaXNrLCB3aGljaCByZWFkZXJEaXNrTGltaXQgYm91bmRzKVxuICAgIHByaXZhdGUgc291cmNlRmlsZUNvdW50cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gMCk7XG4gICAgcHJpdmF0ZSBzb3VyY2VCeXRlQ291bnRzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAwKTtcbiAgICAvLyBCYWNrZ3JvdW5kIHNjYW5zIC8gZnVsbCBzeW5jcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIHN5bmNBY3Rpdml0aWVzID0gbmV3IFNldDxTeW5jQWN0aXZpdHk+KCk7XG4gICAgcHJpdmF0ZSBkaXJ0eSA9IG5ldyBNYXA8c3RyaW5nLCBJbmRleEVudHJ5IHwgdW5kZWZpbmVkPigpO1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVybGF5RW50cnk+KCk7XG4gICAgcHJpdmF0ZSBzb3VyY2VTdGF0ZXMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+IG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgIHByaXZhdGUgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAvLyBUaGUgcGVyc2lzdGVudCBpZGVudGl0aWVzIGJlaGluZCBJbmRleEVudHJ5LnNvdXJjZXNMaXN0SW5kZXggKHNlZSBTb3VyY2VzTGlzdClcbiAgICBwcml2YXRlIHNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbih0aGlzLmZvbGRlciwgXCJpbmRleFwiLCBcInNvdXJjZXNMaXN0LnR4dFwiKSk7XG4gICAgLy8gUGVyIHNsb3Q6IHRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgdGhhdCBzbG90J3MgVVJMLCBmaWxsZWQgYnkgcmVnaXN0ZXJTbG90IGJlZm9yZSB0aGUgc2xvdCdzIHN5bmMgcnVuc1xuICAgIHByaXZhdGUgc2xvdFNvdXJjZXNMaXN0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHNsb3RSZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XSAmJiAhdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdLmRlYWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QgLSBvbmx5IHZhbGlkIG9uY2UgdGhlIHNsb3QncyByZWdpc3RyYXRpb24gcmVzb2x2ZWQgKGluaXQgYW5kIHJ1blNvdXJjZVN5bmMgZ3VhcmFudGVlIHRoYXQgYmVmb3JlIGFueSBpbmRleGluZyBoYXBwZW5zKVxuICAgIHByaXZhdGUgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90ICR7c2xvdH0gKCR7dGhpcy5zb3VyY2VzW3Nsb3RdPy51cmx9KSBoYXMgbm8gcmVnaXN0ZXJlZCBzb3VyY2VzTGlzdEluZGV4IHlldCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8vIFRoZSBsaXZlIHNsb3QgY3VycmVudGx5IHNlcnZpbmcgYSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNvbmZpZ3VyZWQgc291cmNlIGhhcyB0aGF0IFVSTCBhbnltb3JlLiBMaW5lYXIsIGJ1dCB0aGUgc291cmNlcyBsaXN0IGlzIHRpbnkgYW5kIHRoaXMgaXMgYWx3YXlzIGN1cnJlbnQgKHNsb3RzIGR5aW5nLCBvciBzZXZlcmFsIHNsb3RzIHNoYXJpbmcgb25lIFVSTCBhY3Jvc3MgdmFsaWQgd2luZG93cywgbmVlZCBubyBib29ra2VlcGluZykuXG4gICAgcHJpdmF0ZSBzbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tpXSA9PT0gc291cmNlc0xpc3RJbmRleCAmJiB0aGlzLmlzTGl2ZShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgSUFyY2hpdmVzIGN1cnJlbnRseSBob2xkaW5nIGFuIGVudHJ5J3MgYnl0ZXM6IHRoZSBsaXZlIHNsb3Qgd2hlbiB0aGUgaG9sZGVyIGlzIHN0aWxsIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSByZXNvbHZlZCAoY2FjaGVkKSBzdHJhaWdodCBmcm9tIGl0cyBwZXJzaXN0ZWQgVVJMIC0gd2luZG93cy9yb3V0ZXMgZGVjaWRlIHdoZW4gYSBzb3VyY2UgaXMgc2Nhbm5lZCBvciB3cml0dGVuLCBidXQgZm9yIHJlYWRpbmcgYnl0ZXMgd2Uga25vdyBpdCBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2hcbiAgICBwcml2YXRlIGFzeW5jIGdldEVudHJ5SG9sZGVyKGVudHJ5OiBJbmRleEVudHJ5KTogUHJvbWlzZTxJQXJjaGl2ZXMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpIHx8IGF3YWl0IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsUmVsb2FkaW5nKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5yZXNvbHZlU291cmNlVXJsPy4odXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclNsb3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5Tb3VyY2VTeW5jKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChGQVNUX0ZMVVNIX1BPTEwsICgpID0+IHRoaXMuZmx1c2hPdmVybGF5KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChJTkRFWF9GTFVTSF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5mbHVzaEluZGV4KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdCkge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIHNjYW5zL3BvbGxzIGFuZCBmbHVzaGVzIHBlbmRpbmcgd3JpdGVzLiBPbmx5IHVzZWQgd2hlbiB0aGUgc3RvcmUgZ2VudWluZWx5IGNhbm5vdCBjb250aW51ZSAocmF3RGlzayBmbGlwLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBzdGF0ZSBvZiB0aGlzLnNvdXJjZVN0YXRlcykge1xuICAgICAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoT3ZlcmxheSh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaEluZGV4KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBbd3JpdGVUaW1lcywgc2l6ZXMsIHNvdXJjZXNMaXN0SW5kZXhlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLmluZGV4LmdldENvbHVtbihcIndyaXRlVGltZVwiKSxcbiAgICAgICAgICAgIHRoaXMuaW5kZXguZ2V0Q29sdW1uKFwic2l6ZVwiKSxcbiAgICAgICAgICAgIHRoaXMuaW5kZXguZ2V0Q29sdW1uKFwic291cmNlc0xpc3RJbmRleFwiKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCBzaXplTWFwID0gbmV3IE1hcChzaXplcy5tYXAoeCA9PiBbeC5rZXksIHgudmFsdWVdKSk7XG4gICAgICAgIGxldCBzb3VyY2VzTGlzdEluZGV4TWFwID0gbmV3IE1hcChzb3VyY2VzTGlzdEluZGV4ZXMubWFwKHggPT4gW3gua2V5LCB4LnZhbHVlXSkpO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB3cml0ZVRpbWVzKSB7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHNpemVNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgICBsZXQgc291cmNlc0xpc3RJbmRleCA9IHNvdXJjZXNMaXN0SW5kZXhNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdCBjaGVja3MsIGFzIDAgaXMgYSB2YWxpZCBzaXplIGFuZCBhIHZhbGlkIHNvdXJjZXNMaXN0SW5kZXhcbiAgICAgICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQgfHwgc291cmNlc0xpc3RJbmRleCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgdXBkYXRlU2NhbkluZGV4KSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlXG4gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZ1bGw6IEluZGV4RW50cnkgPSB7IHdyaXRlVGltZTogZW50cnkudmFsdWUsIHNpemUsIHNvdXJjZXNMaXN0SW5kZXgsIGNoYW5nZWRBdDogZW50cnkudGltZSwgbGFzdEFjY2VzczogZW50cnkudGltZSB9O1xuICAgICAgICAgICAgdGhpcy5tZW0uc2V0KGVudHJ5LmtleSwgZnVsbCk7XG4gICAgICAgICAgICB0aGlzLmNvdW50RW50cnkoZnVsbCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvdW50RW50cnkoZW50cnk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQsIGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghZW50cnkgfHwgZW50cnkuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4RmlsZUNvdW50ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5pbmRleEJ5dGVDb3VudCArPSBlbnRyeS5zaXplICogZGlyZWN0aW9uO1xuICAgICAgICAvLyBFbnRyaWVzIGNhbiByZWZlcmVuY2UgYSBzb3VyY2Ugbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgKHJlYWRhYmxlIHZpYSBnZXRFbnRyeUhvbGRlciwgYnV0IHdpdGggbm8gc2xvdCB0byBjb3VudCB1bmRlcilcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUZpbGVDb3VudHNbc2xvdF0gKz0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VCeXRlQ291bnRzW3Nsb3RdICs9IGVudHJ5LnNpemUgKiBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgICAgIGxldCBmdWxsOiBJbmRleEVudHJ5ID0geyAuLi5lbnRyeSwgY2hhbmdlZEF0OiBEYXRlLm5vdygpLCBsYXN0QWNjZXNzOiBEYXRlLm5vdygpIH07XG4gICAgICAgIHRoaXMuY291bnRFbnRyeSh0aGlzLm1lbS5nZXQoa2V5KSwgLTEpO1xuICAgICAgICB0aGlzLmNvdW50RW50cnkoZnVsbCwgMSk7XG4gICAgICAgIHRoaXMubWVtLnNldChrZXksIGZ1bGwpO1xuICAgICAgICB0aGlzLmRpcnR5LnNldChrZXksIGZ1bGwpO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgIH1cbiAgICBwcml2YXRlIGRlbGV0ZUluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb3VudEVudHJ5KGV4aXN0aW5nLCAtMSk7XG4gICAgICAgIHRoaXMubWVtLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLmRpcnR5LnNldChrZXksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqIEFwcGxpZXMgYSBjb25maWcgY2hhbmdlIHRvIHRoZSBSVU5OSU5HIHN0b3JlOiB3aW5kb3dzL3JvdXRlcyB1cGRhdGUgaW4gcGxhY2UsIG5ldyBzb3VyY2VzIGFyZSBhZGRlZCAodGhlaXIgc3luYyBzdGFydHMgaW1tZWRpYXRlbHkpLCBhbmQgcmVtb3ZlZCBzb3VyY2VzJyBzbG90cyBnbyBkZWFkICh0aGVpciBzY2FucyBzdG9wLCB0aGVpciBpbmRleCBlbnRyaWVzIGRyb3ApLiBUaGUgc3RvcmUgc3Vydml2ZXMgZXZlcnkgcm91dGluZSBjb25maWcgZXZvbHV0aW9uIC0gaXQgaXMgbmV2ZXIgZGVzdHJveWVkIGZvciBhIHNvdXJjZS1saXN0IGNoYW5nZSwgb25seSBmb3Igc3RydWN0dXJhbCBmbGlwcyBpdCBjYW5ub3QgZXhwcmVzcyAocmF3RGlzaykuIFBlbmRpbmcgZmFzdCB3cml0ZXMgYXJlIHJlLWNhcHBlZCB0byB0aGUgbmV3IGZsdXNoIGRlYWRsaW5lIChmbHVzaGluZyBpbW1lZGlhdGVseSB3aGVuIGl0IGhhcyBhbHJlYWR5IHBhc3NlZCkuICovXG4gICAgcHVibGljIHVwZGF0ZVNvdXJjZXMoc3BlY3M6IEJsb2JTb3VyY2VTcGVjW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzcGVjcy5sZW5ndGggfHwgc3BlY3NbMF0uaWRlbnRpdHkgIT09IFwiZGlza1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZVNvdXJjZXMgZXhwZWN0cyB0aGUgZGlzayBzb3VyY2UgZmlyc3QgKGlkZW50aXR5IFwiZGlza1wiKSwgZ290ICR7SlNPTi5zdHJpbmdpZnkoc3BlY3MubWFwKHggPT4geC5pZGVudGl0eSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvdyA9IChpOiBudW1iZXIsIHdpbmRvdzogW251bWJlciwgbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9sZCA9IHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvdztcbiAgICAgICAgICAgIGlmIChvbGRbMF0gPT09IHdpbmRvd1swXSAmJiBvbGRbMV0gPT09IHdpbmRvd1sxXSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFZhbGlkIHdpbmRvdyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IFske29sZC5qb2luKFwiLCBcIil9XSAtPiBbJHt3aW5kb3cuam9pbihcIiwgXCIpfV1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgfTtcbiAgICAgICAgc2V0V2luZG93KDAsIHNwZWNzWzBdLnZhbGlkV2luZG93KTtcbiAgICAgICAgLy8gTGl2ZSBzbG90cyBwYWlyIHdpdGggc3BlY3MgYnkgaWRlbnRpdHksIGluIG9yZGVyICh0aGUgc2FtZSBlbmRwb2ludCBjYW4gYXBwZWFyIHNldmVyYWwgdGltZXMsIGUuZy4gb25lIGVudHJ5IHBlciB3aW5kb3cpXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRkKHNsb3QpO1xuICAgICAgICAgICAgICAgIHNldFdpbmRvdyhzbG90LCBzcGVjLnZhbGlkV2luZG93KTtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnNvdXJjZXNbc2xvdF07XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnJvdXRlKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRlIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnJvdXRlKX0gLT4gJHtKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcucm91dGUgPSBzcGVjLnJvdXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdGluZy5ub0Z1bGxTeW5jID0gc3BlYy5ub0Z1bGxTeW5jO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNwZWMuY3JlYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBzcGVjLnVybCwgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csIHJvdXRlOiBzcGVjLnJvdXRlLCBub0Z1bGxTeW5jOiBzcGVjLm5vRnVsbFN5bmMsIGlkZW50aXR5OiBzcGVjLmlkZW50aXR5IH0pO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VTdGF0ZXMucHVzaChuZXdTb3VyY2VTdGF0ZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlRmlsZUNvdW50cy5wdXNoKDApO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VCeXRlQ291bnRzLnB1c2goMCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRkZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnJ1blNvdXJjZVN5bmModGhpcy5zb3VyY2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSB8fCBtYXRjaGVkLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZShpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVhZGxpbmUgPSB0aGlzLnNvdXJjZXNbMF0udmFsaWRXaW5kb3dbMV0gLSBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbiAgICAgICAgbGV0IHJlY2FwcGVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5vdmVybGF5LnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuZmx1c2hBdCA8PSBkZWFkbGluZSkgY29udGludWU7XG4gICAgICAgICAgICBlbnRyeS5mbHVzaEF0ID0gZGVhZGxpbmU7XG4gICAgICAgICAgICByZWNhcHBlZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNhcHBlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlLWNhcHBlZCAke3JlY2FwcGVkfSBwZW5kaW5nIGZhc3Qgd3JpdGVzIHRvIHRoZSBuZXcgZmx1c2ggZGVhZGxpbmUgJHtuZXcgRGF0ZShkZWFkbGluZSkudG9JU09TdHJpbmcoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgaWYgKGRlYWRsaW5lIDw9IERhdGUubm93KCkpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuZmx1c2hPdmVybGF5KCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBGbHVzaGluZyBmYXN0IHdyaXRlcyBhZnRlciBhIHZhbGlkIHdpbmRvdyBjaGFuZ2UgZmFpbGVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBzbG90IHN0YXlzIGluIHRoZSBhcnJheXMgZm9yZXZlciAoaW5kZXggZW50cmllcyByZWZlcmVuY2Ugc291cmNlcyBieSBzbG90IG51bWJlcik7IGl0IGp1c3QgZ29lcyBkZWFkIC0gbG9vcHMgc3RvcCwgYW5kIGl0cyBpbmRleCBlbnRyaWVzIGRyb3AgKG90aGVyIHNvdXJjZXMnIHNjYW5zIHJlLWZpbmQgYW55IGNvcHkgdGhhdCdzIHN0aWxsIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBuZXcgY29uZmlnKVxuICAgIHByaXZhdGUgcmVtb3ZlU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XS5zb3VyY2U7XG4gICAgICAgIHN0YXRlLmRlYWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGxldCBzb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gVGhlIHNhbWUgVVJMIGNhbiBiZSBhbm90aGVyIGxpdmUgc2xvdCAob25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cpIC0gdGhlIGVuZHBvaW50IGlzIHN0aWxsIGNvbmZpZ3VyZWQsIHNvIGl0cyBlbnRyaWVzIHN0YXlcbiAgICAgICAgaWYgKHNvdXJjZXNMaXN0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBzb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBkcm9wcGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIGFuZCAke2Ryb3BwZWR9IGluZGV4IGVudHJpZXMgaXQgaGVsZCB3ZXJlIGRyb3BwZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIChpdHMgVVJMIGlzIHN0aWxsIHNlcnZlZCBieSBhbm90aGVyIHNsb3QsIHNvIGl0cyBpbmRleCBlbnRyaWVzIHN0YXkpYCk7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2NhblNvdXJjZSgwKTtcbiAgICB9XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcyk6IGp1c3QgaXRzIGNoYW5nZXMgc2luY2UgdGhlIGJvdW5kYXJ5IG5laWdoYm9yaG9vZCwgd2l0aCBtYXRjaGluZyB2YWx1ZXMgcHVsbGVkIG9udG8gb3VyIG93biBkaXNrLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGFydGluZzogY2hhbmdlcyBzaW5jZSAke25ldyBEYXRlKGNvbmZpZy5zaW5jZSkudG9JU09TdHJpbmcoKX0sIHJvdXRlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBjb25maWcuc2luY2UsIHJvdXRlczogY29uZmlnLnJvdXRlICYmIFtjb25maWcucm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkuZmlsdGVyZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvdmVybGF5RW50cnkgPSB0aGlzLm92ZXJsYXkuZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLm1lbS5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IG92ZXJsYXlFbnRyeSAmJiBvdmVybGF5RW50cnkudCB8fCBlbnRyeSAmJiBlbnRyeS53cml0ZVRpbWUgfHwgMDtcbiAgICAgICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBBIHRvbWJzdG9uZSBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSBpbmRleCBlbnRyeSBhbG9uZSByZWNvcmRzIGl0XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogMCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHNvdXJjZS5nZXQyKGZpbGUucGF0aCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IDAsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICB0YWxseS50b21ic3RvbmUrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGZpbGUucGF0aCwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoZW50cnkgfHwgb3ZlcmxheUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudXBkYXRlZCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWxseS5uZXcrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmluaXNoZWQgaW4gJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc2NhblN0YXJ0KSAvIDEwMDApfXMgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtjaGFuZ2VzLmxlbmd0aH0gY2hhbmdlczogJHtmb3JtYXRTY2FuVGFsbHkodGFsbHksIGNoYW5nZXMubGVuZ3RoKX1gKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGNoZWFwIGFsd2F5cy1jdXJyZW50IHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRoaXMuaW5kZXhGaWxlQ291bnQsIGJ5dGVDb3VudDogdGhpcy5pbmRleEJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIGZpbGVDb3VudDogdGhpcy5zb3VyY2VGaWxlQ291bnRzW2ldLFxuICAgICAgICAgICAgICAgIGJ5dGVDb3VudDogdGhpcy5zb3VyY2VCeXRlQ291bnRzW2ldLFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiB0aGlzLmNvbmZpZz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogWy4uLnRoaXMuc3luY0FjdGl2aXRpZXNdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBXYWxrcyB0aGUgd2hvbGUgaW5kZXggZm9yIGV4YWN0IHRvdGFscyAtIG1vcmUgZXhwZW5zaXZlIHRoYW4gZ2V0U3luY1Byb2dyZXNzLCBidXQgaW1tdW5lIHRvIGFueSBkcmlmdCBpbiB0aGUgbWFpbnRhaW5lZCBjb3VudGVycyAoYW5kIGxvYWRzIHRoZSBpbmRleCBmaXJzdCwgc28gaXQncyBuZXZlciBjb2xkIHplcm9zKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgc291cmNlcyA9IHRoaXMuc291cmNlcy5tYXAoeCA9PiAoeyBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLCBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMubWVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgc291cmNlc1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc291cmNlczogc291cmNlcy5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpcnR5LnNpemUpIHJldHVybjtcbiAgICAgICAgbGV0IGRpcnR5ID0gdGhpcy5kaXJ0eTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHdyaXRlczogQmxvYkluZGV4RW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgZGVsZXRlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIGRpcnR5KSB7XG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB3cml0ZXMucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3cml0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LndyaXRlQmF0Y2god3JpdGVzKTtcbiAgICAgICAgaWYgKGRlbGV0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LmRlbGV0ZUJhdGNoKGRlbGV0ZXMpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBzeW5jaHJvbml6YXRpb24g4pSA4pSAXG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blNvdXJjZVN5bmMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAvLyBSZWFkIGxpdmUgZm9yIGV2ZXJ5IHBhc3MsIG5vdCBjYXB0dXJlZCAtIHVwZGF0ZVNvdXJjZXMgY2FuIGNoYW5nZSBpdCB3aGlsZSBsb29wcyBydW5cbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSAoKSA9PiB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdLm5vRnVsbFN5bmM7XG4gICAgICAgIGxldCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAoIXRoaXMuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHNvdXJjZS5nZXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciA9ICEhY29uZmlnLnN1cHBvcnRzQ2hhbmdlc0FmdGVyO1xuICAgICAgICAgICAgICAgIGxpc3RpbmcgPSBhd2FpdCB0aGlzLnNjYW5Tb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEluaXRpYWwgc2NhbiBvZiBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkLCByZXRyeWluZzpgLCBlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgaWYgKGxpc3RpbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCBsaXN0aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ29weWluZyBmaWxlcyBmcm9tIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6YCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoQ0hBTkdFU19QT0xMX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0sIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICAgICAgLy8gQ2hhbmdlIHBvbGxzIG9ubHkgc2hvdyB3aGF0IHRoZSBzb3VyY2UgSEFTLCBuZXZlciB3aGF0IGl0J3MgbWlzc2luZywgc28gcHVzaGVzIHJ1biBvbiB0aGUgZnVsbC1yZXNjYW4gY2FkZW5jZSAoZmluZEluZm8gb24gYW4gaW5kZXgtYmFja2VkIHNvdXJjZSBpcyBjaGVhcClcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChGVUxMX1JFU0NBTl9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleCwgbmV3IE1hcChmaWxlcy5tYXAoeCA9PiBbeC5wYXRoLCB4LmNyZWF0ZVRpbWVdKSkpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoRlVMTF9SRVNDQU5fVU5JTkRFWEVEX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc2NhbiA9IGF3YWl0IHRoaXMuc2NhblNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIHJlc2Nhbik7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0sIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRnVsbCBtZXRhZGF0YSBzY2FuIChzaXplLCB3cml0ZVRpbWUsIHBhdGgpIG9mIG9uZSBzb3VyY2UsIGFwcGxpZWQgdG8gdGhlIGluZGV4LiBSZXR1cm5zIHRoZSBzb3VyY2UncyBsaXN0aW5nIChwYXRoIC0+IHdyaXRlIHRpbWUpLCB3aGljaCByZWNvbmNpbGVTb3VyY2UgdXNlcyBmb3IgdGhlIHB1c2ggZGlyZWN0aW9uLlxuICAgIHByaXZhdGUgYXN5bmMgc2NhblNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3csIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHsgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiwgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHN0YXJ0VGltZTogc2NhblN0YXJ0IH07XG4gICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0YXJ0aW5nIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gc3RpbGwgcnVubmluZyAoJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc2NhblN0YXJ0KSAvIDEwMDApfXMsIHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9LCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgLy8gVGhlIGxpc3RpbmcgcmVxdWVzdCBkZWxpYmVyYXRlbHkgdGFrZXMgbm8gdGltZSBvciByb3V0ZSBmaWx0ZXJzOiBvdXIgc2xvd2VzdCBzb3VyY2VzIChiYWNrYmxhemUpIHN1cHBvcnQgbmVpdGhlciwgc28gZmlsdGVyaW5nIHdvdWxkIGhhcHBlbiBhZnRlciB0aGUgZnVsbCBmZXRjaCBhbnl3YXkgLSBsaXR0bGUgYmVuZWZpdCwgbW9yZSByb29tIGZvciBkZXN5bmNocm9uaXphdGlvbi4gQW5kIGlmIGEgZnVsbCBsaXN0aW5nIGV2ZXIgYmVjb21lcyB0b28gYmlnIHRvIHNlbmQgb3ZlciB0aGUgbmV0d29yaywgaXQgaXMgYWxzbyB0b28gYmlnIGZvciB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgdG8gaG9sZCBpbiBtZW1vcnkgLSB0aGUgZml4IGlzIG1vcmUgcm91dGluZyBzaGFyZHMgKGVhY2ggc3RvcmluZyBhbmQgc2VuZGluZyBsZXNzKSwgbm90IGZpbHRlcmluZy5cbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgc291cmNlLmZpbmRJbmZvKFwiXCIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCB3aGlsZSB0aGUgbGlzdGluZyB3YXMgaW4gZmxpZ2h0OyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm4gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgaW5kZXhTaXplQmVmb3JlID0gdGhpcy5tZW0uc2l6ZTtcbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgbGV0IG5ld1BhdGhzID0gMDtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgc2Vlbi5zZXQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1lbS5oYXMoZmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIG5ld1BhdGhzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICAvLyBJbmRleCBlbnRyaWVzIHRoaXMgc291cmNlIHdhcyB0aGUgaG9sZGVyIG9mLCBidXQgdGhhdCB2YW5pc2hlZCBmcm9tIGl0IChlLmcuIGRlbGV0ZWQgd2hpbGUgd2Ugd2VyZSBvZmZsaW5lKSwgY29tZSBvdXQgb2YgdGhlIGluZGV4LiBFbnRyaWVzIGNoYW5nZWQgYWZ0ZXIgdGhlIHNjYW4gc3RhcnRlZCBhcmUga2VwdCDigJQgdGhlIHNjYW4gbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBoYXZlIG5vIHBoeXNpY2FsIGZpbGUgZm9yIGEgbGlzdGluZyB0byB2b3VjaCBmb3IsIHNvIHRoZXkncmUgZXhlbXB0IChjbGVhbnVwVG9tYnN0b25lcyBleHBpcmVzIHRoZW0gaW5zdGVhZCkuXG4gICAgICAgIGxldCByZW1vdmVkRnJvbUluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1pc3NpbmdPblNvdXJjZSA9IDA7XG4gICAgICAgIGxldCBzY2FubmVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ICYmIGVudHJ5LnNpemUgIT09IDAgJiYgZW50cnkuY2hhbmdlZEF0IDwgc2NhblN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZEZyb21JbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ291bnRlZCBvbmx5IHdoZW4gdGhlIHNvdXJjZSBTSE9VTEQgaG9sZCB0aGUgZW50cnkgKGl0cyB3aW5kb3cvcm91dGUgbWF0Y2gpIC0gdGhlc2UgYXJlIHdoYXQgdGhlIHJlY29uY2lsZSBwYXNzIHB1c2hlcyB0byBpdFxuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDAgfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LndyaXRlVGltZSA8IHZhbGlkV2luZG93WzBdIHx8IGVudHJ5LndyaXRlVGltZSA+IHZhbGlkV2luZG93WzFdKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbWlzc2luZ09uU291cmNlKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGVyY2VudGFnZXMgYXJlIG9mIHRoZSB1bmlvbiBvZiBib3RoIHNpZGVzIChvdXIgaW5kZXggKyB0aGVpciBsaXN0aW5nKSwgc28gZXZlcnkgY291bnQgaGFzIGEgc3RhYmxlIGRlbm9taW5hdG9yXG4gICAgICAgIGxldCB1bmlvbiA9IGluZGV4U2l6ZUJlZm9yZSArIG5ld1BhdGhzO1xuICAgICAgICBsZXQgcGN0ID0gKG46IG51bWJlcikgPT4gYCR7TWF0aC5yb3VuZChuIC8gTWF0aC5tYXgodW5pb24sIDEpICogMTAwMCkgLyAxMH0lYDtcbiAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZpbmlzaGVkIGluICR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zIChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7ZmlsZXMubGVuZ3RofSBsaXN0ZWQgdnMgJHtpbmRleFNpemVCZWZvcmV9IGluZGV4ZWQgKHVuaW9uICR7dW5pb259KTogJHtmb3JtYXRTY2FuVGFsbHkodGFsbHksIHVuaW9uKX0sICR7bWlzc2luZ09uU291cmNlfSBpbiBpbmRleCBidXQgbWlzc2luZyBvbiBzb3VyY2UgKCR7cGN0KG1pc3NpbmdPblNvdXJjZSl9KSwgJHtyZW1vdmVkRnJvbUluZGV4fSByZW1vdmVkIGZyb20gaW5kZXggKCR7cGN0KHJlbW92ZWRGcm9tSW5kZXgpfSlgKTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgcmV0dXJuIHNlZW47XG4gICAgfVxuXG4gICAgLy8gVGhlIHB1c2ggZGlyZWN0aW9uIG9mIHN5bmNocm9uaXphdGlvbjogZXZlcnl0aGluZyB3ZSBrbm93IHRoYXQgdGhlIHNvdXJjZSBpcyBtaXNzaW5nIChvciBob2xkcyBhbiBvbGRlciBjb3B5IG9mKSBpcyB3cml0dGVuIHRvIGl0IOKAlCBpbmNsdWRpbmcgZGVsZXRpb25zLCBhcyB0b21ic3RvbmUgd3JpdGVzLiBUaGlzIGlzIHdoYXQgaGVhbHMgYSBzb3VyY2Ugd2hvc2UgYmFja2dyb3VuZCB3cml0ZXMgZmFpbGVkIChlLmcuIGl0IHdhcyBkb3duKTogdGhlIG5leHQgc2NhbiBzZWVzIHdoYXQncyBtaXNzaW5nIGFuZCByZS1zZW5kcyBpdC4gQSBmYWlsaW5nIGZpbGUgaXMgc2tpcHBlZCwgbm90IGZhdGFsIChpbW11dGFibGUgdGFyZ2V0cyBhcmUgaGFuZGxlZCBieSBmb3JjZVNldEltbXV0YWJsZSwgYW5kIG9uZSB1bnJlYWRhYmxlIHZhbHVlIG11c3Qgbm90IHN0b3AgdGhlIHJlc3Qgb2YgdGhlIHBhc3MpIC0gb25seSBhIHJ1biBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcyAodGhlIHNvdXJjZSBpdHNlbGYgaXMgZG93bikgYWJvcnRzIHVudGlsIHRoZSBuZXh0IHNjYW4gY3ljbGUuXG4gICAgcHJpdmF0ZSBhc3luYyByZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlciwgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHZhbGlkV2luZG93LCByb3V0ZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd0FjY2VwdHNXcml0ZXModmFsaWRXaW5kb3cpO1xuICAgICAgICBsZXQgdGFyZ2V0U291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBwdXNoZWQgPSAwO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgbGV0IGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSB0YXJnZXRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlcyAtIGl0IGlzIG9ubHkgZXZlciB3cml0dGVuIGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgYW5kIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2tcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gZW50cnkud3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBvbmx5IG5lZWRzIHB1c2hpbmcgd2hpbGUgdGhlIHNvdXJjZSBzdGlsbCBob2xkcyBhbiBvbGRlciBjb3B5XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5zZXQoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBlbnRyeS53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaG9sZGVyLmdldDIoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFJFQ09OQ0lMRV9FUlJPUl9MT0dfTElNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7a2V5fTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gUkVDT05DSUxFX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBwdXNoZWQgJHtwdXNoZWR9IGZpbGVzLCAke2ZhaWxlZH0gZmFpbGVkJHthYm9ydGVkICYmIGAgYmVmb3JlIGFib3J0aW5nIHRoZSBwYXNzICgke2NvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXMpYCB8fCBcIlwifS4gRmlyc3QgZXJyb3JzOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHB1c2hlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlY29uY2lsZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMgaXQgd2FzIG1pc3Npbmcgb3IgaGVsZCBvbGRlciBjb3BpZXMgb2ZgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB7IHZhbGlkV2luZG93LCByb3V0ZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGxldCBbd2luZG93U3RhcnQsIHdpbmRvd0VuZF0gPSB2YWxpZFdpbmRvdztcbiAgICAgICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPCB3aW5kb3dTdGFydCB8fCBmaWxlLmNyZWF0ZVRpbWUgPiB3aW5kb3dFbmQpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgICAgICAvLyBBIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZCdzIGxpc3RpbmcgaW5jbHVkZXMga2V5cyBvdXRzaWRlIG91ciByb3V0ZTsgaWdub3JlIHRoZW1cbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5tZW0uZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMgKHRpZXMga2VlcCB0aGUgZXhpc3RpbmcgZW50cnkpXG4gICAgICAgIGlmIChleGlzdGluZyAmJiBmaWxlLmNyZWF0ZVRpbWUgPD0gZXhpc3Rpbmcud3JpdGVUaW1lKSByZXR1cm4gXCJ1bmNoYW5nZWRcIjtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSByZXR1cm4gXCJ0b21ic3RvbmVcIjtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gXCJ1cGRhdGVkXCI7XG4gICAgICAgIHJldHVybiBcIm5ld1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcG9sbENoYW5nZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwb2xsU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogc3RhdGUuY2hhbmdlc0FmdGVyVGltZSwgcm91dGVzOiByb3V0ZSAmJiBbcm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGFsbHlbdGhpcy51cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvbGxzIHJ1biBjb25zdGFudGx5LCBzbyBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgaW5kZXggZ2V0IGEgbGluZVxuICAgICAgICBpZiAodGFsbHkubmV3IHx8IHRhbGx5LnVwZGF0ZWQgfHwgdGFsbHkudG9tYnN0b25lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlcyBwb2xsIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke2NoYW5nZXMubGVuZ3RofSBjaGFuZ2VzOiAke2Zvcm1hdFNjYW5UYWxseSh0YWxseSwgY2hhbmdlcy5sZW5ndGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCArPSBjaGFuZ2VzLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IHBvbGxTdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkcyB0aGUgZmlsZXMgYSBzb3VyY2UgY3VycmVudGx5IGhvbGRzIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCBwcmVzZXJ2aW5nIHRoZWlyIG1vZGlmaWVkIHRpbWVzIOKAlCBzbyBhIG5ld2VyIGxvY2FsIHdyaXRlIGFsd2F5cyB3aW5zLiBTa2lwcGVkIGZvciBub0Z1bGxTeW5jIHNvdXJjZXMgKGZyb250aW5nIGEgbGFyZ2UgZGF0YWJhc2Ugd2l0aG91dCBjb3B5aW5nIGl0KTsgcmVhZHMgc3RpbGwgZG93bi1jYWNoZSBsYXppbHkuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybjtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGNvcGllZFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgcGVuZGluZy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJmdWxsU3luY1wiLFxuICAgICAgICAgICAgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBkb25lRmlsZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIGRvbmVCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwobG9nUHJvZ3Jlc3MsIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgc2xvd0Vycm9yVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWU7XG4gICAgICAgICAgICBsZXQgZG9uZUZpbGVzID0gYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgZG9uZUJ5dGVzID0gYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgYnl0ZXNQZXJTZWNvbmQgPSBkb25lQnl0ZXMgLyAoZWxhcHNlZCAvIDEwMDApO1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZ0J5dGVzID0gdG90YWxCeXRlcyAtIGRvbmVCeXRlcztcbiAgICAgICAgICAgIGxldCBldGFUZXh0ID0gXCJ1bmtub3duIChubyBieXRlcyB0cmFuc2ZlcnJlZCB5ZXQpXCI7XG4gICAgICAgICAgICBpZiAoYnl0ZXNQZXJTZWNvbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ01zID0gcmVtYWluaW5nQnl0ZXMgLyBieXRlc1BlclNlY29uZCAqIDEwMDA7XG4gICAgICAgICAgICAgICAgZXRhVGV4dCA9IGAke2Zvcm1hdFRpbWUocmVtYWluaW5nTXMpfSByZW1haW5pbmcsIGNvbXBsZXRpbmcgYXJvdW5kICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIHJlbWFpbmluZ01zKS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBoYXMgYmVlbiBydW5uaW5nIGZvciAke2Zvcm1hdFRpbWUoZWxhcHNlZCl9OiAke2RvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KGRvbmVGaWxlcyAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihkb25lQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiBkb25lQnl0ZXMgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYnl0ZXNQZXJTZWNvbmQpfUIvcy4gRXN0aW1hdGVkICR7ZXRhVGV4dH0uYCk7XG4gICAgICAgIH0sIEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMKTtcbiAgICAgICAgKHNsb3dFcnJvclRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNvcHlXb3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFmYWlsZWQgJiYgIXRoaXMuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbmV4dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBrZXksIGVudHJ5IH0gPSBwZW5kaW5nW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHNvdXJjZS5nZXQyKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG1vdmUgdGhlIGVudHJ5J3Mgc291cmNlIGlmIGl0IHdhc24ndCBjaGFuZ2VkIHdoaWxlIHdlIGNvcGllZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVtLmdldChrZXkpID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lRmlsZXMgPSAoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUJ5dGVzID0gKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSArIGVudHJ5LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB3b3JrZXJzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oRlVMTF9TWU5DX1BBUkFMTEVMLCBwZW5kaW5nLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgICAgIHdvcmtlcnMucHVzaChjb3B5V29ya2VyKCkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIG90aGVyIHdvcmtlcnMgcHVsbGluZyBuZXcgZmlsZXMsIHRoZW4gc3VyZmFjZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgICAgIC8vIEEgc3luYyBzbG93IGVub3VnaCB0byBoYXZlIGxvZ2dlZCBwcm9ncmVzcyBhbHNvIGxvZ3MgaXRzIGNvbXBsZXRpb25cbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0xvZ2dlZCkge1xuICAgICAgICAgICAgICAgIGxvZ1Byb2dyZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaW5kSW5mbyBhbmQgZ2V0Q2hhbmdlc0FmdGVyMiBsaXN0IGZyb20gdGhlIGluZGV4LCBzbyB0aGV5IG11c3Qgd2FpdCBmb3Igb3VyIG93biBiYXNlIHNvdXJjZSdzIGluaXRpYWwgc2NhbiAod2hpY2ggbWlnaHQgbGFnIG1pbnV0ZXMpIGJlZm9yZSB0aGUgbGlzdGluZyBpcyB0cnVzdHdvcnRoeS4gVGhlIGJhc2UgKGxvY2FsIGRpc2spIGlzIGltcGxpY2l0bHkgcmVxdWlyZWQgLSByZW1vdGUgc291cmNlcyBhcmUgbm90LCB0aGV5IGNvbWUgYW5kIGdvLlxuICAgIHByaXZhdGUgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlU3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQSByZXF1ZXN0ZWQgZmlsZSBpc24ndCBpbiB0aGUgaW5kZXg6IG91ciBvd24gYmFzZSBzb3VyY2UgKGltcGxpY2l0bHkgcmVxdWlyZWQpIGlzIGNoZWNrZWQgZGlyZWN0bHkgaWYgaXRzIGluaXRpYWwgc2NhbiBoYXNuJ3QgZmluaXNoZWQsIGFuZCBjaGFuZ2VzLWFmdGVyIHNvdXJjZXMgYXJlIHJlLXBvbGxlZCAoYXQgbW9zdCBldmVyeSA1IHNlY29uZHMpXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja01pc3NpbmdLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tpXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmICFzdGF0ZS5zY2FuQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IHNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY2FuSW5kZXgoaSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyICYmIERhdGUubm93KCkgLSBzdGF0ZS5sYXN0TWlzc0NoZWNrID4gTUlTU19DSEVDS19JTlRFUlZBTCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RNaXNzQ2hlY2sgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucG9sbENoYW5nZXMoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEluZGV4RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gQW4gZW50cnkgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGxpc3QgaXMgc3RpbGwgdmFsaWQgLSBnZXRFbnRyeUhvbGRlciByZXNvbHZlcyB0aGUgcGVyc2lzdGVkIFVSTCBkaXJlY3RseSAoYW5kIGdldDIncyBmYWxsYmFjayBsb29wIGNvdmVycyBhIGhvbGRlciB0aGF0IGlzIGdvbmUgZW50aXJlbHkpXG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWVtLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja01pc3NpbmdLZXkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBkYXRhIG9wZXJhdGlvbnMg4pSA4pSAXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGtleSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoa2V5OiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG92ZXJsYXlFbnRyeSkge1xuICAgICAgICAgICAgLy8gQW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSAodG9tYnN0b25lKVxuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gb3ZlcmxheUVudHJ5LmRhdGE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIGRhdGEubGVuZ3RoKSwgTWF0aC5taW4ocmFuZ2UuZW5kLCBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeSA9IGF3YWl0IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZW50cnkubGFzdEFjY2VzcyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpXG4gICAgICAgICAgICBpZiAodGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZhbGxiYWNrID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXQyKGtleSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2spIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGVcbiAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlYWQncyBieXRlcyBjYW1lIGZyb20gYSByZW1vdGUgc291cmNlLCBzbyB3cml0ZSB0aGVtIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCB3aGljaCBiZWNvbWVzIHRoZSBlbnRyeSdzIG5ldyBob2xkZXIgLSByZWFkcyBvbmx5IHBheSB0aGUgcmVtb3RlIGZldGNoIG9uY2VcbiAgICBwcml2YXRlIGFzeW5jIGNhY2hlUmVhZChrZXk6IHN0cmluZywgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcIm9yaWdpbmFsXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWVtLmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gb3ZlcmxheUVudHJ5ICYmIG92ZXJsYXlFbnRyeS50IHx8IGVudHJ5ICYmIGVudHJ5LndyaXRlVGltZSB8fCAwO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDwgY3VycmVudFRpbWUpIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IGxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoY29uZmlnPy5mYXN0KSB7XG4gICAgICAgICAgICAvLyBBIHdyaXRlRGVsYXkgb2YgemVybyBpcyBhIHJlYWwgY2hvaWNlIChubyBkZWxheSBhdCBhbGwpLCBzbyBvbmx5IGFuIG9taXR0ZWQgZGVsYXkgZ2V0cyB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgbGV0IHdyaXRlRGVsYXkgPSBjb25maWcud3JpdGVEZWxheTtcbiAgICAgICAgICAgIGlmICh3cml0ZURlbGF5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB3cml0ZURlbGF5ID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGRlbGF5IG5ldmVyIGV4dGVuZHMgcGFzdCBvdXIgb3duIHZhbGlkIHdpbmRvdydzIGVuZCAobWludXMgdGhlIG1hcmdpbiwgc28gdGhlIHdyaXRlcyBhcmUgb24gZGlzayBiZWZvcmUgdGhlIG5leHQgd2luZG93J3Mgc291cmNlIHRha2VzIG92ZXIgLSBhIGRlcGxveSBzd2l0Y2hvdmVyIGlzIGp1c3QgdGhpcyB0b28sIHNpbmNlIGl0cyByZW1hcCBlbmRzIG91ciB3aW5kb3cpLiBQYXN0IHRoYXQgcG9pbnQgZmFzdCB3cml0ZXMgd3JpdGUgdGhyb3VnaCBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgIGxldCBkZWFkbGluZSA9IHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd1sxXSAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgICAgICAgICAgaWYgKHdyaXRlRGVsYXkgPiAwICYmIERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgICAgICAgICAgIGxldCBmbHVzaEF0ID0gTWF0aC5taW4oRGF0ZS5ub3coKSArIHdyaXRlRGVsYXksIGRlYWRsaW5lKTtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkuc2V0KGtleSwgeyBkYXRhLCB0OiB3cml0ZVRpbWUsIGZsdXNoQXQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3ZlcmxheS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm92ZXJsYXkuZGVsZXRlKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCB3cml0ZVRpbWUpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWwoa2V5OiBzdHJpbmcsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIERlbGV0ZXMgYXJlIHRvbWJzdG9uZSB3cml0ZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgc2l6ZS0wIGluZGV4IGVudHJ5IGlzIG9yZGVyZWQgYnkgd3JpdGUgdGltZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgcHJvcGFnYXRlcyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbiwgYW5kIGV4cGlyZXMgYWZ0ZXIgVE9NQlNUT05FX0VYUElSWVxuICAgICAgICBhd2FpdCB0aGlzLnNldChrZXksIEJ1ZmZlci5hbGxvYygwKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyaXRhYmxlU291cmNlcyhjb25maWc/OiB7IGlnbm9yZVdpbmRvdz86IGJvb2xlYW4gfSk6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHdyaXRhYmxlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uaWdub3JlV2luZG93ICYmICF3aW5kb3dBY2NlcHRzV3JpdGVzKHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvdykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgd3JpdGFibGUucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGFibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVRvU291cmNlcyhrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIE5FVkVSIHN5bmNocm9uaXplZCBiZXR3ZWVuIHN0b3JhZ2Ugbm9kZXM6IHRoZSB3cml0ZXIgd3JpdGVzIGl0IGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgc28gd2Ugc3RvcmUgaXQgb24gb3VyIG93biBkaXNrIG9ubHkgKG5vIHZhbGlkLXdpbmRvdyBmaWx0ZXIgLSByb3V0aW5nL3ZhbGlkIHdpbmRvd3MgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlbSkgYW5kIG5ldmVyIGZvcndhcmQgaXQgdG8gb3RoZXIgc291cmNlcy5cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJmbHVzaGVkXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZSBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGVTb3VyY2UgcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBBIHRvbWJzdG9uZSBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSBpbmRleCBlbnRyeSBhbG9uZSByZWNvcmRzIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lLCBzaXplOiBkYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KGZpcnN0KSB9KTtcbiAgICAgICAgaWYgKGlzUm91dGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICBmb3IgKGxldCBpIG9mIHdyaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRG93bnN0cmVhbSBzb3VyY2VzIHJlY2VpdmUgdG9tYnN0b25lcyBhcyBhY3R1YWwgZW1wdHkgd3JpdGVzLCBzbyB0aGVpciBsaXN0aW5ncyBzaG93IHRoZSBkZWxldGlvbiAoc2l6ZSAwKSBhbmQgb3RoZXIgc3RvcmVzIHNjYW4gaXQgaW4gYXMgYSB0b21ic3RvbmVcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2dyb3VuZCB3cml0ZSBvZiAke2tleX0gdG8gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBvdmVybGF5RW50cnkgPSB0aGlzLm92ZXJsYXkuZ2V0KGtleSk7XG4gICAgICAgIGlmIChvdmVybGF5RW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogb3ZlcmxheUVudHJ5LnQsIHNpemU6IG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeSA9IGF3YWl0IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZT86IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBpbmZvcyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRvbWJzdG9uZXMgYXJlIG1pc3NpbmcgZmlsZXMsIHNvIGxpc3RpbmdzIGhpZGUgdGhlbVxuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCBvdmVybGF5RW50cnldIG9mIHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpbmZvcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZm9zLnNldChrZXksIHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZTogb3ZlcmxheUVudHJ5LmRhdGEubGVuZ3RoIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyBBbGwgZmlsZXMgY2hhbmdlZCBhZnRlciBjb25maWcudGltZSDigJQgZmFzdCwgc3RyYWlnaHQgZnJvbSB0aGUgaW4tbWVtb3J5IGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzIOKAlCB0aGF0J3MgaG93IHRoZXkgcHJvcGFnYXRlIHRvIHN0b3JlcyBzeW5jaW5nIGZyb20gdXMuIGNvbmZpZy5yb3V0ZXMgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuXG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBpblJvdXRlcyA9IChrZXk6IHN0cmluZykgPT4gIWNvbmZpZy5yb3V0ZXMgfHwgY29uZmlnLnJvdXRlcy5zb21lKHJvdXRlID0+IHJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGtleSkpKTtcbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheS5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWluUm91dGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIG92ZXJsYXlFbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAob3ZlcmxheUVudHJ5LnQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IG92ZXJsYXlFbnRyeS50LCBzaXplOiBvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiB0aGlzLnNvdXJjZVN0YXRlcy5ldmVyeSh4ID0+IHguc2NhbkNvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogdGhpcy5tZW0uc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlcy5tYXAoKHgsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdyxcbiAgICAgICAgICAgICAgICByb3V0ZTogeC5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiB4Lm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRoaXMuc291cmNlU3RhdGVzW2ldLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLFxuICAgICAgICAgICAgICAgIGluaXRpYWxTY2FuQ29tcGxldGU6IHRoaXMuc291cmNlU3RhdGVzW2ldLnNjYW5Db21wbGV0ZSxcbiAgICAgICAgICAgICAgICBzY2FubmVkQ291bnQ6IHRoaXMuc291cmNlU3RhdGVzW2ldLnNjYW5uZWRDb3VudCxcbiAgICAgICAgICAgIH0pKS5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgbGFyZ2UgdXBsb2FkcyDilIDilIBcbiAgICAvLyBMYXJnZSB1cGxvYWRzIHN0cmVhbSBvbnRvIHRoZSBsb2NhbCBkaXNrIHNvdXJjZSBkaXJlY3RseSAodGhleSBtYXkgbm90IGZpdCBpbiBtZW1vcnkpXG5cbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0Rpc2spIHJldHVybiB7IGRpc2s6IHNvdXJjZSwgc291cmNlSW5kZXg6IGkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhcmdlIHVwbG9hZHMgcmVxdWlyZSBhbiBBcmNoaXZlc0Rpc2sgc291cmNlLCBhbmQgdGhpcyBzdG9yZSBoYXMgbm9uZSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzdGFydExhcmdlVXBsb2FkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5hcHBlbmRMYXJnZVVwbG9hZChpZCwgZGF0YSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBkaXNrLCBzb3VyY2VJbmRleCB9ID0gdGhpcy5nZXREaXNrU291cmNlKCk7XG4gICAgICAgIGF3YWl0IGRpc2suZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGtleSk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kZWxldGUoa2V5KTtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBkaXNrLmdldEluZm8oa2V5KTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hPdmVybGF5KGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiBlbnRyeS5mbHVzaEF0ID4gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBlbnRyeS5kYXRhLCBlbnRyeS50KTtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIGl0IHdhc24ndCBvdmVyd3JpdHRlbiB3aGlsZSB3ZSB3ZXJlIGZsdXNoaW5nXG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5LmdldChrZXkpID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlYWRlckRpc2tMaW1pdDogdGhlIGRpc2sgaXMgb25seSBhIGJvdW5kZWQgcmVhZCBjYWNoZSwgc28gb25jZSBpdCBleGNlZWRzIHRoZSBsaW1pdCwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlsZXMgYXJlIGRlbGV0ZWQgZnJvbSBpdCAtIGJ1dCBPTkxZIHdoZW4gYW5vdGhlciBzb3VyY2UgdmVyaWZpYWJseSBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnkgcmVwb2ludHMgdG8gdGhhdCBzb3VyY2Ugc28gcmVhZHMga2VlcCB3b3JraW5nIChyZS1jYWNoaW5nIG9uIHRoZSBuZXh0IHJlYWQpLlxuICAgIHByaXZhdGUgZXZpY3RpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VEaXNrTGltaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBsaW1pdCA9IHRoaXMuY29uZmlnPy5yZWFkZXJEaXNrTGltaXQ7XG4gICAgICAgIGlmICghbGltaXQgfHwgdGhpcy5ldmljdGluZykgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zb3VyY2VCeXRlQ291bnRzWzBdIDw9IGxpbWl0KSByZXR1cm47XG4gICAgICAgIHRoaXMuZXZpY3RpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZXZpY3RlZEZpbGVzID0gMDtcbiAgICAgICAgbGV0IGV2aWN0ZWRCeXRlcyA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlczogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwgZW50cnkuc2l6ZSA9PT0gMCB8fCBrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnQoY2FuZGlkYXRlcywgeCA9PiB4LmVudHJ5Lmxhc3RBY2Nlc3MpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUJ5dGVDb3VudHNbMF0gPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lbS5nZXQoa2V5KSAhPT0gZW50cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBob2xkZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoaG9sZGVyKSB9KTtcbiAgICAgICAgICAgICAgICBldmljdGVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICBldmljdGVkQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmljdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGlzayBjYWNoZSBvdmVyIHJlYWRlckRpc2tMaW1pdCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBldmljdGVkICR7ZXZpY3RlZEZpbGVzfSBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihldmljdGVkQnl0ZXMpfUIpLCBub3cgYXQgJHtmb3JtYXROdW1iZXIodGhpcy5zb3VyY2VCeXRlQ291bnRzWzBdKX1CLyR7Zm9ybWF0TnVtYmVyKHRoaXMuY29uZmlnPy5yZWFkZXJEaXNrTGltaXQgfHwgMCl9QmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVG9tYnN0b25lcyBvbmx5IG5lZWQgdG8gZXhpc3QgbG9uZyBlbm91Z2ggZm9yIGV2ZXJ5IHN0b3JlIHRvIGxlYXJuIG9mIHRoZSBkZWxldGlvbjsgZXhwaXJlZCBvbmVzIGNvbWUgb3V0IG9mIHRoZSBpbmRleC4gVGhlIHBoeXNpY2FsIGVtcHR5IGZpbGUgaXMgcmVtb3ZlZCBvbmx5IG9uIGJhY2tibGF6ZSBzb3VyY2VzOiByZW1vdGUgc3RvcmVzIGV4cGlyZSB0aGVpciBvd24gdG9tYnN0b25lcyAoYSBkZWwgdGhlcmUgd291bGQganVzdCBtaW50IGEgZnJlc2ggb25lKSwgYW5kIG91ciBvd24gZGlzayBuZXZlciBzdG9yZWQgYW55dGhpbmcgZm9yIGl0LlxuICAgIHByaXZhdGUgYXN5bmMgY2xlYW51cFRvbWJzdG9uZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gVE9NQlNUT05FX0VYUElSWTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zaXplICE9PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS53cml0ZVRpbWUgPiBjdXRvZmYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd0FjY2VwdHNXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3cpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlRW50cnkuc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdm9pZCBzb3VyY2UuZGVsKGtleSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlbW92aW5nIGV4cGlyZWQgdG9tYnN0b25lICR7a2V5fSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
1149
|
+
/* _JS_SOURCE_HASH = "92b84833cb696c75feda273ce94460aa6adf13d4cb94225c6d18a46b38f9ce74"; */
|