@cartanova/qgrid-cli 2.5.8 → 2.5.10
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/README.ko.md +2 -8
- package/README.md +2 -8
- package/bundle/dist/utils/providers/openai/codex-worker.js +38 -16
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +90 -35
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +172 -2
- package/bundle/src/utils/providers/openai/codex-worker.ts +45 -19
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +483 -4
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +172 -49
- package/bundle/web-dist/client/assets/{index-oLaOO8wP.js → index-SdI2T3b8.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-D8U3hI1f.js → logs-O-8hGStp.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-NKS90qFj.js → monit-DA8MAY-d.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-BuxVmofi.js → routes-COPjkgNr.js} +1 -1
- package/bundle/web-dist/client/assets/{show-C8Qv9_Ww.js → show-ClG4e0BP.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-ChWIXTeL.js → tokens-Cc5frn5f.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +3 -3
- package/skills/qgrid/references/openai-codex-runtime.md +16 -1
- package/skills/qgrid/references/verification-and-debugging.md +3 -1
|
@@ -12,7 +12,7 @@ import { freemem } from "node:os";
|
|
|
12
12
|
/**
|
|
13
13
|
* OpenAIDispatcher — codex app-server worker pool + 토큰 라우팅.
|
|
14
14
|
*
|
|
15
|
-
* - 토큰당 CodexAppServerWorker 자동 확장 (기본
|
|
15
|
+
* - 토큰당 CodexAppServerWorker 자동 확장 (기본 1~3, hard cap 20)
|
|
16
16
|
* - idle worker round-robin 선택 + 큐 대기 (전부 busy 시)
|
|
17
17
|
* - TokenSubscriber 이벤트로 worker pool 동기화
|
|
18
18
|
* - backpressure: 큐 full 또는 timeout 시 SERVER_BUSY
|
|
@@ -57,6 +57,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
57
57
|
queue = [];
|
|
58
58
|
poolConfig;
|
|
59
59
|
quotaBlockedTokenIds = /* @__PURE__ */ new Set();
|
|
60
|
+
startingTokenIds = /* @__PURE__ */ new Set();
|
|
60
61
|
rateLimitsGenerationByToken = /* @__PURE__ */ new Map();
|
|
61
62
|
weightedSelector = new SmoothWeightedRoundRobin();
|
|
62
63
|
workerCursorByToken = /* @__PURE__ */ new Map();
|
|
@@ -80,10 +81,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
80
81
|
await this.spawnWorkers(t.id, t.name, t.credentials, t.quota_threshold, t.weight);
|
|
81
82
|
if (!t.active) this.onTokenDeactivated(t.id);
|
|
82
83
|
}));
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
this.scalerTimer.unref?.();
|
|
86
|
-
}
|
|
84
|
+
this.scalerTimer = setInterval(() => this.requestAutoscaleEvaluation(), this.poolConfig.scaleIntervalMs);
|
|
85
|
+
this.scalerTimer.unref?.();
|
|
87
86
|
}
|
|
88
87
|
async stop() {
|
|
89
88
|
this.stopped = true;
|
|
@@ -103,6 +102,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
103
102
|
this.rateLimitsCache.clear();
|
|
104
103
|
this.rateLimitsGenerationByToken.clear();
|
|
105
104
|
this.quotaBlockedTokenIds.clear();
|
|
105
|
+
this.startingTokenIds.clear();
|
|
106
106
|
}
|
|
107
107
|
async onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
|
|
108
108
|
this.quotaBlockedTokenIds.delete(id);
|
|
@@ -121,7 +121,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
121
121
|
this.invalidateRateLimitsCache(id);
|
|
122
122
|
this.quotaBlockedTokenIds.delete(id);
|
|
123
123
|
await Promise.allSettled(workers.map((w) => w.kill()));
|
|
124
|
-
if (this.
|
|
124
|
+
if (!this.hasActiveTokenCandidate(/* @__PURE__ */ new Set())) this.rejectAllQueued("NO_OPENAI_WORKERS");
|
|
125
125
|
if (workers.length > 0) {
|
|
126
126
|
const label = tokenName ?? `token ${id}`;
|
|
127
127
|
logger.info(`workers removed: ${label} (${workers.length})`);
|
|
@@ -162,7 +162,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
162
162
|
w.active = false;
|
|
163
163
|
});
|
|
164
164
|
if (changed) this.weightedSelector.resetScores();
|
|
165
|
-
if (this.
|
|
165
|
+
if (!this.hasActiveTokenCandidate(/* @__PURE__ */ new Set())) this.rejectAllQueued("NO_ACTIVE_WORKERS");
|
|
166
166
|
const label = tokenName ?? `token ${id}`;
|
|
167
167
|
logger.info(`workers deactivated: ${label}`);
|
|
168
168
|
}
|
|
@@ -292,8 +292,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
292
292
|
}
|
|
293
293
|
async enqueue(execute, excludedTokenIds = /* @__PURE__ */ new Set()) {
|
|
294
294
|
const eligibility = await this.resolveTokenEligibility(excludedTokenIds);
|
|
295
|
-
if (eligibility.readyActiveTokenIds.size === 0) throw new Error("NO_OPENAI_WORKERS");
|
|
296
|
-
if (eligibility.eligibleTokenIds.size === 0) this.throwQuotaThresholdExceeded(eligibility);
|
|
295
|
+
if (eligibility.readyActiveTokenIds.size === 0 && !this.hasActiveTokenCandidate(excludedTokenIds)) throw new Error("NO_OPENAI_WORKERS");
|
|
296
|
+
if (eligibility.readyActiveTokenIds.size > 0 && eligibility.eligibleTokenIds.size === 0) this.throwQuotaThresholdExceeded(eligibility);
|
|
297
297
|
if (this.queue.length >= MAX_QUEUE_SIZE) throw new Error("SERVER_BUSY");
|
|
298
298
|
return new Promise((resolve, reject) => {
|
|
299
299
|
const item = {
|
|
@@ -314,6 +314,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
314
314
|
excludedTokenIds: new Set(excludedTokenIds)
|
|
315
315
|
};
|
|
316
316
|
this.queue.push(item);
|
|
317
|
+
this.requestDrainQueue();
|
|
317
318
|
this.requestAutoscaleEvaluation();
|
|
318
319
|
});
|
|
319
320
|
}
|
|
@@ -439,14 +440,23 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
439
440
|
await worker.executeTurnStream(turnReq, wrappedCb, reuseThreadId);
|
|
440
441
|
}
|
|
441
442
|
async spawnWorkers(tokenId, tokenName, credentials, quotaThreshold, weight = 1) {
|
|
443
|
+
if (this.startingTokenIds.has(tokenId)) return;
|
|
444
|
+
this.startingTokenIds.add(tokenId);
|
|
442
445
|
this.setTokenMetadata(tokenId, tokenName, credentials, quotaThreshold, weight);
|
|
446
|
+
const expectedMetadata = this.tokenMetadata.get(tokenId);
|
|
443
447
|
const workers = [];
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
+
try {
|
|
449
|
+
for (let i = 0; i < this.poolConfig.minWorkersPerToken; i++) {
|
|
450
|
+
if (i > 0) await sleep(SPAWN_INTERVAL_MS);
|
|
451
|
+
const worker = await this.spawnSingleWorker(tokenId, tokenName, credentials, i);
|
|
452
|
+
if (worker) workers.push(worker);
|
|
453
|
+
}
|
|
454
|
+
if (!this.stopped && expectedMetadata?.active && this.tokenMetadata.get(tokenId) === expectedMetadata && !this.workerPool.has(tokenId)) {
|
|
455
|
+
if (workers.length > 0) this.workerPool.set(tokenId, workers);
|
|
456
|
+
} else await Promise.allSettled(workers.map((worker) => worker.kill()));
|
|
457
|
+
} finally {
|
|
458
|
+
this.startingTokenIds.delete(tokenId);
|
|
448
459
|
}
|
|
449
|
-
if (workers.length > 0) this.workerPool.set(tokenId, workers);
|
|
450
460
|
}
|
|
451
461
|
async spawnSingleWorker(tokenId, tokenName, credentials, workerIndex) {
|
|
452
462
|
const worker = new CodexAppServerWorker({
|
|
@@ -458,6 +468,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
458
468
|
workerIndex
|
|
459
469
|
});
|
|
460
470
|
worker.onReady = () => this.requestDrainQueue();
|
|
471
|
+
worker.onTerminalFailure = () => {
|
|
472
|
+
this.handleWorkerTerminalFailure(worker).catch((e) => logger.warn(`terminal worker cleanup failed: ${tokenName}[${workerIndex}]: ${e.message}`));
|
|
473
|
+
};
|
|
461
474
|
worker.setServerRequestHandler(async (method) => {
|
|
462
475
|
if (method === "account/chatgptAuthTokens/refresh") return handleChatgptAuthTokensRefresh(tokenId);
|
|
463
476
|
throw new Error(`unhandled server-request: ${method}`);
|
|
@@ -473,18 +486,21 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
473
486
|
}
|
|
474
487
|
}
|
|
475
488
|
async evaluateAutoscaling() {
|
|
489
|
+
if (this.stopped) return;
|
|
490
|
+
this.sweepIdleWorkerThreads();
|
|
491
|
+
const minimumDeficitTokenIds = await this.ensureMinimumWorkersOneStep();
|
|
476
492
|
if (!this.poolConfig.autoscale || this.stopped) return;
|
|
477
493
|
if (this.queue.length > 0) {
|
|
478
|
-
await this.scaleUpOneStep();
|
|
494
|
+
await this.scaleUpOneStep(minimumDeficitTokenIds);
|
|
479
495
|
return;
|
|
480
496
|
}
|
|
481
497
|
if (Date.now() - this.lastRequestAt >= this.poolConfig.scaleDownIdleMs) await this.scaleDownOneStep();
|
|
482
498
|
}
|
|
483
|
-
async scaleUpOneStep() {
|
|
499
|
+
async scaleUpOneStep(excludedTokenIds = /* @__PURE__ */ new Set()) {
|
|
484
500
|
if (!this.poolConfig.autoscale || this.stopped) return;
|
|
485
501
|
await this.runScaling(async () => {
|
|
486
502
|
const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
|
|
487
|
-
if (!metadata.active || this.quotaBlockedTokenIds.has(tokenId)) return false;
|
|
503
|
+
if (!metadata.active || this.startingTokenIds.has(tokenId) || excludedTokenIds.has(tokenId) || this.quotaBlockedTokenIds.has(tokenId)) return false;
|
|
488
504
|
return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.maxWorkersPerToken;
|
|
489
505
|
});
|
|
490
506
|
if (candidates.length === 0) return;
|
|
@@ -498,22 +514,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
498
514
|
logger.warn(`openai autoscale blocked: host available ${hostAvailableGiB.toFixed(2)}GiB below ${this.poolConfig.minHostAvailableGiB.toFixed(2)}GiB`);
|
|
499
515
|
return;
|
|
500
516
|
}
|
|
501
|
-
const added = (await Promise.all(candidates.map(
|
|
502
|
-
const workers = this.workerPool.get(tokenId) ?? [];
|
|
503
|
-
const workerIndex = this.nextAvailableWorkerIndex(workers);
|
|
504
|
-
if (workerIndex >= this.poolConfig.maxWorkersPerToken) return null;
|
|
505
|
-
const worker = await this.spawnSingleWorker(tokenId, metadata.name, metadata.credentials, workerIndex);
|
|
506
|
-
if (!worker) return null;
|
|
507
|
-
const currentMetadata = this.tokenMetadata.get(tokenId);
|
|
508
|
-
const currentWorkers = this.workerPool.get(tokenId);
|
|
509
|
-
if (!currentMetadata?.active || this.quotaBlockedTokenIds.has(tokenId) || currentMetadata !== metadata || !currentWorkers || currentWorkers.some((entry) => entry.workerIndex === workerIndex)) {
|
|
510
|
-
await worker.kill().catch(() => {});
|
|
511
|
-
return null;
|
|
512
|
-
}
|
|
513
|
-
currentWorkers.push(worker);
|
|
514
|
-
currentWorkers.sort((a, b) => a.workerIndex - b.workerIndex);
|
|
515
|
-
return worker;
|
|
516
|
-
}))).filter((worker) => worker !== null).length;
|
|
517
|
+
const added = (await Promise.all(candidates.map(([tokenId, metadata]) => this.spawnAndCommitWorker(tokenId, metadata, true)))).filter((worker) => worker !== null).length;
|
|
517
518
|
if (added > 0) {
|
|
518
519
|
logger.info(`openai autoscale up: +${added} workers (${this.workerCount} total, queue ${this.queue.length})`);
|
|
519
520
|
this.requestDrainQueue();
|
|
@@ -521,6 +522,25 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
521
522
|
}
|
|
522
523
|
});
|
|
523
524
|
}
|
|
525
|
+
async ensureMinimumWorkersOneStep() {
|
|
526
|
+
const minimumDeficitTokenIds = /* @__PURE__ */ new Set();
|
|
527
|
+
if (this.stopped) return minimumDeficitTokenIds;
|
|
528
|
+
await this.runScaling(async () => {
|
|
529
|
+
const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
|
|
530
|
+
if (!metadata.active || this.startingTokenIds.has(tokenId)) return false;
|
|
531
|
+
return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.minWorkersPerToken;
|
|
532
|
+
});
|
|
533
|
+
if (candidates.length === 0) return;
|
|
534
|
+
candidates.forEach(([tokenId]) => minimumDeficitTokenIds.add(tokenId));
|
|
535
|
+
const added = (await Promise.all(candidates.map(([tokenId, metadata]) => this.spawnAndCommitWorker(tokenId, metadata, false)))).filter((worker) => worker !== null).length;
|
|
536
|
+
if (added > 0) {
|
|
537
|
+
logger.info(`openai worker pool repaired: +${added} workers (${this.workerCount} total)`);
|
|
538
|
+
this.requestDrainQueue();
|
|
539
|
+
if (this.queue.length > 0) setTimeout(() => this.requestAutoscaleEvaluation(), Math.min(this.poolConfig.scaleIntervalMs, 1e3)).unref?.();
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
return minimumDeficitTokenIds;
|
|
543
|
+
}
|
|
524
544
|
async scaleDownOneStep() {
|
|
525
545
|
if (!this.poolConfig.autoscale || this.stopped) return;
|
|
526
546
|
await this.runScaling(async () => {
|
|
@@ -543,8 +563,40 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
543
563
|
for (let index = 0; index < this.poolConfig.maxWorkersPerToken; index++) if (!used.has(index)) return index;
|
|
544
564
|
return this.poolConfig.maxWorkersPerToken;
|
|
545
565
|
}
|
|
566
|
+
sweepIdleWorkerThreads() {
|
|
567
|
+
for (const worker of [...this.workerPool.values()].flat()) if (worker.isReady && worker.hasCapacity) worker.sweepIdleThreads();
|
|
568
|
+
}
|
|
569
|
+
async spawnAndCommitWorker(tokenId, metadata, respectQuotaBlock) {
|
|
570
|
+
const expectedWorkers = this.workerPool.get(tokenId);
|
|
571
|
+
const workerIndex = this.nextAvailableWorkerIndex(expectedWorkers ?? []);
|
|
572
|
+
if (workerIndex >= this.poolConfig.maxWorkersPerToken) return null;
|
|
573
|
+
const worker = await this.spawnSingleWorker(tokenId, metadata.name, metadata.credentials, workerIndex);
|
|
574
|
+
if (!worker) return null;
|
|
575
|
+
const currentMetadata = this.tokenMetadata.get(tokenId);
|
|
576
|
+
const currentWorkers = this.workerPool.get(tokenId);
|
|
577
|
+
if (!currentMetadata?.active || currentMetadata !== metadata || currentWorkers !== expectedWorkers || respectQuotaBlock && this.quotaBlockedTokenIds.has(tokenId) || currentWorkers?.some((entry) => entry.workerIndex === workerIndex)) {
|
|
578
|
+
await worker.kill().catch(() => {});
|
|
579
|
+
return null;
|
|
580
|
+
}
|
|
581
|
+
const nextWorkers = currentWorkers ?? [];
|
|
582
|
+
nextWorkers.push(worker);
|
|
583
|
+
nextWorkers.sort((a, b) => a.workerIndex - b.workerIndex);
|
|
584
|
+
if (!currentWorkers) this.workerPool.set(tokenId, nextWorkers);
|
|
585
|
+
return worker;
|
|
586
|
+
}
|
|
587
|
+
async handleWorkerTerminalFailure(worker) {
|
|
588
|
+
if (!this.workerPool.get(worker.tokenId)?.includes(worker)) return;
|
|
589
|
+
await worker.kill().catch(() => {});
|
|
590
|
+
const currentWorkers = this.workerPool.get(worker.tokenId);
|
|
591
|
+
if (!currentWorkers?.includes(worker)) return;
|
|
592
|
+
const remaining = currentWorkers.filter((entry) => entry !== worker);
|
|
593
|
+
if (remaining.length > 0) this.workerPool.set(worker.tokenId, remaining);
|
|
594
|
+
else this.workerPool.delete(worker.tokenId);
|
|
595
|
+
logger.warn(`terminal worker removed: ${worker.tokenName}[${worker.workerIndex}] (${remaining.length} remaining)`);
|
|
596
|
+
this.requestAutoscaleEvaluation();
|
|
597
|
+
}
|
|
546
598
|
requestAutoscaleEvaluation() {
|
|
547
|
-
if (
|
|
599
|
+
if (this.stopped) return;
|
|
548
600
|
this.evaluateAutoscaling().catch((e) => logger.warn(`openai autoscale evaluation failed: ${e.message}`));
|
|
549
601
|
}
|
|
550
602
|
async runScaling(task) {
|
|
@@ -597,6 +649,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
597
649
|
});
|
|
598
650
|
this.weightedSelector.setToken(id, weight);
|
|
599
651
|
}
|
|
652
|
+
hasActiveTokenCandidate(excludedTokenIds) {
|
|
653
|
+
return [...this.tokenMetadata.entries()].some(([tokenId, metadata]) => metadata.active && !excludedTokenIds.has(tokenId));
|
|
654
|
+
}
|
|
600
655
|
getQuotaThreshold(tokenId) {
|
|
601
656
|
return this.tokenMetadata.get(tokenId)?.quotaThreshold;
|
|
602
657
|
}
|
|
@@ -806,4 +861,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
806
861
|
//#endregion
|
|
807
862
|
export { ImageGenerationError, OpenAIDispatcher, makeOpenAIWorkerId };
|
|
808
863
|
|
|
809
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggNX4xNSwgaGFyZCBjYXAgMjApXG4gKiAtIGlkbGUgd29ya2VyIHJvdW5kLXJvYmluIOyEoO2DnSArIO2BkCDrjIDquLAgKOyghOu2gCBidXN5IOyLnClcbiAqIC0gVG9rZW5TdWJzY3JpYmVyIOydtOuypO2KuOuhnCB3b3JrZXIgcG9vbCDrj5nquLDtmZRcbiAqIC0gYmFja3ByZXNzdXJlOiDtgZAgZnVsbCDrmJDripQgdGltZW91dCDsi5wgU0VSVkVSX0JVU1lcbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGZyZWVtZW0gfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9HZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlXCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmVyYXRlUmVxdWVzdCxcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgdHlwZSBQcm92aWRlckRpc3BhdGNoZXIsXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IENvZGV4QXBwU2VydmVyV29ya2VyLCB0eXBlIFN0cmVhbUNhbGxiYWNrcywgdHlwZSBUdXJuUmVxdWVzdCB9IGZyb20gXCIuL2NvZGV4LXdvcmtlclwiO1xuaW1wb3J0IHtcbiAgcmVhZE9wZW5BSVF1b3RhVXNhZ2UsXG4gIHR5cGUgT3BlbkFJUXVvdGFVc2FnZVJlc3VsdCxcbiAgdHlwZSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEsXG59IGZyb20gXCIuL29wZW5haS1xdW90YVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoIH0gZnJvbSBcIi4vb3BlbmFpLXJlZnJlc2hcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCLFxuICB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcsXG4gIHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnLFxufSBmcm9tIFwiLi9vcGVuYWktd29ya2VyLXBvb2wtY29uZmlnXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuLy8g7J2066+47KeAIOyDneyEsSDsmpTssq3snbQg6rKM7J207Yq4L+yDneyEseyXkCDsi6TtjKjtlojsnYQg65WM7J2YIOq1rOu2hOyekC5cbi8vIC0gXCJnYXRlXCI6IOyCrOyghCDqsoDspp0g7Iuk7YyoKGNhcGFiaWxpdHkv66qo6424IOupgO2LsOuqqOuLrCDrtojstqnsobEpIOKAlCB0dXJuIOuvuOyLpO2WiS5cbi8vIC0gXCJub3RfY2FsbGVkXCI6IHR1cm4g7J2AIOyEseqzte2WiOycvOuCmCDrqqjrjbjsnbQgaW1hZ2UgdG9vbCDsnYQg7Zi47LacIOyViCDtlagg4oCUIOyerOyLnOuPhCDrrLTsnbUo7ZSE66Gs7ZSE7Yq4IOusuOygnCkuXG4vLyAtIFwiaW5jb21wbGV0ZVwiOiB0b29sIOyLnOuPhOuQkOycvOuCmCDsmYTshLEg7J2066+47KeAIOuvuOuPhOywqSDigJQg7J6s7Iuc64+EIO2bhOuztCjshJzrsoTsuKEg7Iuk7YyoL+qxsOu2gCkuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuY29uc3QgUVVFVUVfVElNRU9VVF9NUyA9IDYwXzAwMDtcbmNvbnN0IE1BWF9RVUVVRV9TSVpFID0gNTA7XG5jb25zdCBTUEFXTl9JTlRFUlZBTF9NUyA9IDUwMDtcblxuZnVuY3Rpb24gcmVhZEhvc3RBdmFpbGFibGVHaUIoKTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL21lbWluZm9cIiwgXCJ1dGY4XCIpLm1hdGNoKC9eTWVtQXZhaWxhYmxlOlxccysoXFxkKylcXHMra0IkL20pO1xuICAgIGlmIChtYXRjaD8uWzFdKSByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSAvIDEwMjQgLyAxMDI0O1xuICB9IGNhdGNoIHt9XG4gIHJldHVybiBmcmVlbWVtKCkgLyAxMDI0IC8gMTAyNCAvIDEwMjQ7XG59XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi4xOSkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmNvbnN0IE9QRU5BSV9XT1JLRVJfSURfU1RSSURFID0gMTAwO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VPcGVuQUlXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIE9QRU5BSV9XT1JLRVJfSURfU1RSSURFICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBUb2tlbkVsaWdpYmlsaXR5ID0ge1xuICByZWFkeUFjdGl2ZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgZWxpZ2libGVUb2tlbklkczogU2V0PG51bWJlcj47XG4gIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IG51bWJlcjtcbn07XG5cbnR5cGUgUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEgJiB7XG4gIGdlbmVyYXRpb246IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICB0b2tlbk1ldGFkYXRhID0gbmV3IE1hcDxudW1iZXIsIFRva2VuTWV0YWRhdGE+KCk7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuICByZWFkb25seSBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1b3RhQmxvY2tlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSkge1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IHNldEludGVydmFsKFxuICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgIHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjYWxlclRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuc2NhbGVyVGltZXIpO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U/LmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIkRJU1BBVENIRVJfU0hVVERPV05cIik7XG4gICAgY29uc3Qga2lsbHMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubWFwKCh3KSA9PiB3LmtpbGwoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtpbGxzKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gICAgdGhpcy53b3JrZXJQb29sLmNsZWFyKCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmNsZWFyKCk7XG4gICAgdGhpcy53b3JrZXJDdXJzb3JCeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5jbGVhcigpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb2tlbiBldmVudHMgKGZyb20gVG9rZW5TdWJzY3JpYmVyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgaWYgKHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgcmVtb3ZlZDogJHtsYWJlbH0gKCR7d29ya2Vycy5sZW5ndGh9KWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0aHJlc2hvbGRDaGFuZ2VkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChpZCkgIT09IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh0aHJlc2hvbGRDaGFuZ2VkKSB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5zZXRUb2tlbk1ldGFkYXRhKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG5cbiAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcuZXZlcnkoKHcpID0+IHcuY2FuUmV1c2VGb3JUb2tlbihuYW1lLCBjcmVkZW50aWFscykpKSB7XG4gICAgICBleGlzdGluZy5mb3JFYWNoKCh3KSA9PiB3LnVwZGF0ZVRva2VuU3RhdGUobmFtZSwgY3JlZGVudGlhbHMpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHVwZGF0ZWQgaW4tcGxhY2U6ICR7bmFtZX1gKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGE/LmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgY29uc3QgY2hhbmdlZCA9IHdvcmtlcnMuc29tZSgod29ya2VyKSA9PiB3b3JrZXIuYWN0aXZlKTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSBNQVhfUVVFVUVfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcbiAgICAgICAgcmVzb2x2ZTogKHdvcmtlcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCBleGVjdXRlKSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdDogKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyOiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21RdWV1ZShpdGVtKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgICAgICB9LCBRVUVVRV9USU1FT1VUX01TKSxcbiAgICAgICAgZXhjbHVkZWRUb2tlbklkczogbmV3IFNldChleGNsdWRlZFRva2VuSWRzKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICAgIHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZyb21RdWV1ZShpdGVtOiBRdWV1ZUl0ZW0pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucXVldWUuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgdGhpcy5xdWV1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJlamVjdEFsbFF1ZXVlZChyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihyZWFzb24pO1xuICAgIHRoaXMucXVldWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgaXRlbS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cblxuICBhc3luYyBkcmFpblF1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRyYWluaW5nKSB7XG4gICAgICB0aGlzLmRyYWluQWdhaW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhaW5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUXVldWVPbmNlKCk7XG4gICAgICB9IHdoaWxlICh0aGlzLmRyYWluQWdhaW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5kcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW5RdWV1ZU9uY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF0hO1xuICAgICAgbGV0IHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlSWRsZVdvcmtlcihuZXh0LmV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcikge1xuICAgICAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBuZXh0LnJlamVjdChlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgbmV4dC5yZXNvbHZlKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlQW5kUmVsZWFzZTxUPihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIGV4ZWN1dGU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGUod29ya2VyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd29ya2VyLnJlbGVhc2VUdXJuKCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV1c2VUaHJlYWRJZCDqsIAg7J6I7Jy866m0IOq4sOyhtCB0aHJlYWQg7JeQIGRlbHRhKHJldXNlSW5wdXQp66eMLCDsl4bsnLzrqbQg7IOIIHRocmVhZCDsl5Ag7KCE7LK0XG4gIC8vIHByb21wdChjb2xkSW5wdXQpICsgaGlzdG9yeSBpbmplY3QuIHJldXNlIOqwgCBkaXNwYXRjaGVyIOuLqOyXkOyEnCDtj7TrsLHrkJjrqbQg7ZuE7J6Q66GcIOuWqOyWtOynhOuLpC5cbiAgcHJpdmF0ZSBidWlsZFR1cm5SZXF1ZXN0KHJlcTogR2VuZXJhdGVSZXF1ZXN0LCByZXVzZVRocmVhZElkPzogc3RyaW5nKTogVHVyblJlcXVlc3Qge1xuICAgIGNvbnN0IHJldXNpbmcgPSByZXVzZVRocmVhZElkICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiByZXVzaW5nICYmIHJlcS5yZXVzZUlucHV0ID8gcmVxLnJldXNlSW5wdXQgOiByZXEuY29sZElucHV0LFxuICAgICAgaGlzdG9yeTogcmV1c2luZyA/IHVuZGVmaW5lZCA6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHksXG4gICAgICByZWFzb25pbmdTdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgIHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIsXG4gICAgICBpbWFnZUdlbmVyYXRpb246IHJlcS5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyalOyyrSDsgqzsoIQg6rKM7J207Yq4KFI1KTog67Cw7KCV65CcIHdvcmtlciDsnZggY2FwYWJpbGl0eSArIOyggeyaqSDrqqjrjbgg66mA7Yuw66qo64usLlxuICAgIC8vIOu2iOy2qeyhseydtOuptCB0dXJuIOydhCDsi6TtlontlZjsp4Ag7JWK6rOgIOuqheyLnOyggSDsl5Drn6wuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGF3YWl0IHdvcmtlci5jaGVja0ltYWdlR2VuZXJhdGlvblN1cHBvcnQocmVxLm1vZGVsKTtcbiAgICAgIGlmIChyZWFzb24pIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImdhdGVcIiwgcmVhc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuKHR1cm5SZXEsIHJldXNlVGhyZWFkSWQpO1xuXG4gICAgLy8g7J2066+47KeAIDDqsJwg7Iuk7YyoIOu2hOulmChSNik6IHRvb2wg66+47Zi47LacKOyerOyLnOuPhCDrrLTsnbUpIHZzIOyLnOuPhCDtm4Qg66+47JmE7ISxKOyerOyLnOuPhCDtm4Trs7QpLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uICYmICghcmVzdWx0LmltYWdlcyB8fCByZXN1bHQuaW1hZ2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRocm93IHJlc3VsdC5pbWFnZUF0dGVtcHRlZFxuICAgICAgICA/IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJpbWFnZSB0b29sIHJhbiBidXQgcHJvZHVjZWQgbm8gY29tcGxldGVkIGltYWdlXCIpXG4gICAgICAgIDogbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwibm90X2NhbGxlZFwiLCBcIm1vZGVsIGRpZCBub3QgY2FsbCB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgIHVzYWdlOiByZXN1bHQudXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICB0aHJlYWRJZDogcmVzdWx0LnRocmVhZElkLFxuICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgfSxcbiAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVN0cmVhbVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gICAgcmV1c2VUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIC8vIHdvcmtlciDsnZggVHVyblJlc3VsdCDsl5AgdG9rZW5OYW1lL3RocmVhZENvb3JkIOulvCDrtpnsl6wg7IOB7JyEKEdlbmVyYXRlUmVzdWx0KeuhnCDsmKzrprDri6QuXG4gICAgLy8gdGhyZWFkSWQg64qUIOyDiCB0aHJlYWQg66m0IG9uVGhyZWFkSWQg66GcIO2ZleygleuQmOuvgOuhnCDrr7jrpqwg67O06rSA7ZW0IOuRkOqzoCBvbkNvbXBsZXRlIOuVjCDsnb3ripTri6QuXG4gICAgbGV0IHJlc29sdmVkVGhyZWFkSWQgPSByZXVzZVRocmVhZElkID8/IFwiXCI7XG4gICAgY29uc3Qgd3JhcHBlZENiOiBTdHJlYW1DYWxsYmFja3MgPSB7XG4gICAgICAuLi5jYixcbiAgICAgIG9uVGhyZWFkSWQ6ICh0aHJlYWRJZCkgPT4ge1xuICAgICAgICByZXNvbHZlZFRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICBjYi5vbkNvbXBsZXRlKHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlc29sdmVkVGhyZWFkSWQsXG4gICAgICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IsIHJldXNlVGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdFJlcXVlc3RBdCA+PSB0aGlzLnBvb2xDb25maWcuc2NhbGVEb3duSWRsZU1zKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxlRG93bk9uZVN0ZXAoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzY2FsZVVwT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4udGhpcy50b2tlbk1ldGFkYXRhLmVudHJpZXMoKV0uZmlsdGVyKChbdG9rZW5JZCwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgIGlmICghbWV0YWRhdGEuYWN0aXZlIHx8IHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKT8ubGVuZ3RoID8/IDApIDwgdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHByb2plY3RlZFdvcmtlckNvdW50ID0gdGhpcy53b3JrZXJDb3VudCArIGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgICAgY29uc3QgcHJvamVjdGVkUnNzR2lCID0gZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIocHJvamVjdGVkV29ya2VyQ291bnQpO1xuICAgICAgaWYgKHByb2plY3RlZFJzc0dpQiA+IHRoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogZXN0aW1hdGVkIFJTUyAke3Byb2plY3RlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQiBleGNlZWRzICR7dGhpcy5wb29sQ29uZmlnLm1heEVzdGltYXRlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9zdEF2YWlsYWJsZUdpQiA9IHRoaXMuZ2V0SG9zdEF2YWlsYWJsZUdpQigpO1xuICAgICAgaWYgKGhvc3RBdmFpbGFibGVHaUIgPCB0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQikge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgb3BlbmFpIGF1dG9zY2FsZSBibG9ja2VkOiBob3N0IGF2YWlsYWJsZSAke2hvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUIgYmVsb3cgJHt0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcChhc3luYyAoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IHdvcmtlckluZGV4ID0gdGhpcy5uZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2Vycyk7XG4gICAgICAgICAgaWYgKHdvcmtlckluZGV4ID49IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW4pIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgICAgbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhLmNyZWRlbnRpYWxzLFxuICAgICAgICAgICAgd29ya2VySW5kZXgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdvcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY3VycmVudE1ldGFkYXRhPy5hY3RpdmUgfHxcbiAgICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpIHx8XG4gICAgICAgICAgICBjdXJyZW50TWV0YWRhdGEgIT09IG1ldGFkYXRhIHx8XG4gICAgICAgICAgICAhY3VycmVudFdvcmtlcnMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRXb3JrZXJzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS53b3JrZXJJbmRleCA9PT0gd29ya2VySW5kZXgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50V29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgY3VycmVudFdvcmtlcnMuc29ydCgoYSwgYikgPT4gYS53b3JrZXJJbmRleCAtIGIud29ya2VySW5kZXgpO1xuICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgdXA6ICske2FkZGVkfSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsLCBxdWV1ZSAke3RoaXMucXVldWUubGVuZ3RofSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLCAxXzAwMCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lci51bnJlZj8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNjYWxlRG93bk9uZVN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkge1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXTtcbiAgICAgICAgaWYgKHdvcmtlcnMubGVuZ3RoIDw9IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW4pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNcbiAgICAgICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGIud29ya2VySW5kZXggLSBhLndvcmtlckluZGV4KVxuICAgICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkuaGFzQ2FwYWNpdHkpO1xuICAgICAgICBpZiAoIXdvcmtlcikgY29udGludWU7XG5cbiAgICAgICAgdGhpcy53b3JrZXJQb29sLnNldChcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHdvcmtlcnMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IHdvcmtlciksXG4gICAgICAgICk7XG4gICAgICAgIHJlbW92ZWQucHVzaCh3b3JrZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChyZW1vdmVkLm1hcCgod29ya2VyKSA9PiB3b3JrZXIua2lsbCgpKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgb3BlbmFpIGF1dG9zY2FsZSBkb3duOiAtJHtyZW1vdmVkLmxlbmd0aH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbClgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEF2YWlsYWJsZVdvcmtlckluZGV4KHdvcmtlcnM6IENvZGV4QXBwU2VydmVyV29ya2VyW10pOiBudW1iZXIge1xuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KHdvcmtlcnMubWFwKCh3b3JrZXIpID0+IHdvcmtlci53b3JrZXJJbmRleCkpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIXVzZWQuaGFzKGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5ldmFsdWF0ZUF1dG9zY2FsaW5nKCkuY2F0Y2goKGUpID0+XG4gICAgICBsb2dnZXIud2Fybihgb3BlbmFpIGF1dG9zY2FsZSBldmFsdWF0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TY2FsaW5nKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGluZyA9IHRhc2soKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjYWxpbmdQcm9taXNlID09PSBzY2FsaW5nKSB0aGlzLnNjYWxpbmdQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnNjYWxpbmdQcm9taXNlID0gc2NhbGluZztcbiAgICBhd2FpdCBzY2FsaW5nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHJhdGVMaW1pdHNDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCBSYXRlTGltaXRzQ2FjaGVFbnRyeT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldCh0b2tlbklkKTtcbiAgICBpZiAoXG4gICAgICBjYWNoZWQgJiZcbiAgICAgIGNhY2hlZC5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uICYmXG4gICAgICBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgT3BlbkFJRGlzcGF0Y2hlci5SQVRFX0xJTUlUU19DQUNIRV9UVExcbiAgICApIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IGNhY2hlZC5kYXRhLCBjYWNoZWRBdDogY2FjaGVkLmNhY2hlZEF0IH07XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VyID0gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW10pLmZpbmQoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgaWYgKCF3b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIm5vIHJlYWR5IG9wZW5haSB3b3JrZXJzXCIpO1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKSkgYXMgR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZTtcbiAgICBjb25zdCBlbnRyeTogUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpLCBnZW5lcmF0aW9uIH07XG4gICAgaWYgKCh0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMCkgPT09IGdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IGVudHJ5LmRhdGEsIGNhY2hlZEF0OiBlbnRyeS5jYWNoZWRBdCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0RHJhaW5RdWV1ZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZHJhaW5RdWV1ZSgpLmNhdGNoKChlKSA9PiBsb2dnZXIud2FybihgZHJhaW5RdWV1ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZSh0b2tlbklkKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5zZXQoXG4gICAgICB0b2tlbklkLFxuICAgICAgKHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwKSArIDEsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VG9rZW5NZXRhZGF0YShcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHtcbiAgICAgIG5hbWUsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIHF1b3RhVGhyZXNob2xkLFxuICAgICAgd2VpZ2h0LFxuICAgICAgYWN0aXZlOiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKT8uYWN0aXZlID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKT8ucXVvdGFUaHJlc2hvbGQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBQcm9taXNlPFRva2VuRWxpZ2liaWxpdHk+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBjb25zdCBieVRva2VuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICBpZiAoIWJ5VG9rZW4uaGFzKHdvcmtlci50b2tlbklkKSkgYnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlci50b2tlbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5QWN0aXZlVG9rZW5JZHMgPSBuZXcgU2V0KGJ5VG9rZW4ua2V5cygpKTtcbiAgICBjb25zdCBlbGlnaWJsZVRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgdGhyZXNob2xkZWRUb2tlbkNvdW50ID0gMDtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKGJ5VG9rZW4uZW50cmllcygpKTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBlbnRyaWVzLm1hcChhc3luYyAoW3Rva2VuSWQsIHRva2VuTmFtZV0pID0+IHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB7XG4gICAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZCkpIHtcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNUb2tlblF1b3RhRWxpZ2libGUodG9rZW5JZCwgdG9rZW5OYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgIGlmIChjaGVjay52YWx1ZS5lbGlnaWJsZSkge1xuICAgICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiBjaGVjay52YWx1ZS50b2tlbk5hbWUsIHRocmVzaG9sZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFt0b2tlbklkLCB0b2tlbk5hbWVdID0gZW50cnk7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkLCB0b2tlbk5hbWUsIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQodG9rZW5JZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyByZWFkeUFjdGl2ZVRva2VuSWRzLCBlbGlnaWJsZVRva2VuSWRzLCBvdmVyVGhyZXNob2xkVG9rZW5zLCB0aHJlc2hvbGRlZFRva2VuQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNUb2tlblF1b3RhRWxpZ2libGUoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHM/OiBTZXQ8bnVtYmVyPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgdG9rZW5NZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b2tlbk1ldGFkYXRhPy5xdW90YVRocmVzaG9sZDtcbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YT8uYWN0aXZlIHx8IHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IHRocmVzaG9sZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSgoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSAhPT0gdG9rZW5NZXRhZGF0YSkgY29udGludWU7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uZWQgPSAhdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5oYXModG9rZW5JZCk7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgICBpZiAodHJhbnNpdGlvbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCkpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YVJlY292ZXJlZCh0b2tlbklkLCB0b2tlbk1ldGFkYXRhLm5hbWUgPz8gdG9rZW5OYW1lLCB0aHJlc2hvbGQsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbk5hbWV9WyR7dG9rZW5JZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YVJlY292ZXJlZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogcmVjb3ZlcmVkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJyZWNvdmVyZWRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxtQkFBbUIsQ0FBQztBQVF2RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFFQSxNQUFN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
|
|
864
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggMX4zLCBoYXJkIGNhcCAyMClcbiAqIC0gaWRsZSB3b3JrZXIgcm91bmQtcm9iaW4g7ISg7YOdICsg7YGQIOuMgOq4sCAo7KCE67aAIGJ1c3kg7IucKVxuICogLSBUb2tlblN1YnNjcmliZXIg7J2067Kk7Yq466GcIHdvcmtlciBwb29sIOuPmeq4sO2ZlFxuICogLSBiYWNrcHJlc3N1cmU6IO2BkCBmdWxsIOuYkOuKlCB0aW1lb3V0IOyLnCBTRVJWRVJfQlVTWVxuICovXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZnJlZW1lbSB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL0dldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLCB0eXBlIFR1cm5SZXF1ZXN0IH0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQge1xuICByZWFkT3BlbkFJUXVvdGFVc2FnZSxcbiAgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0LFxuICB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSxcbn0gZnJvbSBcIi4vb3BlbmFpLXF1b3RhXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIsXG4gIHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyxcbiAgcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcsXG59IGZyb20gXCIuL29wZW5haS13b3JrZXItcG9vbC1jb25maWdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIOyalOyyreydtCDqsozsnbTtirgv7IOd7ISx7JeQIOyLpO2MqO2WiOydhCDrlYzsnZgg6rWs67aE7J6QLlxuLy8gLSBcImdhdGVcIjog7IKs7KCEIOqygOymnSDsi6TtjKgoY2FwYWJpbGl0eS/rqqjrjbgg66mA7Yuw66qo64usIOu2iOy2qeyhsSkg4oCUIHR1cm4g66+47Iuk7ZaJLlxuLy8gLSBcIm5vdF9jYWxsZWRcIjogdHVybiDsnYAg7ISx6rO17ZaI7Jy864KYIOuqqOuNuOydtCBpbWFnZSB0b29sIOydhCDtmLjstpwg7JWIIO2VqCDigJQg7J6s7Iuc64+EIOustOydtSjtlITroaztlITtirgg66y47KCcKS5cbi8vIC0gXCJpbmNvbXBsZXRlXCI6IHRvb2wg7Iuc64+E65CQ7Jy864KYIOyZhOyEsSDsnbTrr7jsp4Ag66+464+E7LCpIOKAlCDsnqzsi5zrj4Qg7ZuE67O0KOyEnOuyhOy4oSDsi6TtjKgv6rGw67aAKS5cbmV4cG9ydCB0eXBlIEltYWdlRmFpbHVyZUtpbmQgPSBcImdhdGVcIiB8IFwibm90X2NhbGxlZFwiIHwgXCJpbmNvbXBsZXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUdlbmVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkga2luZDogSW1hZ2VGYWlsdXJlS2luZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiSW1hZ2VHZW5lcmF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZWFkSG9zdEF2YWlsYWJsZUdpQigpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVhZEZpbGVTeW5jKFwiL3Byb2MvbWVtaW5mb1wiLCBcInV0ZjhcIikubWF0Y2goL15NZW1BdmFpbGFibGU6XFxzKyhcXGQrKVxccytrQiQvbSk7XG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pIC8gMTAyNCAvIDEwMjQ7XG4gIH0gY2F0Y2gge31cbiAgcmV0dXJuIGZyZWVtZW0oKSAvIDEwMjQgLyAxMDI0IC8gMTAyNDtcbn1cblxuLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUg6rOg7KCVKS4g64GE66m0IOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekS5cbmNvbnN0IFRIUkVBRF9SRVVTRV9FTkFCTEVEID0gcHJvY2Vzcy5lbnYuUUdSSURfT1BFTkFJX1RIUkVBRF9SRVVTRSAhPT0gXCJmYWxzZVwiO1xuLy8g7KKM7ZGcIHdvcmtlciDqsIAgYnVzeSDsnbwg65WMIGZyZWUg66W8IOq4sOuLpOumrOuKlCDstZzrjIAg7Iuc6rCELiDstIjqs7wg7IucIOyDiCB0aHJlYWQg66GcIO2PtOuwsS5cbmNvbnN0IFJFVVNFX1dPUktFUl9XQUlUX01TID0gNV8wMDA7XG5jb25zdCBSRVVTRV9XT1JLRVJfUE9MTF9NUyA9IDUwO1xuXG4vLyB3b3JrZXJJZCDtlanshLE6IHRva2VuSWQg7JmAIHdvcmtlckluZGV4KDAuLjE5KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuY29uc3QgT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgPSAxMDA7XG5leHBvcnQgZnVuY3Rpb24gbWFrZU9wZW5BSVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24gcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXG4gIHByb3ZpZGVyOiBzdHJpbmcsXG4gIHRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWxzID0gdG9rZW5zXG4gICAgLm1hcCgodG9rZW4pID0+IGAke3Rva2VuLnRva2VuTmFtZX0gKHRocmVzaG9sZCAke3Rva2VuLnRocmVzaG9sZH0lKWApXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGRldGFpbHMubGVuZ3RoID4gMFxuICAgID8gYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbHN9YFxuICAgIDogYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkYDtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj47XG59O1xuXG50eXBlIFRva2VuTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xuICBhY3RpdmU6IGJvb2xlYW47XG59O1xuXG50eXBlIFRva2VuRWxpZ2liaWxpdHkgPSB7XG4gIHJlYWR5QWN0aXZlVG9rZW5JZHM6IFNldDxudW1iZXI+O1xuICBlbGlnaWJsZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIHRocmVzaG9sZGVkVG9rZW5Db3VudDogbnVtYmVyO1xufTtcblxudHlwZSBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHJlYWRvbmx5IHBvb2xDb25maWc6IE9wZW5BSVdvcmtlclBvb2xDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGFCbG9ja2VkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydGluZ1Rva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhdXRvc2NhbGUgb2Zm64+EIGZpeGVkIG1pbuydmCBoZWFsdGggbWFpbnRlbmFuY2XripQg6rOE7IaNIO2VhOyalO2VmOuLpC5cbiAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICB0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLFxuICAgICk7XG4gICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdGhyZXNob2xkQ2hhbmdlZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoaWQpICE9PSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAodGhyZXNob2xkQ2hhbmdlZCkgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuXG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGV4aXN0aW5nLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhPy5hY3RpdmUpIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHsgLi4ubWV0YWRhdGEsIGFjdGl2ZTogZmFsc2UgfSk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKFxuICAgICAgZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwICYmXG4gICAgICAhdGhpcy5oYXNBY3RpdmVUb2tlbkNhbmRpZGF0ZShleGNsdWRlZFRva2VuSWRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPiAwICYmIGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPj0gTUFYX1FVRVVFX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM6IG5ldyBTZXQoZXhjbHVkZWRUb2tlbklkcyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAvLyBlbGlnaWJpbGl0eSDtmZXsnbjqs7wgcXVldWUg7IK97J6FIOyCrOydtOyXkCB3b3JrZXLqsIAgcmVhZHkvaWRsZeydtCDrkJwg6rK97Jqw7J2YIGxvc3Qgd2FrZS11cOydhFxuICAgICAgLy8g64ur64qU64ukLiBmaXhlZCBtb2Rl7JeQ7ISc64+EIGlkbGUgd29ya2Vy6rCAIOymieyLnCBxdWV1ZeulvCDqsIDsoLjqsIDslbwg7ZWc64ukLlxuICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgICAgaWYgKHdvcmtlcikgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RvcHBlZCAmJlxuICAgICAgICBleHBlY3RlZE1ldGFkYXRhPy5hY3RpdmUgJiZcbiAgICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSA9PT0gZXhwZWN0ZWRNZXRhZGF0YSAmJlxuICAgICAgICAhdGhpcy53b3JrZXJQb29sLmhhcyh0b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHRoaXMud29ya2VyUG9vbC5zZXQodG9rZW5JZCwgd29ya2Vycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB3b3JrZXIub25UZXJtaW5hbEZhaWx1cmUgPSAoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMuaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcikuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgY2xlYW51cCBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgdGhpcy5zd2VlcElkbGVXb3JrZXJUaHJlYWRzKCk7XG4gICAgY29uc3QgbWluaW11bURlZmljaXRUb2tlbklkcyA9IGF3YWl0IHRoaXMuZW5zdXJlTWluaW11bVdvcmtlcnNPbmVTdGVwKCk7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGJhc2VsaW5lIOuzteq1rOulvCDsi5zrj4TtlZwgdG9rZW7rp4wg6rCZ7J2AIGV2YWx1YXRpb27snZggZGVtYW5kIGV4cGFuc2lvbuyXkOyEnCDsoJzsmbjtlZzri6QuXG4gICAgICAvLyDri6Trpbgg7KCV7IOBIHRva2Vu7J2YIO2Zleyepeq5jOyngCDrp4nsp4DripQg7JWK64qU64ukLlxuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcChtaW5pbXVtRGVmaWNpdFRva2VuSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RSZXF1ZXN0QXQgPj0gdGhpcy5wb29sQ29uZmlnLnNjYWxlRG93bklkbGVNcykge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZURvd25PbmVTdGVwKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2NhbGVVcE9uZVN0ZXAoZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLmZpbHRlcigoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIW1ldGFkYXRhLmFjdGl2ZSB8fFxuICAgICAgICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5oYXModG9rZW5JZCkgfHxcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSB8fFxuICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwcm9qZWN0ZWRXb3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnQgKyBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHByb2plY3RlZFJzc0dpQiA9IGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCKHByb2plY3RlZFdvcmtlckNvdW50KTtcbiAgICAgIGlmIChwcm9qZWN0ZWRSc3NHaUIgPiB0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGVzdGltYXRlZCBSU1MgJHtwcm9qZWN0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUIgZXhjZWVkcyAke3RoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3RBdmFpbGFibGVHaUIgPSB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIoKTtcbiAgICAgIGlmIChob3N0QXZhaWxhYmxlR2lCIDwgdGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogaG9zdCBhdmFpbGFibGUgJHtob3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCIGJlbG93ICR7dGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwYXduZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2FuZGlkYXRlcy5tYXAoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHRoaXMuc3Bhd25BbmRDb21taXRXb3JrZXIodG9rZW5JZCwgbWV0YWRhdGEsIHRydWUpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmVNaW5pbXVtV29ya2Vyc09uZVN0ZXAoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGNvbnN0IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm4gbWluaW11bURlZmljaXRUb2tlbklkcztcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUgfHwgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmhhcyh0b2tlbklkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY2FuZGlkYXRlcy5mb3JFYWNoKChbdG9rZW5JZF0pID0+IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMuYWRkKHRva2VuSWQpKTtcblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcCgoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT5cbiAgICAgICAgICB0aGlzLnNwYXduQW5kQ29tbWl0V29ya2VyKHRva2VuSWQsIG1ldGFkYXRhLCBmYWxzZSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSB3b3JrZXIgcG9vbCByZXBhaXJlZDogKyR7YWRkZWR9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsIDFfMDAwKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW5pbXVtRGVmaWNpdFRva2VuSWRzO1xuICB9XG5cbiAgYXN5bmMgc2NhbGVEb3duT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQ6IENvZGV4QXBwU2VydmVyV29ya2VyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdG9rZW5JZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICBpZiAod29ya2Vycy5sZW5ndGggPD0gdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1xuICAgICAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYi53b3JrZXJJbmRleCAtIGEud29ya2VySW5kZXgpXG4gICAgICAgICAgLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5oYXNDYXBhY2l0eSk7XG4gICAgICAgIGlmICghd29ya2VyKSBjb250aW51ZTtcblxuICAgICAgICB0aGlzLndvcmtlclBvb2wuc2V0KFxuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgd29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVtb3ZlZC5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJlbW92ZWQubWFwKCh3b3JrZXIpID0+IHdvcmtlci5raWxsKCkpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgYXV0b3NjYWxlIGRvd246IC0ke3JlbW92ZWQubGVuZ3RofSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsKWApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLndvcmtlckluZGV4KSk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47IGluZGV4KyspIHtcbiAgICAgIGlmICghdXNlZC5oYXMoaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBzd2VlcElkbGVXb3JrZXJUaHJlYWRzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKSkge1xuICAgICAgLy8gdHVybiDspJEgdW5zdWJzY3JpYmXtlZjrqbQg7ZW064u5IGNvbm5lY3Rpb27snLzroZwgbm90aWZpY2F0aW9u7J20IOuNlCDsmKTsp4Ag7JWK7JWEXG4gICAgICAvLyDsi6Ttlokg7KSRIOyalOyyreydtCB0aW1lb3V065CgIOyImCDsnojri6QuIHJlYWR5ICsgaWRsZSB3b3JrZXLrp4wgc3dlZXDtlZzri6QuXG4gICAgICBpZiAod29ya2VyLmlzUmVhZHkgJiYgd29ya2VyLmhhc0NhcGFjaXR5KSB3b3JrZXIuc3dlZXBJZGxlVGhyZWFkcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3Bhd25BbmRDb21taXRXb3JrZXIoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIG1ldGFkYXRhOiBUb2tlbk1ldGFkYXRhLFxuICAgIHJlc3BlY3RRdW90YUJsb2NrOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGV4cGVjdGVkV29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VySW5kZXggPSB0aGlzLm5leHRBdmFpbGFibGVXb3JrZXJJbmRleChleHBlY3RlZFdvcmtlcnMgPz8gW10pO1xuICAgIGlmICh3b3JrZXJJbmRleCA+PSB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgICB0b2tlbklkLFxuICAgICAgbWV0YWRhdGEubmFtZSxcbiAgICAgIG1ldGFkYXRhLmNyZWRlbnRpYWxzLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgKTtcbiAgICBpZiAoIXdvcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICBpZiAoXG4gICAgICAhY3VycmVudE1ldGFkYXRhPy5hY3RpdmUgfHxcbiAgICAgIGN1cnJlbnRNZXRhZGF0YSAhPT0gbWV0YWRhdGEgfHxcbiAgICAgIGN1cnJlbnRXb3JrZXJzICE9PSBleHBlY3RlZFdvcmtlcnMgfHxcbiAgICAgIChyZXNwZWN0UXVvdGFCbG9jayAmJiB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh0b2tlbklkKSkgfHxcbiAgICAgIGN1cnJlbnRXb3JrZXJzPy5zb21lKChlbnRyeSkgPT4gZW50cnkud29ya2VySW5kZXggPT09IHdvcmtlckluZGV4KVxuICAgICkge1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0V29ya2VycyA9IGN1cnJlbnRXb3JrZXJzID8/IFtdO1xuICAgIG5leHRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICBuZXh0V29ya2Vycy5zb3J0KChhLCBiKSA9PiBhLndvcmtlckluZGV4IC0gYi53b3JrZXJJbmRleCk7XG4gICAgaWYgKCFjdXJyZW50V29ya2VycykgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCBuZXh0V29ya2Vycyk7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVdvcmtlclRlcm1pbmFsRmFpbHVyZSh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQod29ya2VyLnRva2VuSWQpO1xuICAgIGlmICghd29ya2Vycz8uaW5jbHVkZXMod29ya2VyKSkgcmV0dXJuO1xuXG4gICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBjdXJyZW50V29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQod29ya2VyLnRva2VuSWQpO1xuICAgIGlmICghY3VycmVudFdvcmtlcnM/LmluY2x1ZGVzKHdvcmtlcikpIHJldHVybjtcbiAgICBjb25zdCByZW1haW5pbmcgPSBjdXJyZW50V29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKTtcbiAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMud29ya2VyUG9vbC5zZXQod29ya2VyLnRva2VuSWQsIHJlbWFpbmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUod29ya2VyLnRva2VuSWQpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcbiAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgcmVtb3ZlZDogJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci53b3JrZXJJbmRleH1dICgke3JlbWFpbmluZy5sZW5ndGh9IHJlbWFpbmluZylgLFxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLmV2YWx1YXRlQXV0b3NjYWxpbmcoKS5jYXRjaCgoZSkgPT5cbiAgICAgIGxvZ2dlci53YXJuKGBvcGVuYWkgYXV0b3NjYWxlIGV2YWx1YXRpb24gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNjYWxpbmcodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNjYWxpbmdQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxpbmdQcm9taXNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsaW5nID0gdGFzaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UgPT09IHNjYWxpbmcpIHRoaXMuc2NhbGluZ1Byb21pc2UgPSBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMuc2NhbGluZ1Byb21pc2UgPSBzY2FsaW5nO1xuICAgIGF3YWl0IHNjYWxpbmc7XG4gIH1cblxuICAvLyDilIDilIAgUmF0ZSBsaW1pdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcmF0ZUxpbWl0c0NhY2hlID0gbmV3IE1hcDxudW1iZXIsIFJhdGVMaW1pdHNDYWNoZUVudHJ5PigpO1xuICBzdGF0aWMgcmVhZG9ubHkgUkFURV9MSU1JVFNfQ0FDSEVfVFRMID0gNjBfMDAwO1xuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgIGNhY2hlZCAmJlxuICAgICAgY2FjaGVkLmdlbmVyYXRpb24gPT09IGdlbmVyYXRpb24gJiZcbiAgICAgIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTFxuICAgICkge1xuICAgICAgcmV0dXJuIHsgZGF0YTogY2FjaGVkLmRhdGEsIGNhY2hlZEF0OiBjYWNoZWQuY2FjaGVkQXQgfTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXSkuZmluZCgodykgPT4gdy5pc1JlYWR5KTtcbiAgICBpZiAoIXdvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhZHkgb3BlbmFpIHdvcmtlcnNcIik7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCB3b3JrZXIuZ2V0UmF0ZUxpbWl0cygpKSBhcyBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlO1xuICAgIGNvbnN0IGVudHJ5OiBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCksIGdlbmVyYXRpb24gfTtcbiAgICBpZiAoKHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwKSA9PT0gZ2VuZXJhdGlvbikge1xuICAgICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuc2V0KHRva2VuSWQsIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YTogZW50cnkuZGF0YSwgY2FjaGVkQXQ6IGVudHJ5LmNhY2hlZEF0IH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3REcmFpblF1ZXVlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5kcmFpblF1ZXVlKCkuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUodG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKHRva2VuSWQpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLnNldChcbiAgICAgIHRva2VuSWQsXG4gICAgICAodGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDApICsgMSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb2tlbk1ldGFkYXRhKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgbmFtZSxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICB3ZWlnaHQsXG4gICAgICBhY3RpdmU6IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpPy5hY3RpdmUgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0FjdGl2ZVRva2VuQ2FuZGlkYXRlKGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5zb21lKFxuICAgICAgKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IG1ldGFkYXRhLmFjdGl2ZSAmJiAhZXhjbHVkZWRUb2tlbklkcy5oYXModG9rZW5JZCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk/LnF1b3RhVGhyZXNob2xkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIHJldHVybiB0aHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0aHJlc2hvbGQgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+KTogUHJvbWlzZTxUb2tlbkVsaWdpYmlsaXR5PiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk7XG4gICAgY29uc3QgYnlUb2tlbiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2Ygd29ya2Vycykge1xuICAgICAgaWYgKCFieVRva2VuLmhhcyh3b3JrZXIudG9rZW5JZCkpIGJ5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXIudG9rZW5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkeUFjdGl2ZVRva2VuSWRzID0gbmV3IFNldChieVRva2VuLmtleXMoKSk7XG4gICAgY29uc3QgZWxpZ2libGVUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGNvbnN0IG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IHRocmVzaG9sZGVkVG9rZW5Db3VudCA9IDA7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbShieVRva2VuLmVudHJpZXMoKSk7XG4gICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgZW50cmllcy5tYXAoYXN5bmMgKFt0b2tlbklkLCB0b2tlbk5hbWVdKSA9PiB7XG4gICAgICAgIGlmIChleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSkge1xuICAgICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudCsrO1xuICAgICAgICAgIHJldHVybiB7IHRva2VuSWQsIHRva2VuTmFtZSwgZWxpZ2libGU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudCsrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgIGVsaWdpYmxlOiBhd2FpdCB0aGlzLmlzVG9rZW5RdW90YUVsaWdpYmxlKHRva2VuSWQsIHRva2VuTmFtZSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY2hlY2tzLmZvckVhY2goKGNoZWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNoZWNrLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICBpZiAoY2hlY2sudmFsdWUuZWxpZ2libGUpIHtcbiAgICAgICAgICBlbGlnaWJsZVRva2VuSWRzLmFkZChjaGVjay52YWx1ZS50b2tlbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICAgIGlmICh0aHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0aHJlc2hvbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnMucHVzaCh7IHRva2VuTmFtZTogY2hlY2sudmFsdWUudG9rZW5OYW1lLCB0aHJlc2hvbGQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCBbdG9rZW5JZCwgdG9rZW5OYW1lXSA9IGVudHJ5O1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgcmVhZHlBY3RpdmVUb2tlbklkcywgZWxpZ2libGVUb2tlbklkcywgb3ZlclRocmVzaG9sZFRva2VucywgdGhyZXNob2xkZWRUb2tlbkNvdW50IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzVG9rZW5RdW90YUVsaWdpYmxlKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBleGNsdWRlZFRva2VuSWRzPzogU2V0PG51bWJlcj4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHRva2VuTWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gdG9rZW5NZXRhZGF0YT8ucXVvdGFUaHJlc2hvbGQ7XG4gICAgICBpZiAoIXRva2VuTWV0YWRhdGE/LmFjdGl2ZSB8fCB0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCB0aHJlc2hvbGQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVzdWx0OiBPcGVuQUlRdW90YVVzYWdlUmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2UoKCkgPT4gdGhpcy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpICE9PSB0b2tlbk1ldGFkYXRhKSBjb250aW51ZTtcblxuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbmVkID0gIXRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpO1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICAgICAgaWYgKHRyYW5zaXRpb25lZCkge1xuICAgICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIHRocmVzaG9sZCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBleGNsdWRlZFRva2VuSWRzPy5hZGQodG9rZW5JZCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFSZWNvdmVyZWQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHJlc3VsdDogRXh0cmFjdDxPcGVuQUlRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA+PSAke3RocmVzaG9sZH0lKWAsXG4gICAgICB7XG4gICAgICAgIHRva2VuSWQsXG4gICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgIHJlc2V0c0F0OiByZXN1bHQucmVzZXRzQXQsXG4gICAgICAgIGxpbWl0SWQ6IHJlc3VsdC5saW1pdElkLFxuICAgICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFSZWNvdmVyZWQoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHJlc3VsdDogRXh0cmFjdDxPcGVuQUlRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IHJlY292ZXJlZCAke3Rva2VuTmFtZX1bJHt0b2tlbklkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPCAke3RocmVzaG9sZH0lKWAsXG4gICAgICB7XG4gICAgICAgIHRva2VuSWQsXG4gICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgIHJlc2V0c0F0OiByZXN1bHQucmVzZXRzQXQsXG4gICAgICAgIGxpbWl0SWQ6IHJlc3VsdC5saW1pdElkLFxuICAgICAgICByZWFzb246IFwicmVjb3ZlcmVkXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZDogbnVtYmVyLCB0b2tlbk5hbWU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgcmVhc29uOiBcImxvb2t1cF9mYWlsX29wZW5cIixcbiAgICAgIGxvb2t1cFJlYXNvbjogcmVhc29uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHk6IFRva2VuRWxpZ2liaWxpdHkpOiBuZXZlciB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgdG9rZW5Db3VudDogZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplLFxuICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50OiBlbGlnaWJpbGl0eS50aHJlc2hvbGRlZFRva2VuQ291bnQsXG4gICAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBlbGlnaWJpbGl0eS5vdmVyVGhyZXNob2xkVG9rZW5zLFxuICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcIm9wZW5haVwiLCBlbGlnaWJpbGl0eS5vdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyb3dzZXIgbG9naW4gZmxvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwZW5kaW5nTG9naW46IHtcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgYXV0aFVybDogc3RyaW5nIH0+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nTG9naW4pIHtcbiAgICAgIHRoaXMucGVuZGluZ0xvZ2luLndvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0xvZ2luLnRpbWVyKTtcbiAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wSWQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBDb2RleEFwcFNlcnZlcldvcmtlcih7XG4gICAgICB0b2tlbklkOiB0ZW1wSWQsXG4gICAgICB0b2tlbk5hbWU6IG5hbWUsXG4gICAgICBhY2Nlc3NUb2tlbjogXCJcIixcbiAgICAgIGFjY291bnRJZDogXCJcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGF1dGhVcmwgPSBhd2FpdCB3b3JrZXIuc3RhcnRCcm93c2VyTG9naW4oKTtcblxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nTG9naW4/LndvcmtlciA9PT0gd29ya2VyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBicm93c2VyIGxvZ2luIHRpbWVvdXQgZm9yICR7bmFtZX0sIGtpbGxpbmcgd29ya2VyYCk7XG4gICAgICAgIHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICB9XG4gICAgfSwgMzAwXzAwMCk7XG5cbiAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IHsgd29ya2VyLCBuYW1lLCB0aW1lciB9O1xuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nTG9naW5OYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdMb2dpbj8ubmFtZSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVCcm93c2VyTG9naW4oKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9PiB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdMb2dpbikgdGhyb3cgbmV3IEVycm9yKFwibm8gcGVuZGluZyBsb2dpblwiKTtcbiAgICBjb25zdCB7IHdvcmtlciwgdGltZXIgfSA9IHRoaXMucGVuZGluZ0xvZ2luO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmtlci53YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTtcbiAgICAgIGNvbnN0IGNyZWRzID0gYXdhaXQgd29ya2VyLnJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTtcbiAgICAgIGlmICghY3JlZHMpIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGFmdGVyIGxvZ2luXCIpO1xuICAgICAgcmV0dXJuIGNyZWRzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCB3b3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHJlYWR5V29ya2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmZpbHRlcigodykgPT4gdy5pc1JlYWR5KS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcXVldWVMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5sZW5ndGg7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2GoO2BsOuzhCDtmITsnqwg7JuM7LukIOyImCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB3b3JrZXJDb3VudHNCeVRva2VuKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ya2VyUG9vbC5lbnRyaWVzKCldXG4gICAgICAubWFwKChbdG9rZW5JZCwgd29ya2Vyc10pID0+ICh7XG4gICAgICAgIG5hbWU6IHdvcmtlcnNbMF0/LnRva2VuTmFtZSA/PyBgdG9rZW4gJHt0b2tlbklkfWAsXG4gICAgICAgIGNvdW50OiB3b3JrZXJzLmxlbmd0aCxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmNvdW50ID4gMClcbiAgICAgIC50b1NvcnRlZCgoYSwgYikg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
|