@dollhousemcp/mcp-server 2.0.39 → 2.0.40
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/CHANGELOG.md +8 -0
- package/dist/cache/CollectionCache.d.ts +1 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +7 -16
- package/dist/cache/CollectionIndexCache.d.ts +1 -1
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -1
- package/dist/cache/CollectionIndexCache.js +3 -2
- package/dist/cache/cachePaths.d.ts +7 -0
- package/dist/cache/cachePaths.d.ts.map +1 -0
- package/dist/cache/cachePaths.js +15 -0
- package/dist/di/Container.js +2 -2
- package/dist/elements/agents/AgentManager.d.ts +121 -1
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +203 -31
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +4 -18
- package/dist/elements/memories/Memory.d.ts +7 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +68 -34
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +10 -2
- package/dist/elements/memories/memoryYamlValidation.d.ts +6 -0
- package/dist/elements/memories/memoryYamlValidation.d.ts.map +1 -0
- package/dist/elements/memories/memoryYamlValidation.js +25 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/CollectionHandler.d.ts.map +1 -1
- package/dist/handlers/CollectionHandler.js +2 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +135 -71
- package/dist/handlers/mcp-aql/OperationSchema.js +4 -4
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +7 -5
- package/dist/portfolio/PortfolioManager.d.ts +5 -1
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +9 -3
- package/dist/security/contentValidator.d.ts +9 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +24 -3
- package/dist/security/secureYamlParser.d.ts +3 -1
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +3 -3
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +6 -4
- package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
- package/dist/storage/MemoryMetadataExtractor.js +7 -2
- package/dist/utils/filesystem.d.ts +6 -0
- package/dist/utils/filesystem.d.ts.map +1 -1
- package/dist/utils/filesystem.js +22 -1
- package/package.json +9 -9
- package/server.json +2 -2
|
@@ -22,6 +22,7 @@ import { SafeRegex } from '../../security/dosProtection.js';
|
|
|
22
22
|
import { logger } from '../../utils/logger.js';
|
|
23
23
|
import { ElementMessages } from '../../utils/elementMessages.js';
|
|
24
24
|
import { ElementNotFoundError } from '../../utils/ErrorHandler.js';
|
|
25
|
+
import { normalizeElementStorageIdentity } from '../../utils/filesystem.js';
|
|
25
26
|
import { sanitizeGatekeeperPolicy } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
|
|
26
27
|
import { SECURITY_LIMITS } from '../../security/constants.js';
|
|
27
28
|
const AGENT_FILE_EXTENSION = '.md';
|
|
@@ -29,6 +30,10 @@ const STATE_DIRECTORY = '.state';
|
|
|
29
30
|
const STATE_FILE_EXTENSION = '.state.yaml';
|
|
30
31
|
const MAX_YAML_SIZE = 64 * 1024;
|
|
31
32
|
const MAX_FILE_SIZE = 100 * 1024;
|
|
33
|
+
/** Match the sanitized storage identity used by agent definition lookup. */
|
|
34
|
+
export function normalizeAgentExecutionIdentity(name) {
|
|
35
|
+
return normalizeElementStorageIdentity(sanitizeInput(name, 100));
|
|
36
|
+
}
|
|
32
37
|
// Issue #83: Centralized active element limits (configurable via env vars)
|
|
33
38
|
import { getActiveElementLimitConfig, getMaxActiveLimit } from '../../config/active-element-limits.js';
|
|
34
39
|
export class AgentManager extends BaseElementManager {
|
|
@@ -38,6 +43,8 @@ export class AgentManager extends BaseElementManager {
|
|
|
38
43
|
validationService;
|
|
39
44
|
serializationService;
|
|
40
45
|
metadataService;
|
|
46
|
+
/** Per-agent tokens retained only while execution or recovery is in flight. */
|
|
47
|
+
executionGenerations = new Map();
|
|
41
48
|
// Track active agents by name (stable identifier)
|
|
42
49
|
activeAgentNames = new Set();
|
|
43
50
|
// Static resolver for element manager lookup (DI pattern)
|
|
@@ -284,15 +291,23 @@ export class AgentManager extends BaseElementManager {
|
|
|
284
291
|
* @returns Agent instance or null if not found
|
|
285
292
|
*/
|
|
286
293
|
async read(name) {
|
|
294
|
+
return this.readWithStatePolicy(name, false);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Read an agent while selecting whether state-storage failures are fatal.
|
|
298
|
+
* Security-sensitive callers use strict state reads so unavailable durable
|
|
299
|
+
* state cannot be mistaken for an agent with no active goals.
|
|
300
|
+
*/
|
|
301
|
+
async readWithStatePolicy(name, strictStateErrors) {
|
|
287
302
|
try {
|
|
288
303
|
const sanitizedName = sanitizeInput(name, 100);
|
|
289
304
|
const filename = this.getFilename(sanitizedName);
|
|
290
|
-
return await this.
|
|
305
|
+
return await this.loadAgentFile(filename, true, strictStateErrors, !strictStateErrors);
|
|
291
306
|
}
|
|
292
307
|
catch (error) {
|
|
293
308
|
if (error.code === 'ENOENT') {
|
|
294
309
|
// Fallback: flexible matching via list scan (#607)
|
|
295
|
-
return this.readFlexibly(name);
|
|
310
|
+
return this.readFlexibly(name, strictStateErrors);
|
|
296
311
|
}
|
|
297
312
|
throw error;
|
|
298
313
|
}
|
|
@@ -309,32 +324,67 @@ export class AgentManager extends BaseElementManager {
|
|
|
309
324
|
* // Flexible fallback matches via metadata name:
|
|
310
325
|
* const agent = await read("legacy-poster"); // resolves via fallback
|
|
311
326
|
*/
|
|
312
|
-
async readFlexibly(name) {
|
|
327
|
+
async readFlexibly(name, strictStateErrors = false) {
|
|
313
328
|
try {
|
|
314
|
-
const
|
|
315
|
-
if (agents.length === 0)
|
|
316
|
-
return null;
|
|
329
|
+
const { candidates, loadFailures } = await this.listForFlexibleRead(strictStateErrors);
|
|
317
330
|
const searchLower = name.toLowerCase();
|
|
318
331
|
const searchSlug = this.normalizeFilename(name);
|
|
319
332
|
// Pass 1: exact case-insensitive match on metadata name
|
|
320
|
-
let match =
|
|
333
|
+
let match = candidates.find(({ agent }) => agent.metadata.name.toLowerCase() === searchLower);
|
|
321
334
|
// Pass 2: slug match (handles dashes, underscores, casing differences)
|
|
322
335
|
if (!match) {
|
|
323
|
-
match =
|
|
324
|
-
const slug = this.normalizeFilename(
|
|
336
|
+
match = candidates.find(({ agent }) => {
|
|
337
|
+
const slug = this.normalizeFilename(agent.metadata.name);
|
|
325
338
|
return slug === searchSlug || slug === searchLower;
|
|
326
339
|
});
|
|
327
340
|
}
|
|
328
341
|
if (match) {
|
|
329
|
-
|
|
342
|
+
// Strict recovery verifies the caller-requested identity. Ordinary legacy
|
|
343
|
+
// reads preserve the state identity associated with the matched file.
|
|
344
|
+
const stateIdentity = strictStateErrors ? name : this.stripExtension(match.filePath);
|
|
345
|
+
const requestedStateFound = await this.hydrateAgentState(match.agent, stateIdentity, strictStateErrors);
|
|
346
|
+
if (strictStateErrors && !requestedStateFound) {
|
|
347
|
+
throw new Error(`Cannot verify durable state for flexibly matched agent "${name}" under its requested identity`);
|
|
348
|
+
}
|
|
349
|
+
logger.warn(`Agent "${name}" resolved via flexible matching to file with metadata name "${match.agent.metadata.name}". ` +
|
|
330
350
|
`Consider renaming the file to match the expected convention (#607).`);
|
|
351
|
+
return match.agent;
|
|
352
|
+
}
|
|
353
|
+
if (loadFailures.length > 0) {
|
|
354
|
+
throw loadFailures[0];
|
|
331
355
|
}
|
|
332
|
-
return match ?? null;
|
|
333
|
-
}
|
|
334
|
-
catch (listError) {
|
|
335
|
-
logger.debug(`Flexible agent lookup failed for "${name}": ${listError}`);
|
|
336
356
|
return null;
|
|
337
357
|
}
|
|
358
|
+
catch (lookupError) {
|
|
359
|
+
logger.debug(`Flexible agent lookup failed for "${name}": ${lookupError}`);
|
|
360
|
+
throw lookupError;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Enumerate fallback candidates without creating missing storage. Strict
|
|
365
|
+
* recovery propagates listing failures; ordinary reads retain the portfolio
|
|
366
|
+
* API's empty-directory and unavailable-directory compatibility behavior.
|
|
367
|
+
*/
|
|
368
|
+
async listForFlexibleRead(strictStateErrors) {
|
|
369
|
+
const files = strictStateErrors
|
|
370
|
+
? await this.portfolioManager.listElements(ElementType.AGENT, { throwOnFilesystemError: true })
|
|
371
|
+
: await this.portfolioManager.listElements(ElementType.AGENT);
|
|
372
|
+
// Load definitions without candidate-filename state. Once a match is known,
|
|
373
|
+
// readFlexibly() hydrates it using the requested logical identity.
|
|
374
|
+
const results = await Promise.allSettled(files.map(file => this.loadAgentFile(file, false, false, false)));
|
|
375
|
+
const candidates = {
|
|
376
|
+
candidates: [],
|
|
377
|
+
loadFailures: []
|
|
378
|
+
};
|
|
379
|
+
for (const [index, result] of results.entries()) {
|
|
380
|
+
if (result.status === 'fulfilled') {
|
|
381
|
+
candidates.candidates.push({ agent: result.value, filePath: files[index] });
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
candidates.loadFailures.push(result.reason);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return candidates;
|
|
338
388
|
}
|
|
339
389
|
/**
|
|
340
390
|
* Update metadata/content for an existing agent.
|
|
@@ -465,6 +515,9 @@ export class AgentManager extends BaseElementManager {
|
|
|
465
515
|
* Load an agent file, enforcing size and format checks.
|
|
466
516
|
*/
|
|
467
517
|
async load(filePath) {
|
|
518
|
+
return this.loadAgentFile(filePath, true, false);
|
|
519
|
+
}
|
|
520
|
+
async loadAgentFile(filePath, hydrateState, strictStateErrors, cacheLoadedElement = true) {
|
|
468
521
|
const sanitizedInput = sanitizeInput(filePath, 255);
|
|
469
522
|
const relativePath = sanitizedInput.endsWith(AGENT_FILE_EXTENSION)
|
|
470
523
|
? sanitizedInput
|
|
@@ -485,8 +538,12 @@ export class AgentManager extends BaseElementManager {
|
|
|
485
538
|
const parsed = this.parseAgentFile(content);
|
|
486
539
|
const metadata = await this.parseMetadata(parsed.metadata);
|
|
487
540
|
const agent = this.createElement(metadata, parsed.content);
|
|
488
|
-
|
|
489
|
-
|
|
541
|
+
if (hydrateState) {
|
|
542
|
+
await this.hydrateAgentState(agent, this.stripExtension(relativePath), strictStateErrors);
|
|
543
|
+
}
|
|
544
|
+
if (cacheLoadedElement) {
|
|
545
|
+
this.cacheElement(agent, relativePath);
|
|
546
|
+
}
|
|
490
547
|
SecurityMonitor.logSecurityEvent({
|
|
491
548
|
type: 'ELEMENT_LOADED',
|
|
492
549
|
severity: 'LOW',
|
|
@@ -726,6 +783,9 @@ export class AgentManager extends BaseElementManager {
|
|
|
726
783
|
// Thread the triggering MCP lifecycle op through validation so error messages
|
|
727
784
|
// can distinguish a fresh execute_agent call from a misused continue_execution.
|
|
728
785
|
context = {}) {
|
|
786
|
+
// Must happen before any await so recovery sees starts from MCP-AQL, legacy
|
|
787
|
+
// tools, and any future caller that uses the shared manager entry point.
|
|
788
|
+
this.beginExecutionAttempt(name);
|
|
729
789
|
try {
|
|
730
790
|
// 1. Load agent by name
|
|
731
791
|
const agent = await this.read(name);
|
|
@@ -917,6 +977,57 @@ export class AgentManager extends BaseElementManager {
|
|
|
917
977
|
logger.error(`Failed to execute agent '${name}':`, error);
|
|
918
978
|
throw error;
|
|
919
979
|
}
|
|
980
|
+
finally {
|
|
981
|
+
this.endExecutionAttempt(name);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
/** Hold a bounded observation lease while stale-policy recovery is in flight. */
|
|
985
|
+
observeExecutionGeneration(name) {
|
|
986
|
+
const key = normalizeAgentExecutionIdentity(name);
|
|
987
|
+
const entry = this.getOrCreateExecutionGeneration(key);
|
|
988
|
+
entry.observers += 1;
|
|
989
|
+
let released = false;
|
|
990
|
+
return {
|
|
991
|
+
token: entry.token,
|
|
992
|
+
release: () => {
|
|
993
|
+
if (released)
|
|
994
|
+
return;
|
|
995
|
+
released = true;
|
|
996
|
+
entry.observers -= 1;
|
|
997
|
+
this.cleanupExecutionGeneration(key, entry);
|
|
998
|
+
},
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
hasExecutionGenerationChanged(name, observedToken) {
|
|
1002
|
+
const entry = this.executionGenerations.get(normalizeAgentExecutionIdentity(name));
|
|
1003
|
+
return !entry || entry.activeExecutions > 0 || entry.token !== observedToken;
|
|
1004
|
+
}
|
|
1005
|
+
beginExecutionAttempt(name) {
|
|
1006
|
+
const key = normalizeAgentExecutionIdentity(name);
|
|
1007
|
+
const entry = this.getOrCreateExecutionGeneration(key);
|
|
1008
|
+
entry.token = {};
|
|
1009
|
+
entry.activeExecutions += 1;
|
|
1010
|
+
}
|
|
1011
|
+
endExecutionAttempt(name) {
|
|
1012
|
+
const key = normalizeAgentExecutionIdentity(name);
|
|
1013
|
+
const entry = this.executionGenerations.get(key);
|
|
1014
|
+
if (!entry)
|
|
1015
|
+
return;
|
|
1016
|
+
entry.activeExecutions = Math.max(0, entry.activeExecutions - 1);
|
|
1017
|
+
this.cleanupExecutionGeneration(key, entry);
|
|
1018
|
+
}
|
|
1019
|
+
getOrCreateExecutionGeneration(key) {
|
|
1020
|
+
let entry = this.executionGenerations.get(key);
|
|
1021
|
+
if (!entry) {
|
|
1022
|
+
entry = { token: {}, activeExecutions: 0, observers: 0 };
|
|
1023
|
+
this.executionGenerations.set(key, entry);
|
|
1024
|
+
}
|
|
1025
|
+
return entry;
|
|
1026
|
+
}
|
|
1027
|
+
cleanupExecutionGeneration(key, entry) {
|
|
1028
|
+
if (entry.activeExecutions === 0 && entry.observers === 0) {
|
|
1029
|
+
this.executionGenerations.delete(key);
|
|
1030
|
+
}
|
|
920
1031
|
}
|
|
921
1032
|
/**
|
|
922
1033
|
* Security validation for template parameters (Issue #103).
|
|
@@ -1375,17 +1486,25 @@ export class AgentManager extends BaseElementManager {
|
|
|
1375
1486
|
* @returns The new state version after successful save
|
|
1376
1487
|
* @protected Only accessible by subclasses (e.g., TestableAgentManager for testing)
|
|
1377
1488
|
*/
|
|
1378
|
-
async saveAgentState(name, state) {
|
|
1379
|
-
|
|
1489
|
+
async saveAgentState(name, state, strictExistingStateErrors = false) {
|
|
1490
|
+
if (strictExistingStateErrors) {
|
|
1491
|
+
await this.assertStateDirectoryAvailable();
|
|
1492
|
+
}
|
|
1493
|
+
else {
|
|
1494
|
+
await this.ensureStateDirectory();
|
|
1495
|
+
}
|
|
1380
1496
|
// FIX: Normalize name for consistent state file naming
|
|
1381
|
-
const normalizedName =
|
|
1497
|
+
const normalizedName = normalizeElementStorageIdentity(name);
|
|
1382
1498
|
const filePath = path.join(this.stateDir, `${normalizedName}${STATE_FILE_EXTENSION}`);
|
|
1383
1499
|
// FIX (Issue #107 - CRIT-2): Acquire file lock to prevent TOCTOU race condition
|
|
1384
1500
|
// The lock covers the entire read-compare-write sequence to ensure atomicity
|
|
1385
1501
|
await this.fileLockManager.withLock(`agent-state:${normalizedName}`, async () => {
|
|
1386
1502
|
// FIX: Optimistic locking check (Issue #24)
|
|
1387
1503
|
// Load existing state to compare versions before overwriting
|
|
1388
|
-
const existingState = await this.loadAgentState(name);
|
|
1504
|
+
const existingState = await this.loadAgentState(name, strictExistingStateErrors);
|
|
1505
|
+
if (strictExistingStateErrors && !existingState) {
|
|
1506
|
+
throw new Error(`Agent state disappeared while completing goal for '${name}'`);
|
|
1507
|
+
}
|
|
1389
1508
|
if (existingState && existingState.stateVersion !== undefined && state.stateVersion !== undefined) {
|
|
1390
1509
|
// Check if our state is based on the current version
|
|
1391
1510
|
// If versions don't match, it means another process updated the state
|
|
@@ -1443,20 +1562,23 @@ export class AgentManager extends BaseElementManager {
|
|
|
1443
1562
|
? filePath.slice(0, -AGENT_FILE_EXTENSION.length)
|
|
1444
1563
|
: filePath;
|
|
1445
1564
|
}
|
|
1446
|
-
async hydrateAgentState(agent, name) {
|
|
1447
|
-
const state = await this.loadAgentState(name);
|
|
1565
|
+
async hydrateAgentState(agent, name, strictStateErrors = false) {
|
|
1566
|
+
const state = await this.loadAgentState(name, strictStateErrors);
|
|
1448
1567
|
if (!state) {
|
|
1449
|
-
return;
|
|
1568
|
+
return false;
|
|
1450
1569
|
}
|
|
1451
1570
|
const serialized = JSON.parse(agent.serializeToJSON());
|
|
1452
1571
|
serialized.state = state;
|
|
1453
1572
|
agent.deserialize(JSON.stringify(serialized));
|
|
1454
1573
|
agent.markStatePersisted();
|
|
1574
|
+
return true;
|
|
1455
1575
|
}
|
|
1456
|
-
async loadAgentState(name) {
|
|
1576
|
+
async loadAgentState(name, strictStateErrors = false) {
|
|
1457
1577
|
// FIX: Normalize name for consistent state file lookups
|
|
1458
|
-
const normalizedName =
|
|
1459
|
-
|
|
1578
|
+
const normalizedName = normalizeElementStorageIdentity(name);
|
|
1579
|
+
// Security-sensitive state checks must re-read durable storage rather than
|
|
1580
|
+
// trusting a possibly stale process cache.
|
|
1581
|
+
if (!strictStateErrors && this.stateCache.has(normalizedName)) {
|
|
1460
1582
|
return this.stateCache.get(normalizedName);
|
|
1461
1583
|
}
|
|
1462
1584
|
const stateFilename = `${normalizedName}${STATE_FILE_EXTENSION}`;
|
|
@@ -1473,17 +1595,41 @@ export class AgentManager extends BaseElementManager {
|
|
|
1473
1595
|
const state = result.data;
|
|
1474
1596
|
this.normalizeLoadedState(state);
|
|
1475
1597
|
// FIX: Use normalized name as cache key for consistent lookups
|
|
1476
|
-
|
|
1598
|
+
if (!strictStateErrors) {
|
|
1599
|
+
this.stateCache.set(normalizedName, state);
|
|
1600
|
+
}
|
|
1477
1601
|
return state;
|
|
1478
1602
|
}
|
|
1479
1603
|
catch (error) {
|
|
1480
1604
|
if (error.code === 'ENOENT') {
|
|
1605
|
+
if (strictStateErrors) {
|
|
1606
|
+
await this.assertStateDirectoryAvailable();
|
|
1607
|
+
}
|
|
1481
1608
|
return null;
|
|
1482
1609
|
}
|
|
1483
1610
|
logger.error(`Failed to load agent state: ${name}`, error);
|
|
1611
|
+
if (strictStateErrors) {
|
|
1612
|
+
throw error;
|
|
1613
|
+
}
|
|
1484
1614
|
return null;
|
|
1485
1615
|
}
|
|
1486
1616
|
}
|
|
1617
|
+
/**
|
|
1618
|
+
* Distinguish a legitimately absent per-agent state file from unavailable
|
|
1619
|
+
* state storage. Strict recovery may treat only the former as empty state.
|
|
1620
|
+
*/
|
|
1621
|
+
async assertStateDirectoryAvailable() {
|
|
1622
|
+
try {
|
|
1623
|
+
const stats = await this.fileOperations.stat(this.stateDir);
|
|
1624
|
+
if (!stats.isDirectory()) {
|
|
1625
|
+
throw new Error('Agent state storage path is not a directory');
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
catch (error) {
|
|
1629
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
1630
|
+
throw new Error(`Agent state directory unavailable: ${reason}`);
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1487
1633
|
async ensureStateDirectory() {
|
|
1488
1634
|
await this.fileOperations.createDirectory(this.stateDir);
|
|
1489
1635
|
}
|
|
@@ -2265,8 +2411,17 @@ export class AgentManager extends BaseElementManager {
|
|
|
2265
2411
|
* @since v2.0.0 - Agentic Loop Redesign
|
|
2266
2412
|
*/
|
|
2267
2413
|
async completeAgentGoal(params) {
|
|
2414
|
+
return this.completeAgentGoalWithStatePolicy(params, false);
|
|
2415
|
+
}
|
|
2416
|
+
/** Complete an exact durable goal without consulting ordinary state caches. */
|
|
2417
|
+
async completeAgentGoalForRecovery(params) {
|
|
2418
|
+
return this.completeAgentGoalWithStatePolicy(params, true);
|
|
2419
|
+
}
|
|
2420
|
+
async completeAgentGoalWithStatePolicy(params, strictStateErrors) {
|
|
2268
2421
|
// 1. Load agent by name
|
|
2269
|
-
const agent =
|
|
2422
|
+
const agent = strictStateErrors
|
|
2423
|
+
? await this.readWithStatePolicy(params.agentName, true)
|
|
2424
|
+
: await this.read(params.agentName);
|
|
2270
2425
|
if (!agent) {
|
|
2271
2426
|
// FIX: Issue #275 - Throw ElementNotFoundError for consistent error handling
|
|
2272
2427
|
throw new ElementNotFoundError('Agent', params.agentName);
|
|
@@ -2288,6 +2443,9 @@ export class AgentManager extends BaseElementManager {
|
|
|
2288
2443
|
? `Goal '${params.goalId}' not found`
|
|
2289
2444
|
: `No in-progress goal found for agent '${params.agentName}'`);
|
|
2290
2445
|
}
|
|
2446
|
+
if (strictStateErrors && goal.status !== 'in_progress') {
|
|
2447
|
+
throw new Error(`Goal '${goal.id}' changed while aborting agent '${params.agentName}'`);
|
|
2448
|
+
}
|
|
2291
2449
|
// 3. Record final decision with summary
|
|
2292
2450
|
agent.recordDecision({
|
|
2293
2451
|
goalId: goal.id,
|
|
@@ -2302,7 +2460,14 @@ export class AgentManager extends BaseElementManager {
|
|
|
2302
2460
|
const metrics = agent.getPerformanceMetrics();
|
|
2303
2461
|
// 6. Save agent state
|
|
2304
2462
|
const completeSanitizedName = sanitizeInput(params.agentName, 100);
|
|
2305
|
-
|
|
2463
|
+
if (strictStateErrors) {
|
|
2464
|
+
const newVersion = await this.saveAgentState(completeSanitizedName, agent.getState(), true);
|
|
2465
|
+
agent[COMMIT_PERSISTED_VERSION](newVersion);
|
|
2466
|
+
agent.markStatePersisted();
|
|
2467
|
+
}
|
|
2468
|
+
else {
|
|
2469
|
+
await this.save(agent, this.getFilename(completeSanitizedName));
|
|
2470
|
+
}
|
|
2306
2471
|
// 7. Return goal, metrics, and state
|
|
2307
2472
|
const updatedState = agent.getState();
|
|
2308
2473
|
const completedGoal = updatedState.goals.find(g => g.id === goal.id);
|
|
@@ -2340,8 +2505,15 @@ export class AgentManager extends BaseElementManager {
|
|
|
2340
2505
|
* @since v2.0.0 - Agentic Loop Redesign
|
|
2341
2506
|
*/
|
|
2342
2507
|
async getAgentState(params) {
|
|
2508
|
+
return this.getAgentStateWithPolicy(params, false);
|
|
2509
|
+
}
|
|
2510
|
+
/** Strict durable-state variant reserved for stale-policy recovery. */
|
|
2511
|
+
async getAgentStateForRecovery(params) {
|
|
2512
|
+
return this.getAgentStateWithPolicy(params, true);
|
|
2513
|
+
}
|
|
2514
|
+
async getAgentStateWithPolicy(params, strictStateErrors) {
|
|
2343
2515
|
// 1. Load agent by name
|
|
2344
|
-
const agent = await this.
|
|
2516
|
+
const agent = await this.readWithStatePolicy(params.agentName, strictStateErrors);
|
|
2345
2517
|
if (!agent) {
|
|
2346
2518
|
// FIX: Issue #275 - Throw ElementNotFoundError for consistent error handling
|
|
2347
2519
|
throw new ElementNotFoundError('Agent', params.agentName);
|
|
@@ -2528,4 +2700,4 @@ export class AgentManager extends BaseElementManager {
|
|
|
2528
2700
|
return suggestions;
|
|
2529
2701
|
}
|
|
2530
2702
|
}
|
|
2531
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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U0FBUyxDQUN0RSxDQUFDO1FBQ0YsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUzthQUNuQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixXQUFXLENBQUMsSUFBSSxDQUFDLHNCQUFzQixjQUFjLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ2VudE1hbmFnZXIgLSBSZWZhY3RvcmVkIHRvIGV4dGVuZCBCYXNlRWxlbWVudE1hbmFnZXJcbiAqIE1hbmFnZXMgYWdlbnQgQ1JVRCBvcGVyYXRpb25zLCBtZXRhZGF0YSBzYW5pdGl6YXRpb24sIGFuZCBzdGF0ZSBwZXJzaXN0ZW5jZS5cbiAqL1xuXG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuL0FnZW50LmpzJztcbmltcG9ydCB7XG4gIENPTU1JVF9QRVJTSVNURURfVkVSU0lPTixcbiAgQUdFTlRfTElNSVRTLFxuICBSSVNLX1RPTEVSQU5DRV9MRVZFTFMsXG4gIFNURVBfTElNSVRfQUNUSU9OUyxcbiAgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUyxcbiAgQkFDS09GRl9TVFJBVEVHSUVTLFxuICBpc09uZU9mLFxuICBub3JtYWxpemVBdXRvbm9teUtleXMsXG4gIG5vcm1hbGl6ZVJlc2lsaWVuY2VLZXlzLFxuICBub3JtYWxpemVHb2FsS2V5cyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgQWdlbnRNZXRhZGF0YSxcbiAgQWdlbnRTdGF0ZSxcbiAgRXhlY3V0ZUFnZW50UmVzdWx0LFxuICBBZ2VudEdvYWxDb25maWcsXG4gIEFnZW50R29hbFBhcmFtZXRlcixcbiAgQWdlbnRNZXRhZGF0YVYyLFxuICBBZ2VudEdvYWwsXG4gIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQXV0b25vbXlEaXJlY3RpdmUsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0R2F0aGVyZWREYXRhLCB0eXBlIEdhdGhlcmVkRGF0YSB9IGZyb20gJy4vZ2F0aGVyZWREYXRhLmpzJztcbmltcG9ydCB7IGV2YWx1YXRlQXV0b25vbXkgfSBmcm9tICcuL2F1dG9ub215RXZhbHVhdG9yLmpzJztcbmltcG9ydCB7XG4gIGlzVjFBZ2VudCxcbiAgY29udmVydFYxVG9WMixcbn0gZnJvbSAnLi92MVRvVjJDb252ZXJ0ZXIuanMnO1xuaW1wb3J0IHtcbiAgZGV0ZXJtaW5lU2FmZXR5VGllcixcbiAgY3JlYXRlVmVyaWZpY2F0aW9uQ2hhbGxlbmdlLFxuICBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0LFxuICBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uLFxuICBjcmVhdGVFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICcuL3NhZmV0eVRpZXJTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IHRvU2luZ3VsYXJMYWJlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZVBhdGggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBJbnB1dE5vcm1hbGl6ZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dE5vcm1hbGl6ZXIuanMnO1xuaW1wb3J0IHsgU2FmZVJlZ2V4IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZG9zUHJvdGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1RyaWdnZXJWYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRWxlbWVudE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudE1lc3NhZ2VzLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IEFHRU5UX0ZJTEVfRVhURU5TSU9OID0gJy5tZCc7XG5jb25zdCBTVEFURV9ESVJFQ1RPUlkgPSAnLnN0YXRlJztcbmNvbnN0IFNUQVRFX0ZJTEVfRVhURU5TSU9OID0gJy5zdGF0ZS55YW1sJztcbmNvbnN0IE1BWF9ZQU1MX1NJWkUgPSA2NCAqIDEwMjQ7XG5jb25zdCBNQVhfRklMRV9TSVpFID0gMTAwICogMTAyNDtcblxuLy8gSXNzdWUgIzgzOiBDZW50cmFsaXplZCBhY3RpdmUgZWxlbWVudCBsaW1pdHMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMpXG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcsIGdldE1heEFjdGl2ZUxpbWl0IH0gZnJvbSAnLi4vLi4vY29uZmlnL2FjdGl2ZS1lbGVtZW50LWxpbWl0cy5qcyc7XG5cbmludGVyZmFjZSBFbGVtZW50Q3JlYXRpb25SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGVsZW1lbnQ/OiBBZ2VudDtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZEFnZW50RmlsZSB7XG4gIG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbnR5cGUgQWdlbnRDcmVhdGVNZXRhZGF0YSA9IChQYXJ0aWFsPEFnZW50TWV0YWRhdGE+ICYgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KSAmIHtcbiAgY29udGVudD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBBZ2VudE1hbmFnZXIgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXI8QWdlbnQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZURpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlQ2FjaGU6IE1hcDxzdHJpbmcsIEFnZW50U3RhdGU+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2U7XG4gIC8vIFRyYWNrIGFjdGl2ZSBhZ2VudHMgYnkgbmFtZSAoc3RhYmxlIGlkZW50aWZpZXIpXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlQWdlbnROYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gU3RhdGljIHJlc29sdmVyIGZvciBlbGVtZW50IG1hbmFnZXIgbG9va3VwIChESSBwYXR0ZXJuKVxuICAvLyBUaGlzIGFsbG93cyBBZ2VudCBpbnN0YW5jZXMgdG8gcmVzb2x2ZSBtYW5hZ2VycyB3aXRob3V0IHRpZ2h0IGNvdXBsaW5nXG4gIHByaXZhdGUgc3RhdGljIGVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXI/OiAobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55O1xuXG4gIC8vIElzc3VlICM0MDI6IFN0YXRpYyByZXNvbHZlciBmb3IgRGFuZ2VyWm9uZUVuZm9yY2VyIChESSBwYXR0ZXJuKVxuICBwcml2YXRlIHN0YXRpYyBkYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcj86ICgpID0+IGltcG9ydCgnLi90eXBlcy5qcycpLkRhbmdlclpvbmVCbG9ja2VyO1xuXG4gIC8vIElzc3VlICMxNDI6IFN0YXRpYyByZXNvbHZlciBmb3IgVmVyaWZpY2F0aW9uU3RvcmUgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIHZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXI/OiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBiYXNlRGlyOiBzdHJpbmcsXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBjb25zdCBlbGVtZW50RGlyT3ZlcnJpZGUgPSBwYXRoLmpvaW4oYmFzZURpciwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgIHN1cGVyKEVsZW1lbnRUeXBlLkFHRU5ULCBwb3J0Zm9saW9NYW5hZ2VyLCBmaWxlTG9ja01hbmFnZXIsIHsgZWxlbWVudERpck92ZXJyaWRlLCBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuc3RhdGVEaXIgPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBTVEFURV9ESVJFQ1RPUlkpO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gICAgdGhpcy5tZXRhZGF0YVNlcnZpY2UgPSBtZXRhZGF0YVNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhZ2VudCc7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgZm9yIGVsZW1lbnQtYWdub3N0aWMgYWN0aXZhdGlvblxuICAgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvblxuICAgKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgTWVtb3J5LmNvbmZpZ3VyZU1lbW9yeU1hbmFnZXJSZXNvbHZlclxuICAgKlxuICAgKiBAcGFyYW0gcmVzb2x2ZXIgRnVuY3Rpb24gdGhhdCB0YWtlcyBhIG1hbmFnZXIgbmFtZSBhbmQgcmV0dXJucyB0aGUgbWFuYWdlciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKHJlc29sdmVyOiAobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNDAyOiBTZXQgRGFuZ2VyWm9uZUVuZm9yY2VyIHJlc29sdmVyIGZvciBESSBpbmplY3Rpb24uXG4gICAqIENhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0RGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IGltcG9ydCgnLi90eXBlcy5qcycpLkRhbmdlclpvbmVCbG9ja2VyKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzE0MjogU2V0IFZlcmlmaWNhdGlvblN0b3JlIHJlc29sdmVyIGZvciBESSBpbmplY3Rpb24uXG4gICAqIENhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4geyBzZXQ6IChpZDogc3RyaW5nLCBjaGFsbGVuZ2U6IHsgY29kZTogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfSkgPT4gdm9pZCB9KTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpOiAoKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueSkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzdGF0aWMgcmVzb2x2ZXJzIChmb3IgdGVzdCBjbGVhbnVwKVxuICAgKiBDYWxsIHRoaXMgaW4gYWZ0ZXJFYWNoIGhvb2tzIHRvIHByZXZlbnQgdGVzdCBpc29sYXRpb24gaXNzdWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc2V0UmVzb2x2ZXJzKCk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGFnZW50cyBhbmQgc3RhdGUgZmlsZXMuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5zdGF0ZURpcik7XG4gICAgbG9nZ2VyLmluZm8oJ0FnZW50TWFuYWdlciBpbml0aWFsaXplZCcsIHsgcGF0aDogdGhpcy5lbGVtZW50RGlyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBhZ2VudCBvbiBkaXNrLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IEFnZW50Q3JlYXRlTWV0YWRhdGFcbiAgKTogUHJvbWlzZTxFbGVtZW50Q3JlYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBnb2FsIGlucHV0IGJlZm9yZSB2YWxpZGF0aW9uIC0gTExNcyBtYXkgcGFzcyBzdHJpbmcgb3Igb2JqZWN0XG4gICAgICAvLyBTdHJpcCAnY29udGVudCcgZnJvbSBtZXRhZGF0YSB0byBwcmV2ZW50IGl0IGZyb20gb3ZlcndyaXRpbmcgdGhlIHBvc2l0aW9uYWxcbiAgICAgIC8vIGNvbnRlbnQgcGFyYW0gKHdoaWNoIGlzIHRoZSBhZ2VudCdzIGluc3RydWN0aW9ucyB0ZXh0KSBpbiB0aGUgdmFsaWRhdGlvbiBjYWxsLlxuICAgICAgY29uc3QgeyBjb250ZW50OiByZWZlcmVuY2VDb250ZW50LCAuLi5tZXRhZGF0YVdpdGhvdXRDb250ZW50IH0gPSBtZXRhZGF0YSA/PyB7fTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+ID0ge1xuICAgICAgICAuLi5tZXRhZGF0YVdpdGhvdXRDb250ZW50XG4gICAgICB9O1xuICAgICAgaWYgKG1ldGFkYXRhPy5nb2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9ybWFsaXplZE1ldGFkYXRhLmdvYWwgPSB0aGlzLm5vcm1hbGl6ZUdvYWxJbnB1dChcbiAgICAgICAgICBtZXRhZGF0YS5nb2FsIGFzIHN0cmluZyB8IFBhcnRpYWw8QWdlbnRHb2FsQ29uZmlnPlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgICAgLy8gQWdlbnRzIHN1cHBvcnQgZHVhbC1maWVsZCBjcmVhdGlvbjogYmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgYW5kIG9wdGlvbmFsXG4gICAgICAvLyByZWZlcmVuY2UgY29udGVudC4gVmFsaWRhdGlvbiBwcmVmZXJzIGJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIHdoZW4gYm90aFxuICAgICAgLy8gZmllbGRzIGFyZSBwcmVzZW50IHNvIGV4aXN0aW5nIGluc3RydWN0aW9uLWZpcnN0IGFnZW50cyBrZWVwIHRoZWlyXG4gICAgICAvLyBjdXJyZW50IHNlbWFudGljcyB3aGlsZSBjb250ZW50LW9ubHkgYWdlbnRzIHN0aWxsIHZhbGlkYXRlIGNvcnJlY3RseS5cbiAgICAgIGNvbnN0IHZhbGlkYXRpb25JbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAuLi5ub3JtYWxpemVkTWV0YWRhdGFcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmltYXJ5VGV4dCA9IHRoaXMuZ2V0UHJpbWFyeVZhbGlkYXRpb25UZXh0KGNvbnRlbnQsIHJlZmVyZW5jZUNvbnRlbnQpO1xuICAgICAgdmFsaWRhdGlvbklucHV0LmNvbnRlbnQgPSBwcmltYXJ5VGV4dCA/PyAnJztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh2YWxpZGF0aW9uSW5wdXQpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBjcmVhdGlvbiB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbml0aXplIGlucHV0cyBmb3IgZWxlbWVudCBjcmVhdGlvblxuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApO1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGNvbnN0IHNhbml0aXplZEluc3RydWN0aW9ucyA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKHNhbml0aXplZE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgYWdlbnQgbmFtZS4gVXNlIG9ubHkgbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLidcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgICAuLi5ub3JtYWxpemVkTWV0YWRhdGEsXG4gICAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvblxuICAgICAgfSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICBhZ2VudC5tZXRhZGF0YS5hdXRob3IgPSBub3JtYWxpemVkTWV0YWRhdGE/LmF1dGhvciA/PyB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogbm9ybWFsaXplZE1ldGFkYXRhPy5zcGVjaWFsaXphdGlvbnMgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zID8/IFtdLFxuICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogbm9ybWFsaXplZE1ldGFkYXRhPy5kZWNpc2lvbkZyYW1ld29yayA/PyBhZ2VudC5leHRlbnNpb25zPy5kZWNpc2lvbkZyYW1ld29yayxcbiAgICAgICAgcmlza1RvbGVyYW5jZTogbm9ybWFsaXplZE1ldGFkYXRhPy5yaXNrVG9sZXJhbmNlID8/IGFnZW50LmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogbm9ybWFsaXplZE1ldGFkYXRhPy5sZWFybmluZ0VuYWJsZWQgPz8gYWdlbnQuZXh0ZW5zaW9ucz8ubGVhcm5pbmdFbmFibGVkLFxuICAgICAgfTtcbiAgICAgIC8vIFByb21vdGUgaW5zdHJ1Y3Rpb25zIHRvIGZpcnN0LWNsYXNzIHByb3BlcnR5IChubyBsb25nZXIgaW4gZXh0ZW5zaW9ucylcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEFsc28ga2VlcCBpbiBleHRlbnNpb25zIGZvciBiYWNrd2FyZCBjb21wYXQgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIGFnZW50LmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuXG4gICAgICAvLyBTZXQgcmVmZXJlbmNlIGNvbnRlbnQgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZCBhcmNoaXRlY3R1cmUpXG4gICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoXG4gICAgICAgICAgcmVmZXJlbmNlQ29udGVudCxcbiAgICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7KGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnMgfHwgWydDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkJ10pLmpvaW4oJywgJyl9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYWdlbnQuY29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3Mjc6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgVjIgZmllbGRzIEJFRk9SRSBhc3NpZ25tZW50LlxuICAgICAgLy8gVGhpcyBpcyB0aGUgU0VDT05EIHZhbGlkYXRpb24gbGF5ZXIg4oCUIEFnZW50RWxlbWVudFZhbGlkYXRvciAoY2FsbGVkIGFib3ZlIHZpYVxuICAgICAgLy8gdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUpIGlzIHRoZSBmaXJzdC4gVGhlIHZhbGlkYXRvciBjYXRjaGVzIGNhbWVsQ2FzZVxuICAgICAgLy8gaW52YWxpZCB2YWx1ZXM7IHRoaXMgbWV0aG9kIGFsc28gbm9ybWFsaXplcyBzbmFrZV9jYXNlIGtleXMgKHdoaWNoIHRoZSB2YWxpZGF0b3JcbiAgICAgIC8vIGRvZXNuJ3Qgc2VlKSBhbmQgdmFsaWRhdGVzIHRoZW0uIEJvdGggbGF5ZXJzIGFyZSBuZWVkZWQuIFNlZSBJc3N1ZSAjNzMwLlxuICAgICAgY29uc3QgbWV0YWRhdGFWMiA9IG5vcm1hbGl6ZWRNZXRhZGF0YSBhcyBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWV0YWRhdGFWMikge1xuICAgICAgICBjb25zdCB2MkVycm9ycyA9IHRoaXMudmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YVYyKTtcbiAgICAgICAgaWYgKHYyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVjIgZmllbGQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7djJFcnJvcnMuam9pbignOyAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWMiBGSUVMRFM6IFN0b3JlIFYyLXNwZWNpZmljIGZpZWxkcyBpbiBhZ2VudCBtZXRhZGF0YSAobm90IGp1c3QgZXh0ZW5zaW9ucylcbiAgICAgIC8vIFRoaXMgZW5hYmxlcyBWMiBhZ2VudCBjcmVhdGlvbiB2aWEgTUNQLUFRTCBjcmVhdGVfZWxlbWVudCBvcGVyYXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nb2FsKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdvYWwgPSBtZXRhZGF0YVYyLmdvYWw7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYWN0aXZhdGVzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnRvb2xzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuc3lzdGVtUHJvbXB0ID0gbWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYXV0b25vbXkpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzQ0OTogUGVyc2lzdCBnYXRla2VlcGVyIHBvbGljeSBmb3IgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCBkdXJpbmcgZXhlY3V0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzcyMjogUGVyc2lzdCByZXNpbGllbmNlIHBvbGljeSAod2FzIG1pc3NpbmcgZnJvbSBWMiBmaWVsZCBhc3NpZ25tZW50cylcbiAgICAgIGlmIChtZXRhZGF0YVYyPy5yZXNpbGllbmNlKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdBZ2VudHMuZmluZChhID0+XG4gICAgICAgIGEubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyaWFsaXplIHRoZSBhZ2VudCBjb250ZW50IGZpcnN0XG4gICAgICBjb25zdCBzZXJpYWxpemVkQ29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuXG4gICAgICAvLyBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBjaGVjay10aGVuLXdyaXRlIHBhdHRlcm4gd2l0aCBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVGaWxlRXhjbHVzaXZlKGFic29sdXRlUGF0aCwgc2VyaWFsaXplZENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgZWxlbWVudCBhZnRlciBzdWNjZXNzZnVsIGNyZWF0aW9uXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChhZ2VudCwgZmlsZW5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQoZmlsZW5hbWUsIGFic29sdXRlUGF0aCk7XG4gICAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBjYWNoZUVsZW1lbnQoKSBzdG9yZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgICAgLy8gU2VlIElzc3VlICM0OTEgZm9yIHdoeSBQZXJzb25hTWFuYWdlcidzIHJlbG9hZC1hZnRlci1jcmVhdGUgd2FzIHJlbW92ZWQuXG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgY3JlYXRlZGAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGFnZW50SWQ6IGFnZW50LmlkIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBg8J+kliAqKiR7c2FuaXRpemVkTmFtZX0qKiBieSAke2FnZW50Lm1ldGFkYXRhLmF1dGhvciB8fCAnYW5vbnltb3VzJ31gLFxuICAgICAgICBlbGVtZW50OiBhZ2VudFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFnZW50JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuIGFnZW50IGJ5IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBBZ2VudCBuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICogQHJldHVybnMgQWdlbnQgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIHJlYWQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWQoZmlsZW5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IGZsZXhpYmxlIG1hdGNoaW5nIHZpYSBsaXN0IHNjYW4gKCM2MDcpXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGbGV4aWJseShuYW1lKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayBmb3IgcmVhZCgpIHdoZW4gZGlyZWN0IGZpbGUgbG9va3VwIGZhaWxzLlxuICAgKiBTZWFyY2hlcyBsb2FkZWQgYWdlbnRzIGJ5IG1ldGFkYXRhIG5hbWUgdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgc2x1ZyBtYXRjaGluZy5cbiAgICogTG9ncyBhIHdhcm5pbmcgd2hlbiBhIG1hdGNoIGlzIGZvdW5kIChpbmRpY2F0ZXMgZmlsZW5hbWUvbmFtZSBtaXNtYXRjaCBuZWVkaW5nIGNsZWFudXApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGaWxlIG9uIGRpc2s6IFwibGVnYWN5LXBvc3Rlci1hZ2VudC5tZFwiXG4gICAqIC8vIE1ldGFkYXRhIG5hbWU6IFwibGVnYWN5LXBvc3RlclwiXG4gICAqIC8vIERpcmVjdCBsb29rdXAgZm9yIFwibGVnYWN5LXBvc3Rlci5tZFwiIGZhaWxzIChFTk9FTlQpXG4gICAqIC8vIEZsZXhpYmxlIGZhbGxiYWNrIG1hdGNoZXMgdmlhIG1ldGFkYXRhIG5hbWU6XG4gICAqIGNvbnN0IGFnZW50ID0gYXdhaXQgcmVhZChcImxlZ2FjeS1wb3N0ZXJcIik7IC8vIHJlc29sdmVzIHZpYSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkRmxleGlibHkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBpZiAoYWdlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoU2x1ZyA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG5cbiAgICAgIC8vIFBhc3MgMTogZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBvbiBtZXRhZGF0YSBuYW1lXG4gICAgICBsZXQgbWF0Y2ggPSBhZ2VudHMuZmluZChcbiAgICAgICAgKGEpID0+IGEubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWFyY2hMb3dlclxuICAgICAgKTtcblxuICAgICAgLy8gUGFzcyAyOiBzbHVnIG1hdGNoIChoYW5kbGVzIGRhc2hlcywgdW5kZXJzY29yZXMsIGNhc2luZyBkaWZmZXJlbmNlcylcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgbWF0Y2ggPSBhZ2VudHMuZmluZCgoYSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGEubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHNsdWcgPT09IHNlYXJjaFNsdWcgfHwgc2x1ZyA9PT0gc2VhcmNoTG93ZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFnZW50IFwiJHtuYW1lfVwiIHJlc29sdmVkIHZpYSBmbGV4aWJsZSBtYXRjaGluZyB0byBmaWxlIHdpdGggbWV0YWRhdGEgbmFtZSBcIiR7bWF0Y2gubWV0YWRhdGEubmFtZX1cIi4gYCArXG4gICAgICAgICAgYENvbnNpZGVyIHJlbmFtaW5nIHRoZSBmaWxlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBjb252ZW50aW9uICgjNjA3KS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXRjaCA/PyBudWxsO1xuICAgIH0gY2F0Y2ggKGxpc3RFcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGbGV4aWJsZSBhZ2VudCBsb29rdXAgZmFpbGVkIGZvciBcIiR7bmFtZX1cIjogJHtsaXN0RXJyb3J9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGFkYXRhL2NvbnRlbnQgZm9yIGFuIGV4aXN0aW5nIGFnZW50LlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+LFxuICAgIGNvbnRlbnQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChzYW5pdGl6ZWROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICBsb2dnZXIud2FybihgQWdlbnQgbm90IGZvdW5kIGZvciB1cGRhdGU6ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBlZGl0IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVFZGl0KGFnZW50LCB7XG4gICAgICAuLi51cGRhdGVzLFxuICAgICAgY29udGVudFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQWdlbnQgdXBkYXRlIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IHVwZGF0ZSB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFxuICAgICAgICBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1cGRhdGVzLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgNTAwXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnNwZWNpYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zLm1hcChpdGVtID0+IHNhbml0aXplSW5wdXQoaXRlbSwgNTApKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZWNpc2lvbkZyYW1ld29yayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogdXBkYXRlcy5kZWNpc2lvbkZyYW1ld29ya1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IHVwZGF0ZXMucmlza1RvbGVyYW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5sZWFybmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgbGVhcm5pbmdFbmFibGVkOiB1cGRhdGVzLmxlYXJuaW5nRW5hYmxlZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQubWV0YWRhdGEubWF4Q29uY3VycmVudEdvYWxzID0gdXBkYXRlcy5tYXhDb25jdXJyZW50R29hbHM7XG4gICAgfVxuXG4gICAgYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBVc2UgQ29udGVudFZhbGlkYXRvciBmb3IgbXVsdGktbGluZSBjb250ZW50IHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgKG5ld2xpbmVzLCB0YWJzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgZGV0ZWN0aW5nIHByb21wdCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH0pO1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKSk7XG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IHVwZGF0ZWQ6ICR7c2FuaXRpemVkTmFtZX1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHByb3ZpZGVkIGFnZW50IG5hbWUuXG4gICAqL1xuICB2YWxpZGF0ZU5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGJlIGVtcHR5JyB9O1xuICAgIH1cblxuICAgIGlmIChuYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShuYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05hbWUgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGFnZW50IGZyb20gc2VyaWFsaXplZCBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0RWxlbWVudChkYXRhOiBzdHJpbmcsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlSnNvbihkYXRhLCB7XG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChwYXJzZWQubWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAgIGlmIChwYXJzZWQuc3RhdGUpIHtcbiAgICAgICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkocGFyc2VkKSk7XG4gICAgICB9XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IHBhcnNlZC5pbnN0cnVjdGlvbnMgfHwgJydcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBwYXJzaW5nXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiByZXN1bHQuY29udGVudC50cmltKClcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gYWdlbnQgdG8gSlNPTiBvciBtYXJrZG93biAoZGVmYXVsdCkuXG4gICAqL1xuICBhc3luYyBleHBvcnRFbGVtZW50KGFnZW50OiBBZ2VudCwgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gYWdlbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhZ2VudCBmaWxlLCBlbmZvcmNpbmcgc2l6ZSBhbmQgZm9ybWF0IGNoZWNrcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRJbnB1dCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gc2FuaXRpemVkSW5wdXQuZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplZElucHV0XG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChzYW5pdGl6ZWRJbnB1dCwgMTAwKSk7XG5cbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVQYXRoKHJlbGF0aXZlUGF0aCwgdGhpcy5lbGVtZW50RGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWdlbnQgcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IE1BWF9GSUxFX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBmaWxlIGV4Y2VlZHMgbWF4aW11bSBzaXplIG9mICR7TUFYX0ZJTEVfU0laRX0gYnl0ZXNgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZUFnZW50RmlsZShjb250ZW50KTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5tZXRhZGF0YSk7XG4gICAgICBjb25zdCBhZ2VudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChhZ2VudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuaHlkcmF0ZUFnZW50U3RhdGUoYWdlbnQsIHRoaXMuc3RyaXBFeHRlbnNpb24ocmVsYXRpdmVQYXRoKSk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGAsXG4gICAgICAgIGRldGFpbHM6IGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gbG9hZGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgZnJvbSAke2Z1bGxQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUgdG8gcGVyc2lzdCBzdGF0ZSB3aGVuIHJlcXVpcmVkLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShhZ2VudDogQWdlbnQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcbiAgICBhd2FpdCBzdXBlci5zYXZlKGFnZW50LCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIGlmIChhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUodGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKSwgYWdlbnQuZ2V0U3RhdGUoKSk7XG4gICAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pOyAgLy8gU3luYyBhZ2VudCdzIGludGVybmFsIHZlcnNpb24gKElzc3VlICMxMjMgZml4KVxuICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYWdlbnQgc3RhdGUgdG8gZGlzayAocHVibGljIEFQSSBmb3IgZXh0ZXJuYWwgY2FsbGVycykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBwcm9wZXIgd2F5IGZvciBleHRlcm5hbCBjb2RlIChzdHJhdGVnaWVzLCBoYW5kbGVycykgdG9cbiAgICogdHJpZ2dlciBzdGF0ZSBwZXJzaXN0ZW5jZS4gSXQgaW1wbGVtZW50cyB0aGUgT3B0aW9uIEMgcGF0dGVybiBmcm9tIElzc3VlICMxMjM6XG4gICAqIHN0YXRlVmVyc2lvbiBpcyBvbmx5IGluY3JlbWVudGVkIG9uIHN1Y2Nlc3NmdWwgc2F2ZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBBZ2VudCBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj4gLSBUcnVlIGlmIHN0YXRlIHdhcyBwZXJzaXN0ZWQsIGZhbHNlIGlmIG5vdCBuZWVkZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhZ2VudCBub3QgZm91bmQgb3Igc2F2ZSBmYWlsc1xuICAgKi9cbiAgYXN5bmMgcGVyc2lzdFN0YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgbm90IGZvdW5kOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKG5hbWUsIGFnZW50LmdldFN0YXRlKCkpO1xuICAgIGFnZW50W0NPTU1JVF9QRVJTSVNURURfVkVSU0lPTl0obmV3VmVyc2lvbik7XG4gICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIHJlbW92ZSBhc3NvY2lhdGVkIHN0YXRlIGZpbGUuXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIHRvIGVuc3VyZSBzdGF0ZSBmaWxlIGRlbGV0aW9uIG1hdGNoZXNcbiAgICogdGhlIG5vcm1hbGl6ZWQgZmlsZW5hbWUgdXNlZCBmb3Igc3RhdGUgZmlsZSBjcmVhdGlvbi9sb2FkaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKTtcbiAgICBhd2FpdCBzdXBlci5kZWxldGUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgZGVsZXRpb25cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhY2sgdXAgdGhlIHN0YXRlIGZpbGUgYmVmb3JlIGRlbGV0aW5nIGl0XG4gICAgICBpZiAodGhpcy5iYWNrdXBTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm1vdmVkT3JpZ2luYWwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShzdGF0ZVBhdGgsIEVsZW1lbnRUeXBlLkFHRU5ULCB7XG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgY2FjaGUgY2xlYW51cFxuICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICByZXR1cm4gc3VwZXIuZXhpc3RzKHNhbml0aXplZFBhdGgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmFsaWRhdGVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0YXJnZXRQYXRoLmluY2x1ZGVzKCcuLicpIHx8IHRhcmdldFBhdGguaW5jbHVkZXMoJ34nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0UGF0aC5zdGFydHNXaXRoKCcvJykgfHwgL15bQS1aYS16XTovLnRlc3QodGFyZ2V0UGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFHRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVBZ2VudE5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBhY3RpdmUgc3RhdHVzIHRvIGFnZW50cyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldCAoYnkgbmFtZSlcbiAgICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5oYXMoYWdlbnQubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGFnZW50IHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgYWdlbnQ/OiBBZ2VudCB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIC8vIEFkZCB0byBhY3RpdmUgc2V0IChieSBuYW1lLCB3aGljaCBpcyBzdGFibGUgYWNyb3NzIHJlbG9hZHMpXG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmFkZChhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGdvYWxDb3VudDogKGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogYWdlbnQubWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSksXG4gICAgICBhZ2VudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVBZ2VudChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0FHRU5UX0RFQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGRlYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkFHRU5ULCBhZ2VudC5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgYWdlbnRzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maWx0ZXIoYSA9PiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGEubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gYWdlbnQgd2l0aCBnb2FsIHBhcmFtZXRlcnNcbiAgICpcbiAgICogUmV0dXJucyBjb250ZXh0IGZvciBMTE0gdG8gZHJpdmUgdGhlIGFnZW50aWMgbG9vcC5cbiAgICogVGhpcyBtZXRob2Q6XG4gICAqIDEuIExvYWRzIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uXG4gICAqIDIuIFZhbGlkYXRlcyBhbmQgcmVuZGVycyB0aGUgZ29hbCB0ZW1wbGF0ZSB3aXRoIHBhcmFtZXRlcnNcbiAgICogMy4gQWN0aXZhdGVzIGNvbmZpZ3VyZWQgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIDQuIEV2YWx1YXRlcyBwcm9ncmFtbWF0aWMgY29uc3RyYWludHMgYW5kIHJpc2tcbiAgICogNS4gUmV0dXJucyBzdHJ1Y3R1cmVkIGNvbnRleHQgZm9yIExMTVxuICAgKlxuICAgKiBUaGUgTExNIHRoZW4gZHJpdmVzIHRoZSBhZ2VudGljIGxvb3AgdXNpbmcgdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC8vIFRocmVhZCB0aGUgdHJpZ2dlcmluZyBNQ1AgbGlmZWN5Y2xlIG9wIHRocm91Z2ggdmFsaWRhdGlvbiBzbyBlcnJvciBtZXNzYWdlc1xuICAgIC8vIGNhbiBkaXN0aW5ndWlzaCBhIGZyZXNoIGV4ZWN1dGVfYWdlbnQgY2FsbCBmcm9tIGEgbWlzdXNlZCBjb250aW51ZV9leGVjdXRpb24uXG4gICAgY29udGV4dDoge1xuICAgICAgb3BlcmF0aW9uTmFtZT86ICdleGVjdXRlX2FnZW50JyB8ICdjb250aW51ZV9leGVjdXRpb24nO1xuICAgIH0gPSB7fVxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycywge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGNvbnRleHQub3BlcmF0aW9uTmFtZSA/PyAnZXhlY3V0ZV9hZ2VudCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gNC4gUmVuZGVyIGdvYWwgdGVtcGxhdGUgYnkgcmVwbGFjaW5nIHtwYXJhbWV0ZXJ9IHBsYWNlaG9sZGVyc1xuICAgICAgY29uc3QgcmVuZGVyZWRHb2FsID0gdGhpcy5yZW5kZXJHb2FsVGVtcGxhdGUobWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDRiLiBEZXRlY3QgdW5tYXRjaGVkIHBsYWNlaG9sZGVycyBhZnRlciByZW5kZXJpbmcgKElzc3VlICMxMjYpXG4gICAgICBjb25zdCB1bm1hdGNoZWRQbGFjZWhvbGRlcnMgPSB0aGlzLmRldGVjdFVubWF0Y2hlZFBsYWNlaG9sZGVycyhyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHVubWF0Y2hlZFBsYWNlaG9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdVbm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXJzIGRldGVjdGVkIGFmdGVyIHJlbmRlcmluZycsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgdW5tYXRjaGVkOiB1bm1hdGNoZWRQbGFjZWhvbGRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHQgQkVGT1JFIGFjdGl2YXRpbmcgZWxlbWVudHMgKElzc3VlICMxMDkgLSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KG5hbWUpO1xuXG4gICAgICAvLyA1Yi4gU3RhdGljIGFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIChJc3N1ZSAjMzc0KVxuICAgICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcz8uYWdlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gYXdhaXQgdGhpcy5kZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKG5hbWUsIG1ldGFkYXRhLmFjdGl2YXRlcy5hZ2VudHMpO1xuICAgICAgICBpZiAoY3ljbGVQYXRoKSB7XG4gICAgICAgICAgY29uc3QgY3ljbGVTdGFydCA9IGN5Y2xlUGF0aC5pbmRleE9mKGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIGNvbnN0IGN5Y2xlID0gY3ljbGVQYXRoLnNsaWNlKGN5Y2xlU3RhcnQpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihBZ2VudE1hbmFnZXIuZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBBY3RpdmF0ZSBlbGVtZW50cyAoZWxlbWVudC1hZ25vc3RpYylcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+PiA9IHt9O1xuICAgICAgY29uc3QgYWN0aXZhdGlvbldhcm5pbmdzOiBBcnJheTx7IGVsZW1lbnRUeXBlOiBzdHJpbmc7IGVsZW1lbnROYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZWxlbWVudE5hbWVzXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50TmFtZXMgfHwgZWxlbWVudE5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHNbZWxlbWVudFR5cGVdID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnROYW1lIG9mIGVsZW1lbnROYW1lcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudENvbnRlbnQgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRDb250ZW50KGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZXhlY3V0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50Q29udGVudFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIEhJR0gtMTogUmUtdGhyb3cgY2lyY3VsYXIgYWN0aXZhdGlvbiBlcnJvcnMgaW1tZWRpYXRlbHkgKElzc3VlICMxMDkpXG4gICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0NpcmN1bGFyIGFnZW50IGFjdGl2YXRpb24gZGV0ZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgYWN0aXZhdGlvbldhcm5pbmdzLnB1c2goeyBlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfSc6IGZhaWxlZCB0byBhY3RpdmF0ZSAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nIOKAlCAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBlbGVtZW50cyByYXRoZXIgdGhhbiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNy4gQnVpbGQgdGhlIHJlc3VsdCB3aXRoIGFsbCBjb250ZXh0IChpbml0aWFsaXplIHdpdGggZGVmYXVsdCBzYWZldHkgdGllcilcbiAgICAgIGNvbnN0IHJlc3VsdDogRXhlY3V0ZUFnZW50UmVzdWx0ID0ge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIGdvYWw6IHJlbmRlcmVkR29hbCxcbiAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgIGFjdGl2YXRpb25XYXJuaW5nczogYWN0aXZhdGlvbldhcm5pbmdzLmxlbmd0aCA+IDAgPyBhY3RpdmF0aW9uV2FybmluZ3MgOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIElzc3VlICMxMjY6IFdhcm4gYWJvdXQgdW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyc1xuICAgICAgICB0ZW1wbGF0ZVdhcm5pbmdzOiB1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gdW5tYXRjaGVkUGxhY2Vob2xkZXJzLm1hcChwID0+IGBVbm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXI6IHske3B9fWApXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzOiBtZXRhZGF0YS50b29scz8uYWxsb3dlZCB8fCBbXSxcbiAgICAgICAgc3VjY2Vzc0NyaXRlcmlhOiBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXSxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQsXG4gICAgICAgIHNhZmV0eVRpZXI6ICdhZHZpc29yeScsIC8vIERlZmF1bHQsIHdpbGwgYmUgdXBkYXRlZCBiZWxvd1xuICAgICAgfTtcblxuICAgICAgLy8gOC4gQ3JlYXRlIGFuZCBwZXJzaXN0IHRoZSBnb2FsIGZvciBMTE0gdHJhY2tpbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHJlY29yZF9hZ2VudF9zdGVwIHRvIGZpbmQgYW5kIHVwZGF0ZSB0aGUgZ29hbFxuXG4gICAgICAvLyBDcmVhdGUgdGhlIGdvYWwgdXNpbmcgYWdlbnQuYWRkR29hbCgpIHdoaWNoIGhhbmRsZXMgdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uXG4gICAgICBjb25zdCBuZXdHb2FsID0gYWdlbnQuYWRkR29hbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIHByaW9yaXR5OiAnbWVkaXVtJyxcbiAgICAgICAgaW1wb3J0YW5jZTogNSxcbiAgICAgICAgdXJnZW5jeTogNSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgZ29hbCBzdGF0dXMgdG8gaW5fcHJvZ3Jlc3Mgc2luY2UgZXhlY3V0aW9uIGhhcyBzdGFydGVkXG4gICAgICBuZXdHb2FsLnN0YXR1cyA9ICdpbl9wcm9ncmVzcyc7XG5cbiAgICAgIGNvbnN0IGV4ZWNTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKGV4ZWNTYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAgIC8vIFN0b3JlIGdvYWxJZCBpbiByZXN1bHQgZm9yIExMTSB0byB1c2Ugd2l0aCByZWNvcmRfYWdlbnRfc3RlcFxuICAgICAgcmVzdWx0LmdvYWxJZCA9IG5ld0dvYWwuaWQ7XG5cbiAgICAgIC8vIEZpeCAjNDQ1OiBJbmNsdWRlIHN0YXRlVmVyc2lvbiBzbyBzdWJzZXF1ZW50IGNhbGxzIGNhbiBkbyB2ZXJzaW9uLWF3YXJlIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHBvc3RTYXZlU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgICAgcmVzdWx0LnN0YXRlVmVyc2lvbiA9IHBvc3RTYXZlU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDE7XG5cbiAgICAgIC8vIENhbGwgdmFsaWRhdGVHb2FsU2VjdXJpdHkgYW5kIGFkZCB3YXJuaW5ncyB0byByZXN1bHRcbiAgICAgIGNvbnN0IHNlY3VyaXR5VmFsaWRhdGlvbiA9IGFnZW50LnZhbGlkYXRlR29hbFNlY3VyaXR5KHJlbmRlcmVkR29hbCk7XG4gICAgICBpZiAoc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzICYmIHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzID0gc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGV2YWx1YXRlQ29uc3RyYWludHMgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5jb25zdHJhaW50cyA9IGFnZW50LmV2YWx1YXRlQ29uc3RyYWludHMobmV3R29hbCk7XG5cbiAgICAgIC8vIENhbGwgYXNzZXNzUmlzayBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnJpc2tBc3Nlc3NtZW50ID0gYWdlbnQuYXNzZXNzUmlzaygnZXhlY3V0ZScsIG5ld0dvYWwsIHt9KTtcblxuICAgICAgLy8gQ2FsbCBjYWxjdWxhdGVQcmlvcml0eVNjb3JlIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQucHJpb3JpdHlTY29yZSA9IGFnZW50LmNhbGN1bGF0ZVByaW9yaXR5U2NvcmUobmV3R29hbCk7XG5cbiAgICAgIC8vIDkuIERldGVybWluZSBzYWZldHkgdGllciBiYXNlZCBvbiByaXNrIGFzc2Vzc21lbnQgYW5kIHNlY3VyaXR5IHdhcm5pbmdzXG4gICAgICAvLyAoTm90ZTogZXhlY3V0aW9uQ29udGV4dCBhbHJlYWR5IGNyZWF0ZWQgZWFybGllciBmb3IgY2lyY3VsYXIgZGV0ZWN0aW9uKVxuICAgICAgY29uc3Qgc2FmZXR5VGllclJlc3VsdCA9IGRldGVybWluZVNhZmV0eVRpZXIoXG4gICAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudD8uc2NvcmUgfHwgMCxcbiAgICAgICAgcmVzdWx0LnNlY3VyaXR5V2FybmluZ3MgfHwgW10sXG4gICAgICAgIHJlbmRlcmVkR29hbCxcbiAgICAgICAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICAgICAgICBleGVjdXRpb25Db250ZXh0XG4gICAgICApO1xuXG4gICAgICAvLyAxMC4gU2V0IHNhZmV0eSB0aWVyIGFuZCByZWxhdGVkIGZpZWxkc1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXIgPSBzYWZldHlUaWVyUmVzdWx0LnRpZXI7XG4gICAgICByZXN1bHQuc2FmZXR5VGllclJlc3VsdCA9IHNhZmV0eVRpZXJSZXN1bHQ7XG4gICAgICByZXN1bHQuZXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG5cbiAgICAgIC8vIDExLiBBZGQgdGllci1zcGVjaWZpYyByZXNwb25zZXNcbiAgICAgIHN3aXRjaCAoc2FmZXR5VGllclJlc3VsdC50aWVyKSB7XG4gICAgICAgIGNhc2UgJ2NvbmZpcm0nOlxuICAgICAgICAgIHJlc3VsdC5jb25maXJtYXRpb25SZXF1aXJlZCA9IGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QoXG4gICAgICAgICAgICAnT3BlcmF0aW9uIHJlcXVpcmVzIGNvbmZpcm1hdGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3ZlcmlmeSc6XG4gICAgICAgICAgcmVzdWx0LnZlcmlmaWNhdGlvblJlcXVpcmVkID0gY3JlYXRlVmVyaWZpY2F0aW9uQ2hhbGxlbmdlKFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzLmpvaW4oJzsgJyksXG4gICAgICAgICAgICAnZGlzcGxheV9jb2RlJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZGFuZ2VyX3pvbmUnOlxuICAgICAgICAgIHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZCA9IGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24oXG4gICAgICAgICAgICAnYWdlbnRfZXhlY3V0aW9uJyxcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgREVGQVVMVF9TQUZFVFlfQ09ORklHLmRhbmdlclpvbmUuZW5hYmxlZFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQWxzbyBhZGQgdmVyaWZpY2F0aW9uIGlmIG5vdCBibG9ja2VkXG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQuYmxvY2tlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnZlcmlmaWNhdGlvblJlcXVpcmVkID0gcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLnZlcmlmaWNhdGlvblJlcXVpcmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhZHZpc29yeSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gTm8gYWRkaXRpb25hbCBhY3Rpb24gbmVlZGVkIGZvciBhZHZpc29yeSB0aWVyXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50JyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50IGV4ZWN1dGVkOiAke25hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfSAoc2FmZXR5OiAke3NhZmV0eVRpZXJSZXN1bHQudGllcn0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICBzYWZldHlUaWVyOiBzYWZldHlUaWVyUmVzdWx0LnRpZXIsXG4gICAgICAgICAgcmlza1Njb3JlOiBzYWZldHlUaWVyUmVzdWx0LnJpc2tTY29yZSxcbiAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzIHx8IHt9KSxcbiAgICAgICAgICBnb2FsQ291bnQ6IChtZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IHZhbGlkYXRpb24gZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgKElzc3VlICMxMDMpLlxuICAgKiBDaGVja3MgZm9yIHByb3RvdHlwZSBwb2xsdXRpb24sIFVuaWNvZGUgaW5qZWN0aW9uLCBhbmQgb3ZlcnNpemVkIHBheWxvYWRzLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gMS4gUHJvdG90eXBlIHBvbGx1dGlvbiBjaGVjayDigJQgcmVqZWN0IGRhbmdlcm91cyBrZXlzXG4gICAgY29uc3QgRk9SQklEREVOX0tFWVMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKSkge1xuICAgICAgaWYgKEZPUkJJRERFTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnZhbGlkYXRlUGFyYW1ldGVyU2VjdXJpdHknLFxuICAgICAgICAgIGRldGFpbHM6IGBQcm90b3R5cGUgcG9sbHV0aW9uIGF0dGVtcHQgdmlhIHBhcmFtZXRlciBrZXk6ICcke2tleX0nYCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yYmlkZGVuIHBhcmFtZXRlciBrZXk6ICcke2tleX0nIChwb3RlbnRpYWwgcHJvdG90eXBlIHBvbGx1dGlvbilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBMaW1pdCBwYXJhbWV0ZXIgY291bnQgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uXG4gICAgY29uc3QgTUFYX1BBUkFNRVRFUlMgPSA1MDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoID4gTUFYX1BBUkFNRVRFUlMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vIG1hbnkgcGFyYW1ldGVyczogJHtPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAke01BWF9QQVJBTUVURVJTfWApO1xuICAgIH1cblxuICAgIC8vIDMuIFVuaWNvZGUgbm9ybWFsaXphdGlvbiB2aWEgSW5wdXROb3JtYWxpemVyXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IElucHV0Tm9ybWFsaXplci5ub3JtYWxpemUocGFyYW1ldGVycywgJyQucGFyYW1ldGVycycpO1xuICAgIGlmIChub3JtYWxpemVkLmhhc0hpZ2hPckNyaXRpY2FsSXNzdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUZW1wbGF0ZSBwYXJhbWV0ZXIgc2VjdXJpdHkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7bm9ybWFsaXplZC5lcnJvcnMuam9pbignOyAnKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IG5vcm1hbGl6ZWQgdmFsdWVzIGJhY2sgKGluLXBsYWNlLCBzaW5jZSB3ZSBhbHJlYWR5IGNsb25lZClcbiAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IG5vcm1hbGl6ZWQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhub3JtYWxpemVkRGF0YSkpIHtcbiAgICAgIHBhcmFtZXRlcnNba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdUZW1wbGF0ZSBwYXJhbWV0ZXIgbm9ybWFsaXphdGlvbiB3YXJuaW5ncycsIHtcbiAgICAgICAgd2FybmluZ3M6IG5vcm1hbGl6ZWQud2FybmluZ3MsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcGFyYW1ldGVycyBhZ2FpbnN0IGdvYWwgcGFyYW1ldGVyIHNjaGVtYVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtZXRlcnMoXG4gICAgZ29hbENvbmZpZzogQWdlbnRHb2FsQ29uZmlnLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIGFnZW50TmFtZT86IHN0cmluZztcbiAgICAgIG9wZXJhdGlvbk5hbWU/OiAnZXhlY3V0ZV9hZ2VudCcgfCAnY29udGludWVfZXhlY3V0aW9uJztcbiAgICB9ID0ge31cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1EZWZzID0gZ29hbENvbmZpZy5wYXJhbWV0ZXJzIHx8IFtdO1xuICAgIGNvbnN0IHJlcXVpcmVkUGFyYW1OYW1lcyA9IHBhcmFtRGVmc1xuICAgICAgLmZpbHRlcihwYXJhbURlZiA9PiBwYXJhbURlZi5yZXF1aXJlZClcbiAgICAgIC5tYXAocGFyYW1EZWYgPT4gcGFyYW1EZWYubmFtZSk7XG5cbiAgICAvLyBDaGVjayBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuICAgIGNvbnN0IG1pc3NpbmdSZXF1aXJlZCA9IHJlcXVpcmVkUGFyYW1OYW1lcy5maWx0ZXIocGFyYW1OYW1lID0+ICEocGFyYW1OYW1lIGluIHBhcmFtZXRlcnMpKTtcbiAgICBpZiAobWlzc2luZ1JlcXVpcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgdGhpcy5mb3JtYXRNaXNzaW5nUmVxdWlyZWRQYXJhbWV0ZXJzRXJyb3IoXG4gICAgICAgICAgbWlzc2luZ1JlcXVpcmVkLFxuICAgICAgICAgIHJlcXVpcmVkUGFyYW1OYW1lcyxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVHlwZSBjaGVjayBwcm92aWRlZCBwYXJhbWV0ZXJzXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgIGNvbnN0IHBhcmFtRGVmID0gcGFyYW1EZWZzLmZpbmQocCA9PiBwLm5hbWUgPT09IGtleSk7XG4gICAgICBpZiAoIXBhcmFtRGVmKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmtub3duIHBhcmFtZXRlciAnJHtrZXl9JyBwcm92aWRlZCB0byBhZ2VudGApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdzdHJpbmcnICYmIGFjdHVhbFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdudW1iZXInICYmIGFjdHVhbFR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBudW1iZXIsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdib29sZWFuJyAmJiBhY3R1YWxUeXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBZHZpc29yeSBsZW5ndGggd2FybmluZyBmb3Igc3RyaW5nIHZhbHVlcyAoZGVmZW5zZS1pbi1kZXB0aCwgZG9lcyBub3QgdGhyb3cpXG4gICAgICBpZiAoYWN0dWFsVHlwZSA9PT0gJ3N0cmluZycgJiYgKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSCkge1xuICAgICAgICBsb2dnZXIud2FybignUGFyYW1ldGVyIHN0cmluZyB2YWx1ZSBleGNlZWRzIE1BWF9HT0FMX0xFTkdUSCAoYWR2aXNvcnkpJywge1xuICAgICAgICAgIHBhcmFtTmFtZToga2V5LFxuICAgICAgICAgIHZhbHVlTGVuZ3RoOiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RILFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgcGFyYW1ldGVycyBub3QgcHJvdmlkZWRcbiAgICBmb3IgKGNvbnN0IHBhcmFtRGVmIG9mIHBhcmFtRGVmcykge1xuICAgICAgaWYgKCFwYXJhbURlZi5yZXF1aXJlZCAmJiAhKHBhcmFtRGVmLm5hbWUgaW4gcGFyYW1ldGVycykgJiYgcGFyYW1EZWYuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcmFtZXRlcnNbcGFyYW1EZWYubmFtZV0gPSBwYXJhbURlZi5kZWZhdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBhY3Rpb25hYmxlIG1pc3NpbmctcGFyYW1ldGVyIGVycm9yIGZvciBleGVjdXRlL2NvbnRpbnVlIGNhbGxzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRNaXNzaW5nUmVxdWlyZWRQYXJhbWV0ZXJzRXJyb3IoXG4gICAgbWlzc2luZ1JlcXVpcmVkOiBzdHJpbmdbXSxcbiAgICByZXF1aXJlZFBhcmFtTmFtZXM6IHN0cmluZ1tdLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIGFnZW50TmFtZT86IHN0cmluZztcbiAgICAgIG9wZXJhdGlvbk5hbWU/OiAnZXhlY3V0ZV9hZ2VudCcgfCAnY29udGludWVfZXhlY3V0aW9uJztcbiAgICB9XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgYWdlbnRTdWZmaXggPSBjb250ZXh0LmFnZW50TmFtZSA/IGAgZm9yIGFnZW50ICcke2NvbnRleHQuYWdlbnROYW1lfSdgIDogJyc7XG4gICAgbGV0IG1lc3NhZ2UgPVxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyR7YWdlbnRTdWZmaXh9OiAke21pc3NpbmdSZXF1aXJlZC5qb2luKCcsICcpfS5gO1xuXG4gICAgaWYgKHJlcXVpcmVkUGFyYW1OYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXNzYWdlICs9IGAgUmVxdWlyZWQgZ29hbCBwYXJhbWV0ZXJzOiAke3JlcXVpcmVkUGFyYW1OYW1lcy5qb2luKCcsICcpfS5gO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgKz0gJyBEaXNjb3ZlciB0aGUgZnVsbCBleGVjdXRpb24gY29udHJhY3QgdmlhIG1jcF9hcWxfcmVhZCBpbnRyb3NwZWN0OiAnICtcbiAgICAgICd7IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIsIG5hbWU6IFwiZXhlY3V0ZV9hZ2VudFwiIH0gfS4nO1xuXG4gICAgaWYgKGNvbnRleHQub3BlcmF0aW9uTmFtZSA9PT0gJ2NvbnRpbnVlX2V4ZWN1dGlvbicpIHtcbiAgICAgIG1lc3NhZ2UgKz0gJyBJZiB5b3UgYXJlIHJlcG9ydGluZyBwcm9ncmVzcyBhZnRlciBleGVjdXRlX2FnZW50LCB1c2UgJyArXG4gICAgICAgICdtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgaW5zdGVhZC4gY29udGludWVfZXhlY3V0aW9uIGlzIG9ubHkgJyArXG4gICAgICAgICdmb3IgcmVzdW1pbmcgYSBwcmV2aW91c2x5IHBhdXNlZCBleGVjdXRpb24gYW5kIHN0aWxsIHJlcXVpcmVzIHRoZSBzYW1lICcgK1xuICAgICAgICAnZ29hbCBwYXJhbWV0ZXJzIGFzIGV4ZWN1dGVfYWdlbnQuJztcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgZ29hbCB0ZW1wbGF0ZSBieSByZXBsYWNpbmcge3BhcmFtZXRlcn0gcGxhY2Vob2xkZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckdvYWxUZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlbmRlcmVkID0gdGVtcGxhdGU7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgIC8vIEVzY2FwZSBrZXkgdG8gcHJldmVudCByZWdleCBtZXRhY2hhcmFjdGVycyBmcm9tIGNhdXNpbmcgUmVEb1MgKElzc3VlICMxMDMpXG4gICAgICBjb25zdCBlc2NhcGVkS2V5ID0gU2FmZVJlZ2V4LmVzY2FwZShrZXkpO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtlc2NhcGVkS2V5fVxcXFx9YCwgJ2cnKSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gQ2FwIHJlbmRlcmVkIGdvYWwgbGVuZ3RoIHRvIHByZXZlbnQgb3ZlcnNpemVkIHBheWxvYWRzXG4gICAgaWYgKHJlbmRlcmVkLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZW5kZXJlZCBnb2FsIGV4Y2VlZHMgTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RILCB0cnVuY2F0aW5nJywge1xuICAgICAgICByZW5kZXJlZExlbmd0aDogcmVuZGVyZWQubGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgsXG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQuc3Vic3RyaW5nKDAsIEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgpO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgdW5tYXRjaGVkIHtwbGFjZWhvbGRlcn0gcGF0dGVybnMgcmVtYWluaW5nIGFmdGVyIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogUmV0dXJucyBhcnJheSBvZiBwbGFjZWhvbGRlciBuYW1lcyBmb3VuZCBpbiB0aGUgcmVuZGVyZWQgc3RyaW5nLlxuICAgKiBJc3N1ZSAjMTI2OiBXYXJuIHdoZW4gdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgbWlzc2luZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VW5tYXRjaGVkUGxhY2Vob2xkZXJzKHJlbmRlcmVkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJQYXR0ZXJuID0gL1xceyhbYS16QS1aX11bYS16QS1aMC05X10qKVxcfS9nO1xuICAgIGNvbnN0IHVubWF0Y2hlZDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgd2hpbGUgKChtYXRjaCA9IHBsYWNlaG9sZGVyUGF0dGVybi5leGVjKHJlbmRlcmVkKSkgIT09IG51bGwpIHtcbiAgICAgIHVubWF0Y2hlZC5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHVubWF0Y2hlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlIGZvciBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbi5cbiAgICogVXNlZCBieSBib3RoIHRoZSBzdGF0aWMgcHJlLWZsaWdodCBjaGVjayBhbmQgdGhlIHJ1bnRpbWUgY2hhaW4gY2hlY2suXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZVBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZ2VudE5hbWUgPSBjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoXG4gICAgICBgQ2lyY3VsYXIgYWdlbnQgYWN0aXZhdGlvbiBkZXRlY3RlZCAoY3ljbGUgb2YgJHtjeWNsZVBhdGgubGVuZ3RoIC0gMX0pOiBgICtcbiAgICAgIGAke2N5Y2xlUGF0aC5qb2luKCcg4oaSICcpfS4gYCArXG4gICAgICBgQWdlbnQgJyR7YWdlbnROYW1lfScgY2Fubm90IGFjdGl2YXRlIGl0c2VsZiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LmBcbiAgICApO1xuICB9XG5cbiAgLyoqIFNhZmV0eSBsaW1pdHMgZm9yIGFjdGl2YXRpb24gZ3JhcGggdHJhdmVyc2FsICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIID0gMTA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9OT0RFU19WSVNJVEVEID0gMTAwO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgYWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24g4oCUIExheWVyIDEgb2YgZHVhbC1kZXRlY3Rpb24gc3RyYXRlZ3kgKElzc3VlICMzNzQpXG4gICAqXG4gICAqIFBlcmZvcm1zIGFzeW5jIERGUyBvbiB0aGUgYWN0aXZhdGlvbiBncmFwaCB0byBkZXRlY3QgY3ljbGVzIEJFRk9SRSBleGVjdXRpb24gYmVnaW5zLlxuICAgKiBUaGlzIGlzIGEgcHJlLWZsaWdodCBjaGVjayB0aGF0IHByZXZlbnRzIGNpcmN1bGFyIGFjdGl2YXRpb24gY2hhaW5zIGZyb20gYmVpbmcgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBMYXllciAxICh0aGlzIG1ldGhvZCk6IFN0YXRpYyBncmFwaCBhbmFseXNpcyDigJQgd2Fsa3MgdGhlIGFjdGl2YXRpb24gZ3JhcGggZnJvbSB0aGUgcm9vdFxuICAgKiBhZ2VudCwgbG9hZGluZyBlYWNoIGFnZW50J3MgYGFjdGl2YXRlcy5hZ2VudHNgIG1ldGFkYXRhLiBDYXRjaGVzIGFsbCBjeWNsZXMgcmVhY2hhYmxlXG4gICAqIGZyb20gdGhlIHJvb3Qgd2l0aG91dCBleGVjdXRpbmcgYW55IGFnZW50cy4gQm91bmRlZCBieSBNQVhfQUNUSVZBVElPTl9ERVBUSCBhbmRcbiAgICogTUFYX05PREVTX1ZJU0lURUQgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uIGZyb20gbGFyZ2UgYWN5Y2xpYyBncmFwaHMuXG4gICAqXG4gICAqIExheWVyIDIgKGdldEVsZW1lbnRDb250ZW50IHJ1bnRpbWUgY2hlY2spOiBEZWZlbnNlLWluLWRlcHRoIOKAlCBndWFyZHMgYWdhaW5zdCBlZGdlIGNhc2VzXG4gICAqIGxpa2UgZHluYW1pY2FsbHktY29uc3RydWN0ZWQgYWN0aXZhdGlvbiBjaGFpbnMgb3IgYWdlbnRzIG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0YXRpY1xuICAgKiBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gU2VlIGdldEVsZW1lbnRDb250ZW50IGZvciBkZXRhaWxzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdE5hbWUgLSBUaGUgcm9vdCBhZ2VudCBuYW1lIGluaXRpYXRpbmcgdGhlIGFjdGl2YXRpb24gY2hhaW5cbiAgICogQHBhcmFtIGFjdGl2YXRlZEFnZW50cyAtIFRoZSBpbW1lZGlhdGUgYWdlbnRzIGFjdGl2YXRlZCBieSB0aGUgcm9vdFxuICAgKiBAcmV0dXJucyBUaGUgY3ljbGUgcGF0aCBhcnJheSBpZiBhIGN5Y2xlIGV4aXN0cywgbnVsbCBvdGhlcndpc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIGFjdGl2YXRlZEFnZW50czogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICAvLyBDYWNoZSBsb2FkZWQgYWdlbnRzIHRvIGF2b2lkIHJlZHVuZGFudCBJL08gZHVyaW5nIERGU1xuICAgIGNvbnN0IGFnZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10gfCBudWxsPigpO1xuXG4gICAgLy8gSGVscGVyOiBsb2FkIGFuIGFnZW50J3MgYWN0aXZhdGVzLmFnZW50cyBsaXN0IChjYWNoZWQpXG4gICAgY29uc3QgZ2V0QWN0aXZhdGVkQWdlbnRzID0gYXN5bmMgKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGFnZW50Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gYWdlbnRDYWNoZS5nZXQoY2FjaGVLZXkpIHx8IFtdO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgY29uc3QgYWdlbnRzID0gbWV0YS5hY3RpdmF0ZXM/LmFnZW50cyB8fCBbXTtcbiAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIGFnZW50cyk7XG4gICAgICAgIHJldHVybiBhZ2VudHM7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyByZWZlcmVuY2VkIGluIGFjdGl2YXRlcy5hZ2VudHMgY291bGQgbm90IGJlIHJlc29sdmVkIGR1cmluZyBjeWNsZSBkZXRlY3Rpb25gKTtcbiAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFRyYWNrcyBub2RlcyB3aG9zZSBlbnRpcmUgc3VidHJlZSBoYXMgYmVlbiBleHBsb3JlZCB3aXRob3V0IGZpbmRpbmcgYSBjeWNsZS5cbiAgICAvLyBQcmV2ZW50cyBleHBvbmVudGlhbCByZS1leHBsb3JhdGlvbiBpbiBkaWFtb25kL2NvbnZlcmdlbnQgZ3JhcGhzLlxuICAgIGNvbnN0IGZ1bGx5RXhwbG9yZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgbm9kZXNWaXNpdGVkID0gMDtcblxuICAgIC8vIERGUyDigJQgc3RhY2sgZW50cmllczogW2N1cnJlbnRBZ2VudCwgcGF0aFNvRmFyLCBwYXRoU2V0TG93ZXJdXG4gICAgLy8gcGF0aFNldExvd2VyIGlzIGEgU2V0PHN0cmluZz4gb2YgbG93ZXJjYXNlZCBuYW1lcyBmb3IgTygxKSBjeWNsZSBjaGVja3NcbiAgICBjb25zdCBzdGFjazogQXJyYXk8W3N0cmluZywgc3RyaW5nW10sIFNldDxzdHJpbmc+XT4gPSBbXTtcblxuICAgIGNvbnN0IHJvb3RMb3dlciA9IHJvb3ROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBhY3RpdmF0ZWRBZ2VudHMpIHtcbiAgICAgIC8vIFNlbGYtbG9vcDogYWdlbnQgZGlyZWN0bHkgYWN0aXZhdGVzIGl0c2VsZlxuICAgICAgaWYgKGNoaWxkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3RMb3dlcikge1xuICAgICAgICByZXR1cm4gW3Jvb3ROYW1lLCBjaGlsZF07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoU2V0ID0gbmV3IFNldDxzdHJpbmc+KFtyb290TG93ZXIsIGNoaWxkLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCBbcm9vdE5hbWUsIGNoaWxkXSwgcGF0aFNldF0pO1xuICAgIH1cblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbY3VycmVudCwgY3VycmVudFBhdGgsIHBhdGhTZXRdID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICBub2Rlc1Zpc2l0ZWQrKztcbiAgICAgIGlmIChub2Rlc1Zpc2l0ZWQgPiBBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIGZvciAnJHtyb290TmFtZX0nIGFib3J0ZWQ6IGV4Y2VlZGVkICR7QWdlbnRNYW5hZ2VyLk1BWF9OT0RFU19WSVNJVEVEfSBub2RlcyB2aXNpdGVkLiBgICtcbiAgICAgICAgICBgVGhlIGFjdGl2YXRpb24gZ3JhcGggbWF5IGJlIHRvbyBsYXJnZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudFBhdGgubGVuZ3RoID4gQWdlbnRNYW5hZ2VyLk1BWF9BQ1RJVkFUSU9OX0RFUFRIICsgMSkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgaGl0IGRlcHRoIGxpbWl0IG9mICR7QWdlbnRNYW5hZ2VyLk1BWF9BQ1RJVkFUSU9OX0RFUFRIfS4gYCArXG4gICAgICAgICAgYFNraXBwaW5nIGRlZXBlciBicmFuY2hlcy5gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50TG93ZXIgPSBjdXJyZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoZnVsbHlFeHBsb3JlZC5oYXMoY3VycmVudExvd2VyKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGlzIGFnZW50J3MgYWN0aXZhdGlvbnNcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgZ2V0QWN0aXZhdGVkQWdlbnRzKGN1cnJlbnQpO1xuXG4gICAgICBsZXQgZm91bmRDeWNsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZExvd2VyID0gY2hpbGQudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGU6IGRvZXMgdGhpcyBjaGlsZCBhcHBlYXIgZWFybGllciBpbiB0aGUgcGF0aD9cbiAgICAgICAgaWYgKHBhdGhTZXQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmdWxseUV4cGxvcmVkLmhhcyhjaGlsZExvd2VyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld1BhdGhTZXQgPSBuZXcgU2V0KHBhdGhTZXQpO1xuICAgICAgICAgIG5ld1BhdGhTZXQuYWRkKGNoaWxkTG93ZXIpO1xuICAgICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCBbLi4uY3VycmVudFBhdGgsIGNoaWxkXSwgbmV3UGF0aFNldF0pO1xuICAgICAgICAgIGZvdW5kQ3ljbGUgPSB0cnVlOyAvLyBoYXMgY2hpbGRyZW4gdG8gZXhwbG9yZSwgbm90IGZ1bGx5IGV4cGxvcmVkIHlldFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHVuZXhwbG9yZWQgY2hpbGRyZW4sIHRoaXMgbm9kZSdzIHN1YnRyZWUgaXMgY3ljbGUtZnJlZVxuICAgICAgaWYgKCFmb3VuZEN5Y2xlKSB7XG4gICAgICAgIGZ1bGx5RXhwbG9yZWQuYWRkKGN1cnJlbnRMb3dlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbnRlbnQgZnJvbSBhbiBlbGVtZW50IChlbGVtZW50LWFnbm9zdGljKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbGVtZW50Q29udGVudChcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uQ29udGV4dD86IEV4ZWN1dGlvbkNvbnRleHRcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBHZXQgdGhlIHN0YXRpYyByZXNvbHZlclxuICAgIGNvbnN0IHJlc29sdmVyID0gQWdlbnRNYW5hZ2VyLmdldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIoKTtcbiAgICBpZiAoIXJlc29sdmVyKSB7XG4gICAgICBsb2dnZXIud2FybihgRWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkIC0gY2Fubm90IGFjdGl2YXRlICR7ZWxlbWVudFR5cGV9LyR7ZWxlbWVudE5hbWV9YCk7XG4gICAgICByZXR1cm4gYFtFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgZm9yICR7ZWxlbWVudFR5cGV9LyR7ZWxlbWVudE5hbWV9XWA7XG4gICAgfVxuXG4gICAgLy8gTGF5ZXIgMiAoZGVmZW5zZS1pbi1kZXB0aCk6IFJ1bnRpbWUgY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24gKElzc3VlICMxMDkpXG4gICAgLy8gVGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIChkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzLCBsYXllciAxKSBjYXRjaGVzIG1vc3QgY3ljbGVzXG4gICAgLy8gYmVmb3JlIGV4ZWN1dGlvbiBiZWdpbnMuIFRoaXMgcnVudGltZSBjaGVjayBndWFyZHMgYWdhaW5zdCBlZGdlIGNhc2VzIHN1Y2ggYXNcbiAgICAvLyBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAgLy8gY2hlY2sgYW5kIGFjdHVhbCBleGVjdXRpb24uIFVzZXMgZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluIHdoaWNoIHRyYWNrcyB0aGVcbiAgICAvLyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIOKAlCBlZmZlY3RpdmUgZm9yIGRpcmVjdCBhbmQgbXVsdGktaG9wIGNoYWlucyB3aXRoaW4gYVxuICAgIC8vIHNpbmdsZSBleGVjdXRpb24gY29udGV4dC5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09ICdhZ2VudHMnICYmIGV4ZWN1dGlvbkNvbnRleHQ/LmFnZW50Q2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluU2V0ID0gbmV3IFNldChleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4ubWFwKG5hbWUgPT4gbmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChjaGFpblNldC5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IFsuLi5leGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4sIGVsZW1lbnROYW1lXTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEFnZW50TWFuYWdlci5mb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gTWFwIHBsdXJhbCBlbGVtZW50IHR5cGVzIHRvIG1hbmFnZXIgbmFtZXNcbiAgICAgIGNvbnN0IG1hbmFnZXJOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBwZXJzb25hczogJ1BlcnNvbmFNYW5hZ2VyJyxcbiAgICAgICAgc2tpbGxzOiAnU2tpbGxNYW5hZ2VyJyxcbiAgICAgICAgbWVtb3JpZXM6ICdNZW1vcnlNYW5hZ2VyJyxcbiAgICAgICAgdGVtcGxhdGVzOiAnVGVtcGxhdGVNYW5hZ2VyJyxcbiAgICAgICAgZW5zZW1ibGVzOiAnRW5zZW1ibGVNYW5hZ2VyJyxcbiAgICAgICAgYWdlbnRzOiAnQWdlbnRNYW5hZ2VyJ1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFuYWdlck5hbWUgPSBtYW5hZ2VyTmFtZU1hcFtlbGVtZW50VHlwZV07XG4gICAgICBpZiAoIW1hbmFnZXJOYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbVW5rbm93biBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9XWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hbmFnZXIgPSByZXNvbHZlcihtYW5hZ2VyTmFtZSk7XG4gICAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE1hbmFnZXIgbm90IGZvdW5kIGZvciBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIHJldHVybiBgW01hbmFnZXIgbm90IGZvdW5kOiAke21hbmFnZXJOYW1lfV1gO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYWxsIGVsZW1lbnRzIG9mIHRoaXMgdHlwZVxuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICAgIC8vIElzc3VlICMyNDMyOiBhY3RpdmF0ZXM6IHJlZmVyZW5jZXMgdXNlIGNhbm9uaWNhbCBmaWxlbmFtZSBzbHVncyAoZS5nLlxuICAgICAgLy8gJ3NlY3VyaXR5LWFuYWx5c3QnLCAnYnVnLXJlcG9ydCcpIHdoaWxlIGVsZW1lbnQgbWV0YWRhdGEgY2FycmllcyBkaXNwbGF5XG4gICAgICAvLyBuYW1lcyAoJ1NlY3VyaXR5IEFuYWx5c3QnLCAnQnVnUmVwb3J0JykuIEV4YWN0LW5hbWUgbWF0Y2hlcyB3aW4gYWNyb3NzIHRoZVxuICAgICAgLy8gZnVsbCBsaXN0OyBvdGhlcndpc2UgYm90aCBzaWRlcyBtYXAgdGhyb3VnaCB0aGUgc2FtZSBzbHVnIGRlcml2YXRpb25cbiAgICAgIC8vIGdldEVsZW1lbnRGaWxlbmFtZSgpIHVzZXMgd2hlbiBzYXZpbmcg4oCUIG5vcm1hbGl6ZUZpbGVuYW1lIHdpdGggaXRzXG4gICAgICAvLyBlbXB0eS1yZXN1bHQgJ3VubmFtZWQnIGZhbGxiYWNrIOKAlCBzbyBhIHJlZmVyZW5jZSByZXNvbHZlcyBleGFjdGx5IHdoZW4gaXRcbiAgICAgIC8vIG1hdGNoZXMgdGhlIGVsZW1lbnQncyBvbi1kaXNrIGZpbGVuYW1lIChpbmNsdWRpbmcgY2FtZWxDYXNlIHNwbGl0cyBhbmRcbiAgICAgIC8vIHNlcGFyYXRvci1vbmx5IG5hbWVzIGxpa2UgJy0tLScgdGhhdCBzYXZlIGFzIHVubmFtZWQubWQpLlxuICAgICAgY29uc3QgY2Fub25pY2FsU2x1ZyA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSB8fCAndW5uYW1lZCc7XG4gICAgICAvLyBUaGUgJ3VubmFtZWQnIGZhbGxiYWNrIGFwcGxpZXMgb25seSB0byBjYW5kaWRhdGUgZWxlbWVudHMgKG1pcnJvcmluZyBob3dcbiAgICAgIC8vIHRoZXkgd2VyZSBzYXZlZCkuIEEgcmVmZXJlbmNlIHRoYXQgaXMgZW1wdHkgb3Igbm9ybWFsaXplcyB0byBub3RoaW5nXG4gICAgICAvLyAoJycsICcgICAnLCAnLS0tJykgY2FuIG5ldmVyIG5hbWUgYSBzYXZlZCBmaWxlIOKAlCB2YWxpZGF0ZUFjdGl2YXRlcygpIG9ubHlcbiAgICAgIC8vIHdhcm5zIG9uIHN1Y2ggZW50cmllcywgc28gZXhjbHVkZSB0aGVtIGhlcmUgb3IgdGhleSB3b3VsZCByaWRlIHRoZVxuICAgICAgLy8gZmFsbGJhY2sgb250byBhcmJpdHJhcnkgc2VwYXJhdG9yLW9ubHktbmFtZWQgZWxlbWVudHMuXG4gICAgICBjb25zdCB0cmltbWVkUmVmZXJlbmNlID0gZWxlbWVudE5hbWUudHJpbSgpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IHRyaW1tZWRSZWZlcmVuY2UgPyB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHRyaW1tZWRSZWZlcmVuY2UpIDogJyc7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgZWxlbWVudHMuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IGVsZW1lbnROYW1lKSA/P1xuICAgICAgICAobm9ybWFsaXplZFRhcmdldFxuICAgICAgICAgID8gZWxlbWVudHMuZmluZCgoZTogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgZS5tZXRhZGF0YS5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICBjYW5vbmljYWxTbHVnKGUubWV0YWRhdGEubmFtZSkgPT09IG5vcm1hbGl6ZWRUYXJnZXRcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBhcHByb3ByaWF0ZSBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmluc3RydWN0aW9ucyB8fCAnJztcblxuICAgICAgICBjYXNlICdtZW1vcmllcyc6IHtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxlbWVudC5nZXRFbnRyaWVzKCk7XG4gICAgICAgICAgcmV0dXJuIGBNZW1vcnkgJyR7ZWxlbWVudE5hbWV9JyB3aXRoICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZWxlbWVudHMgfHwge30pXG4gICAgICAgICAgICAubWFwKChbdHlwZSwgbmFtZXNdKSA9PiBgJHt0eXBlfTogJHtBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzLmpvaW4oJywgJykgOiBTdHJpbmcobmFtZXMpfWApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgICByZXR1cm4gYEVuc2VtYmxlICcke2VsZW1lbnROYW1lfScgYWN0aXZhdGVzOiAke2VsZW1lbnRMaXN0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGBbQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGdldHRpbmcgY29udGVudCBmb3IgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2FnZW50cycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgYWdlbnRzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfQUdFTlRTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7dGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemV9LyR7bWF4fSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUFnZW50TmFtZXMpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBhZ2VudHMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50TmFtZXMgPSBuZXcgU2V0KGFnZW50cy5tYXAoYSA9PiBhLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0FnZW50TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgYWdlbnRzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2FnZW50cycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGFnZW50czonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYW4gYWdlbnQgc3RhdGUgZmlsZSAoWUFNTCkuXG4gICAqXG4gICAqIElNUFJPVkVNRU5UOiBPcHRpbWlzdGljIGxvY2tpbmcgd2l0aCB2ZXJzaW9uIGNoZWNraW5nIChJc3N1ZSAjMjQpXG4gICAqIFByZXZlbnRzIHN0YXRlIGNvcnJ1cHRpb24gZnJvbSBjb25jdXJyZW50IHVwZGF0ZXMgYnkgY29tcGFyaW5nIHZlcnNpb25zXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAqIFRoaXMgZW5zdXJlcyBzdGF0ZSBmaWxlcyB1c2Uga2ViYWItY2FzZSAoZS5nLiwgXCJjcnVkdi1hZ2VudC1kZWx0YS5zdGF0ZS55YW1sXCIpXG4gICAqIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgbmFtZSBmb3JtYXQgKGUuZy4sIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIilcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogV3JhcCByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgaW4gZmlsZSBsb2NrXG4gICAqIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uIGZyb20gY29uY3VycmVudCBhZ2VudCBleGVjdXRpb25zXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEyMyk6IFZlcnNpb24gaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmUsIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlIHZlcnNpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBzYXZlXG4gICAqIEBwcm90ZWN0ZWQgT25seSBhY2Nlc3NpYmxlIGJ5IHN1YmNsYXNzZXMgKGUuZy4sIFRlc3RhYmxlQWdlbnRNYW5hZ2VyIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVBZ2VudFN0YXRlKG5hbWU6IHN0cmluZywgc3RhdGU6IEFnZW50U3RhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcblxuICAgIC8vIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IEFjcXVpcmUgZmlsZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uXG4gICAgLy8gVGhlIGxvY2sgY292ZXJzIHRoZSBlbnRpcmUgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICBhd2FpdCB0aGlzLmZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgYWdlbnQtc3RhdGU6JHtub3JtYWxpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBGSVg6IE9wdGltaXN0aWMgbG9ja2luZyBjaGVjayAoSXNzdWUgIzI0KVxuICAgICAgLy8gTG9hZCBleGlzdGluZyBzdGF0ZSB0byBjb21wYXJlIHZlcnNpb25zIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdTdGF0ZSAmJiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBzdGF0ZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgICAgIC8vIElmIHZlcnNpb25zIGRvbid0IG1hdGNoLCBpdCBtZWFucyBhbm90aGVyIHByb2Nlc3MgdXBkYXRlZCB0aGUgc3RhdGVcbiAgICAgICAgaWYgKGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uID4gc3RhdGUuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFN0YXRlIHZlcnNpb24gY29uZmxpY3QgZGV0ZWN0ZWQgZm9yIGFnZW50ICR7bmFtZX1gLCB7XG4gICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5zYXZlQWdlbnRTdGF0ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogYXR0ZW1wdGVkIHRvIHNhdmUgc3RhbGUgc3RhdGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBjdXJyZW50IHZlcnNpb24gaXMgJHtleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbn0sIGAgK1xuICAgICAgICAgICAgYGJ1dCBhdHRlbXB0ZWQgdG8gc2F2ZSB2ZXJzaW9uICR7c3RhdGUuc3RhdGVWZXJzaW9ufS4gYCArXG4gICAgICAgICAgICBgU3RhdGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBjb25jdXJyZW50bHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYIChJc3N1ZSAjMTIzKTogSW5jcmVtZW50IHZlcnNpb24gQkVGT1JFIHNlcmlhbGl6YXRpb24sIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHZlcnNpb24gb25seSBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gKHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAwKSArIDE7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHRoaXMucHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogZmFpbHNhZmUgY29ycnVwdHMgYm9vbGVhbnMvbnVtYmVycyBpbiBhZ2VudCBzdGF0ZVxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS52YWxpZGF0ZVNpemUoeWFtbENvbnRlbnQsIE1BWF9ZQU1MX1NJWkUsICdBZ2VudCBzdGF0ZScpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCBzdGF0ZSBzYXZlZCBzdWNjZXNzZnVsbHlgLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICBnb2FsQ291bnQ6IHN0YXRlLmdvYWxzPy5sZW5ndGggPz8gMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2ZXJzaW9uIGZvciBjYWxsZXIgdG8gc3luYyBhZ2VudCdzIGludGVybmFsIHN0YXRlXG4gICAgLy8gc3RhdGVWZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBudW1iZXIgYWZ0ZXIgdGhlIGluY3JlbWVudCBhYm92ZVxuICAgIHJldHVybiBzdGF0ZS5zdGF0ZVZlcnNpb24hO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHk6IGVuc3VyZSBgLm1kYCBleHRlbnNpb24gb24gcmVxdWVzdGVkIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHN0cmlwRXh0ZW5zaW9uKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gZmlsZVBhdGguc2xpY2UoMCwgLUFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aClcbiAgICAgIDogZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50OiBBZ2VudCwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChub3JtYWxpemVkTmFtZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHN0YXRlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBZQU1MIHBhcnNpbmdcbiAgICAgIC8vIFN0YXRlIGZpbGVzIGFyZSBwdXJlIFlBTUwgYnV0IHBhcnNlRnJvbnRtYXR0ZXIgaGFuZGxlcyBib3RoIGZvcm1hdHNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5sb2FkQWdlbnRTdGF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHJlc3VsdC5kYXRhIGFzIEFnZW50U3RhdGU7XG4gICAgICB0aGlzLm5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlKTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IHN0YXRlOiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcsIG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCBTRUNVUklUWV9MSU1JVFMuTUFYX0RPQ1VNRU5UQVRJT05fRklFTERfTEVOR1RIKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZGVmYXVsdHMgdG8gcHJldmVudCBpbmplY3Rpb24gd2hlbiB1c2VkIGluIGdvYWwgcmVuZGVyaW5nXG4gICAgICAgICAgaWYgKHR5cGVvZiBwLmRlZmF1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHNhbml0aXplSW5wdXQocC5kZWZhdWx0LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHAuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbC50ZW1wbGF0ZSxcbiAgICAgICAgcGFyYW1ldGVyczogdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE9iamVjdCB3aXRob3V0IHRlbXBsYXRlIC0gY2Fubm90IGNvbnZlcnRcbiAgICBsb2dnZXIud2FybignR29hbCBvYmplY3QgbWlzc2luZyB0ZW1wbGF0ZSBmaWVsZCwgY2Fubm90IGNvbnZlcnQgdG8gVjInLCB7IGdvYWwgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogUGFyc2VkQWdlbnRGaWxlIHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnBhcnNlQWdlbnRGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UgZW5zdXJlcyBmcm9udG1hdHRlciBleGlzdHMsIG9yIHRocm93cyBlcnJvclxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGVuYW1lIGZvciBhbiBhZ2VudCBlbGVtZW50LlxuICAgKlxuICAgKiBVc2VzIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBjb25zaXN0ZW50XG4gICAqIGZpbGVuYW1lIGZvcm1hdHRpbmcgYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICBcIkNyZWF0aXZlIFdyaXRlclwiIC0+IFwiY3JlYXRpdmUtd3JpdGVyLm1kXCJcbiAgICogICBcIkNSVURWLUFnZW50LURlbHRhXCIgLT4gXCJjcnVkdi1hZ2VudC1kZWx0YS5tZFwiXG4gICAqICAgXCJNdWx0aV9Hb2FsX0FnZW50XCIgLT4gXCJtdWx0aS1nb2FsLWFnZW50Lm1kXCJcbiAgICogICBcIkNhbWVsQ2FzZU5hbWVcIiAtPiBcImNhbWVsLWNhc2UtbmFtZS5tZFwiXG4gICAqL1xuICBwcml2YXRlIGdldEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZvciB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eW2EtekEtWjAtOV8tXSskLy50ZXN0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IERlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvbiBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZTogQWdlbnRTdGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlIGluc3RhbmNlb2YgRGF0ZSA/IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSA6IHN0YXRlLmxhc3RBY3RpdmUsXG4gICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQgPz8gMCksXG4gICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbikgOiAnMScsICAvLyBJbmNsdWRlIHZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZ1xuICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgIC4uLmdvYWwsXG4gICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQ6IGdvYWwuY29tcGxldGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jb21wbGV0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jb21wbGV0ZWRBdCxcbiAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSA6IHVuZGVmaW5lZFxuICAgICAgfSkpLFxuICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgIC4uLmRlY2lzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZTogQWdlbnRTdGF0ZSk6IHZvaWQge1xuICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IERlZmF1bHQgbWlzc2luZyBhcnJheXMgdG8gcHJldmVudCBUeXBlRXJyb3JcbiAgICAvLyBJZiBzdGF0ZSBmaWxlIGlzIG1pc3NpbmcgZ29hbHMvZGVjaXNpb25zL2NvbnRleHQsIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXlzL29iamVjdHNcbiAgICBpZiAoIXN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2FscyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuY29udGV4dCkge1xuICAgICAgc3RhdGUuY29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugc3RhdGVWZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmcgKElzc3VlICMyNClcbiAgICBpZiAoc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZlcnNpb24gMSBpZiBub3QgcHJlc2VudCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICBzdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUoc3RhdGUubGFzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmltcG9ydGFuY2UgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLnVyZ2VuY3kgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwudXJnZW5jeSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXBkYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKGRlY2lzaW9uID0+IHtcbiAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2lzaW9uLmNvbmZpZGVuY2UgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpc2lvbi50aW1lc3RhbXApIHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICogV3JhcHMgQWdlbnQucmVjb3JkRGVjaXNpb24oKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIC8qKiBPcHRpb25hbCBmaW5kaW5ncyBvciByZXN1bHRzIGZyb20gdGhpcyBzdGVwICovXG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICAvKiogT3B0aW9uYWwgaGludCBhYm91dCB3aGF0IHRoZSBMTE0gcGxhbnMgdG8gZG8gbmV4dCAoZm9yIHByb2FjdGl2ZSByaXNrIGV2YWx1YXRpb24pICovXG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqIE9wdGlvbmFsIHJpc2sgc2NvcmUgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKDAtMTAwKSAqL1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgICAvKiogUnVudGltZSBvdmVycmlkZSBmb3IgbWF4QXV0b25vbW91c1N0ZXBzIChJc3N1ZSAjNDQ3KSAqL1xuICAgIG1heFN0ZXBzT3ZlcnJpZGU/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZWNpc2lvbjoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqIEF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29udGludWUgb3IgcGF1c2UgKi9cbiAgICBhdXRvbm9teTogQXV0b25vbXlEaXJlY3RpdmU7XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZSB0byBmaW5kIGFjdGl2ZSBnb2Fsc1xuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBhY3RpdmVHb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcblxuICAgIGlmICghYWN0aXZlR29hbCkge1xuICAgICAgY29uc3QgZ29hbFN0YXR1c2VzID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gYCR7Zy5pZH06ICR7Zy5zdGF0dXN9YCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGFjdGl2ZSBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke2dvYWxTdGF0dXNlcyB8fCAnbm9uZSd9LiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwgZmlyc3QuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDYWxsIEFnZW50LnJlY29yZERlY2lzaW9uKCkgdG8gcGVyc2lzdCB0aGUgc3RlcFxuICAgIGNvbnN0IGRlY2lzaW9uID0gYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgICAgZGVjaXNpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5maW5kaW5ncyA/PyAnJyxcbiAgICAgIGNvbmZpZGVuY2U6IHBhcmFtcy5jb25maWRlbmNlID8/IDAuOCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNS4gR2V0IHVwZGF0ZWQgc3RhdGUgZm9yIHN0ZXAgY291bnQgYW5kIGF1dG9ub215IGV2YWx1YXRpb25cbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gNi4gQ2FsY3VsYXRlIHN0ZXAgY291bnQgZm9yIHRoaXMgZ29hbFxuICAgIC8vIHN0ZXBDb3VudCA9IG51bWJlciBvZiBzdGVwcyBjb21wbGV0ZWQgKGluY2x1ZGluZyB0aGUgb25lIGp1c3QgcmVjb3JkZWQpXG4gICAgLy8gVGhlIGV2YWx1YXRvciB1c2VzIHRoaXMgdG8gY2hlY2sgaWYgd2UndmUgaGl0IG1heEF1dG9ub21vdXNTdGVwc1xuICAgIC8vIGFuZCB0byBjb21wdXRlIHN0ZXBzUmVtYWluaW5nIGZvciB0aGUgYXV0b25vbXkgZGlyZWN0aXZlLlxuICAgIGNvbnN0IGdvYWxEZWNpc2lvbnMgPSB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBhY3RpdmVHb2FsLmlkKTtcbiAgICBjb25zdCBzdGVwQ291bnQgPSBnb2FsRGVjaXNpb25zLmxlbmd0aDtcblxuICAgIC8vIDcuIEdldCBhZ2VudCBtZXRhZGF0YSBmb3IgYXV0b25vbXkgY29uZmlnXG4gICAgY29uc3QgYWdlbnRNZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIDguIEV2YWx1YXRlIGF1dG9ub215IC0gc2hvdWxkIHdlIGNvbnRpbnVlIG9yIHBhdXNlP1xuICAgIC8vIElzc3VlICM0MDI6IFBhc3MgREktaW5qZWN0ZWQgRGFuZ2VyWm9uZUVuZm9yY2VyIHZpYSBjb250ZXh0XG4gICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCBhdXRvbm9teUNvbmZpZyA9IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlICE9PSB1bmRlZmluZWRcbiAgICAgID8geyAuLi5hZ2VudE1ldGFkYXRhLmF1dG9ub215LCBtYXhBdXRvbm9tb3VzU3RlcHM6IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlIH1cbiAgICAgIDogYWdlbnRNZXRhZGF0YS5hdXRvbm9teTtcblxuICAgIGNvbnN0IGF1dG9ub215RGlyZWN0aXZlID0gZXZhbHVhdGVBdXRvbm9teSh7XG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBhdXRvbm9teUNvbmZpZyxcbiAgICAgIHN0ZXBDb3VudCxcbiAgICAgIGN1cnJlbnRTdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICBjdXJyZW50U3RlcE91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgbmV4dEFjdGlvbkhpbnQ6IHBhcmFtcy5uZXh0QWN0aW9uSGludCxcbiAgICAgIHJpc2tTY29yZTogcGFyYW1zLnJpc2tTY29yZSxcbiAgICAgIGRhbmdlclpvbmVFbmZvcmNlcjogQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPy4oKSxcbiAgICAgIHZlcmlmaWNhdGlvblN0b3JlOiBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj8uKCksXG4gICAgICBnb2FsRGVzY3JpcHRpb246IGFjdGl2ZUdvYWwuZGVzY3JpcHRpb24sXG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgfSk7XG5cbiAgICAvLyA5LiBSZXR1cm4gZGVjaXNpb24sIHN0YXRlIHN1bW1hcnksIGFuZCBhdXRvbm9teSBkaXJlY3RpdmVcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTdGVwIHJlY29yZGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgLFxuICAgICAgZGVjaXNpb246IHtcbiAgICAgICAgaWQ6IGRlY2lzaW9uLmlkLFxuICAgICAgICBnb2FsSWQ6IGRlY2lzaW9uLmdvYWxJZCxcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmRlY2lzaW9uLFxuICAgICAgICByZWFzb25pbmc6IGRlY2lzaW9uLnJlYXNvbmluZyxcbiAgICAgICAgZnJhbWV3b3JrOiBkZWNpc2lvbi5mcmFtZXdvcmssXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBhdXRvbm9teTogYXV0b25vbXlEaXJlY3RpdmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICogV3JhcHMgQWdlbnQuY29tcGxldGVHb2FsKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBnb2FsOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgIGNvbXBsZXRlZEF0OiBzdHJpbmc7XG4gICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbENvdW50OiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBGaW5kIGdvYWwgdG8gY29tcGxldGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgbGV0IGdvYWw6IEFnZW50R29hbCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwYXJhbXMuZ29hbElkKSB7XG4gICAgICBnb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IHBhcmFtcy5nb2FsSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIG1vc3QgcmVjZW50IGluLXByb2dyZXNzIGdvYWxcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fsc1xuICAgICAgICAuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5nZXRUaW1lKCkgLSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCkpWzBdO1xuICAgIH1cblxuICAgIGlmICghZ29hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBwYXJhbXMuZ29hbElkXG4gICAgICAgICAgPyBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kYFxuICAgICAgICAgIDogYE5vIGluLXByb2dyZXNzIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjb3JkIGZpbmFsIGRlY2lzaW9uIHdpdGggc3VtbWFyeVxuICAgIGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogZ29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiAnZ29hbF9jb21wbGV0ZScsXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5zdW1tYXJ5LFxuICAgICAgY29uZmlkZW5jZTogMS4wLFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIENhbGwgQWdlbnQuY29tcGxldGVHb2FsKClcbiAgICBhZ2VudC5jb21wbGV0ZUdvYWwoZ29hbC5pZCwgcGFyYW1zLm91dGNvbWUpO1xuXG4gICAgLy8gNS4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA2LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3QgY29tcGxldGVTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShjb21wbGV0ZVNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIDcuIFJldHVybiBnb2FsLCBtZXRyaWNzLCBhbmQgc3RhdGVcbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbXBsZXRlZEdvYWwgPSB1cGRhdGVkU3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWwuaWQpITtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYEdvYWwgY29tcGxldGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScgd2l0aCBvdXRjb21lOiAke3BhcmFtcy5vdXRjb21lfWAsXG4gICAgICBnb2FsOiB7XG4gICAgICAgIGlkOiBjb21wbGV0ZWRHb2FsLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogY29tcGxldGVkR29hbC5kZXNjcmlwdGlvbixcbiAgICAgICAgc3RhdHVzOiBjb21wbGV0ZWRHb2FsLnN0YXR1cyBhcyBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIixcbiAgICAgICAgY3JlYXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICBjb21wbGV0ZWRBdDogY29tcGxldGVkR29hbC5jb21wbGV0ZWRBdCEudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgICAgYWN0dWFsRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmFjdHVhbEVmZm9ydFxuICAgICAgfSxcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgc3VjY2Vzc1JhdGU6IG1ldHJpY3Muc3VjY2Vzc1JhdGUsXG4gICAgICAgIGdvYWxzQ29tcGxldGVkOiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkLFxuICAgICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG1ldHJpY3MuZ29hbHNJblByb2dyZXNzLFxuICAgICAgICBkZWNpc2lvbkFjY3VyYWN5OiBtZXRyaWNzLmRlY2lzaW9uQWNjdXJhY3ksXG4gICAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbWV0cmljcy5hdmVyYWdlQ29tcGxldGlvblRpbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqIFdyYXBzIEFnZW50LmdldFN0YXRlKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBpbmNsdWRlRGVjaXNpb25IaXN0b3J5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlQ29udGV4dD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgaW1wb3J0YW5jZTogbnVtYmVyO1xuICAgICAgICB1cmdlbmN5OiBudW1iZXI7XG4gICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudD86IHN0cmluZztcbiAgICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAgICAgICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG4gICAgICAgIHJpc2tMZXZlbD86IHN0cmluZztcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIG5vdGVzPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBkZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gMy4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA0LiBGaWx0ZXIgZGVjaXNpb25zIGJhc2VkIG9uIGluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICBjb25zdCBkZWNpc2lvbnMgPSBwYXJhbXMuaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgICAgPyBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIDogc3RhdGUuZGVjaXNpb25zLnNsaWNlKC0xMCk7IC8vIExhc3QgMTAgZGVjaXNpb25zXG5cbiAgICAvLyA1LiBCdWlsZCBjb250ZXh0IHN1bW1hcnlcbiAgICBjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHRTaXplID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29udGV4dCkubGVuZ3RoO1xuXG4gICAgLy8gNi4gUmV0dXJuIHN0YXRlIGFuZCBtZXRyaWNzXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgICAgICBpZDogZy5pZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmlvcml0eTogZy5wcmlvcml0eSxcbiAgICAgICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgICAgIGltcG9ydGFuY2U6IGcuaW1wb3J0YW5jZSxcbiAgICAgICAgICB1cmdlbmN5OiBnLnVyZ2VuY3ksXG4gICAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50OiBnLmVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGcuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBnLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnLmNvbXBsZXRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY2llczogZy5kZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmlza0xldmVsOiBnLnJpc2tMZXZlbCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGcuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICAgIGFjdHVhbEVmZm9ydDogZy5hY3R1YWxFZmZvcnQsXG4gICAgICAgICAgbm90ZXM6IGcubm90ZXNcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9ucy5tYXAoZCA9PiAoe1xuICAgICAgICAgIGlkOiBkLmlkLFxuICAgICAgICAgIGdvYWxJZDogZC5nb2FsSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICAgICAgZnJhbWV3b3JrOiBkLmZyYW1ld29yayxcbiAgICAgICAgICBjb25maWRlbmNlOiBkLmNvbmZpZGVuY2UsXG4gICAgICAgICAgb3V0Y29tZTogZC5vdXRjb21lXG4gICAgICAgIH0pKSxcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0ID8gc3RhdGUuY29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAgICBrZXlzOiBjb250ZXh0S2V5cyxcbiAgICAgICAgICBzaXplOiBjb250ZXh0U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdhdGhlcmVkIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbCBleGVjdXRpb24uXG4gICAqXG4gICAqIEFnZ3JlZ2F0ZXMgZGVjaXNpb24gaGlzdG9yeSwgZ29hbCBzdGF0ZSwgYW5kIHN1bW1hcnkgc3RhdGlzdGljc1xuICAgKiBpbnRvIGEgc3RydWN0dXJlZCBHYXRoZXJlZERhdGEgb2JqZWN0LiBUaGlzIGlzIGEgcmVhZC1zaWRlIHZpZXdcbiAgICogb3ZlciBleGlzdGluZyBhZ2VudCBzdGF0ZSBkYXRhLlxuICAgKlxuICAgKiBJc3N1ZSAjNjg6IEdhdGhlcmVkRGF0YUVudHJ5IGZvciBzdGF0ZSByZWNvcmRpbmdcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBDb21wbGV0aW9uIChFcGljICMzODApXG4gICAqL1xuICBhc3luYyBnZXRHYXRoZXJlZERhdGEocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEdhdGhlcmVkRGF0YT4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2F0aGVyZWQgPSBnZXRHYXRoZXJlZERhdGEocGFyYW1zLmFnZW50TmFtZSwgcGFyYW1zLmdvYWxJZCwgc3RhdGUpO1xuXG4gICAgaWYgKCFnYXRoZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke3N0YXRlLmdvYWxzLm1hcChnID0+IGcuaWQpLmpvaW4oJywgJykgfHwgJ25vbmUnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqIENvbWJpbmVzIGV4ZWN1dGVBZ2VudCB3aXRoIHN0YXRlIGNvbnRleHRcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQgJiB7XG4gICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgICByZWNlbnREZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgY29udGludWF0aW9uOiB7XG4gICAgICBpc1Jlc3VtaW5nOiBib29sZWFuO1xuICAgICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzPzogc3RyaW5nW107XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGN1cnJlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgYWN0aXZlR29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZ29hbCA9PiBnb2FsLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG5cbiAgICBpZiAoIWFjdGl2ZUdvYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNvbnRpbnVlX2V4ZWN1dGlvbiByZXF1aXJlcyBhbiBpbi1wcm9ncmVzcyBnb2FsIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbC4gSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgZ29hbCwgdXNlIG1jcF9hcWxfY3JlYXRlIHJlY29yZF9leGVjdXRpb25fc3RlcC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUdvYWxEZWNpc2lvbnMgPSBzdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGRlY2lzaW9uID0+IGRlY2lzaW9uLmdvYWxJZCA9PT0gYWN0aXZlR29hbC5pZCk7XG4gICAgaWYgKGFjdGl2ZUdvYWxEZWNpc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjb250aW51ZV9leGVjdXRpb24gaXMgb25seSBmb3IgcmVzdW1pbmcgYSBwYXVzZWQgZXhlY3V0aW9uIGFmdGVyIGF0IGxlYXN0IGAgK1xuICAgICAgICBgb25lIHJlY29yZGVkIHN0ZXAgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gQWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdGhlIGAgK1xuICAgICAgICBgbmV4dCBsaWZlY3ljbGUgY2FsbCBpcyBtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDaGVjayBpZiBhZ2VudCBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmVcbiAgICBjb25zdCBpc1Jlc3VtaW5nID0gc3RhdGUuc2Vzc2lvbkNvdW50ID4gMCB8fCBzdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID4gMDtcblxuICAgIC8vIDQuIEV4ZWN1dGUgYWdlbnQgbm9ybWFsbHkgKHRoaXMgYWN0aXZhdGVzIGVsZW1lbnRzIGFuZCBnZXRzIGNvbnRleHQpXG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0gcGFyYW1zLnBhcmFtZXRlcnMgfHwge307XG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBZ2VudChcbiAgICAgIHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBleGVjdXRpb25QYXJhbXMsXG4gICAgICB7IG9wZXJhdGlvbk5hbWU6ICdjb250aW51ZV9leGVjdXRpb24nIH1cbiAgICApO1xuXG4gICAgLy8gNS4gQnVpbGQgcHJldmlvdXMgc3RhdGUgc3VtbWFyeVxuICAgIGNvbnN0IHJlY2VudERlY2lzaW9ucyA9IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtNSkubWFwKGQgPT4gKHtcbiAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgIG91dGNvbWU6IGQub3V0Y29tZSxcbiAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGdvYWxTdW1tYXJ5ID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgcHJvZ3Jlc3M6IHVuZGVmaW5lZCAvLyBDb3VsZCBhZGQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gZnV0dXJlXG4gICAgfSkpO1xuXG4gICAgLy8gNi4gR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gc3RhdGVcbiAgICBjb25zdCBzdWdnZXN0ZWROZXh0U3RlcHMgPSB0aGlzLmdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlKTtcblxuICAgIC8vIDcuIE1lcmdlIGV4ZWN1dGlvbiByZXN1bHQgd2l0aCBjb250aW51YXRpb24gY29udGV4dFxuICAgIHJldHVybiB7XG4gICAgICAvLyBJbmNsdWRlIGFsbCBmaWVsZHMgZnJvbSBleGVjdXRlX2FnZW50IHJlc3VsdFxuICAgICAgLi4uZXhlY3V0aW9uUmVzdWx0LFxuXG4gICAgICAvLyBBZGQgcHJldmlvdXMgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IGdvYWxTdW1tYXJ5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZCBjb250aW51YXRpb24gY29udGV4dFxuICAgICAgY29udGludWF0aW9uOiB7XG4gICAgICAgIGlzUmVzdW1pbmcsXG4gICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCxcbiAgICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlOiBBZ2VudFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgZ29hbHNcbiAgICBjb25zdCBwZW5kaW5nR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKTtcbiAgICBpZiAocGVuZGluZ0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFN0YXJ0IHdvcmsgb24gJHtwZW5kaW5nR29hbHMubGVuZ3RofSBwZW5kaW5nIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW4tcHJvZ3Jlc3MgZ29hbHNcbiAgICBjb25zdCBpblByb2dyZXNzR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG4gICAgaWYgKGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBDb250aW51ZSAke2luUHJvZ3Jlc3NHb2Fscy5sZW5ndGh9IGluLXByb2dyZXNzIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYmxvY2tlZCBnb2FscyAoZGVwZW5kZW5jaWVzKVxuICAgIGNvbnN0IGJsb2NrZWRHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+XG4gICAgICBnLmRlcGVuZGVuY2llcyAmJiBnLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwICYmIGcuc3RhdHVzID09PSAncGVuZGluZydcbiAgICApO1xuICAgIGlmIChibG9ja2VkR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yICR7YmxvY2tlZEdvYWxzLmxlbmd0aH0gYmxvY2tlZCBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVjaXNpb24gaGlzdG9yeSBmb3IgZmFpbHVyZXNcbiAgICBjb25zdCByZWNlbnRGYWlsdXJlcyA9IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgLnNsaWNlKC0xMClcbiAgICAgIC5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdmYWlsdXJlJyk7XG4gICAgaWYgKHJlY2VudEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJldmlldyBhbmQgYWRkcmVzcyAke3JlY2VudEZhaWx1cmVzLmxlbmd0aH0gcmVjZW50IGZhaWx1cmUocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|
|
2703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QmFzZUVsZW1lbnRNYW5hZ2VyXG4gKiBNYW5hZ2VzIGFnZW50IENSVUQgb3BlcmF0aW9ucywgbWV0YWRhdGEgc2FuaXRpemF0aW9uLCBhbmQgc3RhdGUgcGVyc2lzdGVuY2UuXG4gKi9cblxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQge1xuICBDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT04sXG4gIEFHRU5UX0xJTUlUUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTLFxuICBTVEVQX0xJTUlUX0FDVElPTlMsXG4gIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMsXG4gIEJBQ0tPRkZfU1RSQVRFR0lFUyxcbiAgaXNPbmVPZixcbiAgbm9ybWFsaXplQXV0b25vbXlLZXlzLFxuICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyxcbiAgbm9ybWFsaXplR29hbEtleXMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIEFnZW50TWV0YWRhdGEsXG4gIEFnZW50U3RhdGUsXG4gIEV4ZWN1dGVBZ2VudFJlc3VsdCxcbiAgQWdlbnRHb2FsQ29uZmlnLFxuICBBZ2VudEdvYWxQYXJhbWV0ZXIsXG4gIEFnZW50TWV0YWRhdGFWMixcbiAgQWdlbnRHb2FsLFxuICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEF1dG9ub215RGlyZWN0aXZlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEdhdGhlcmVkRGF0YSwgdHlwZSBHYXRoZXJlZERhdGEgfSBmcm9tICcuL2dhdGhlcmVkRGF0YS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUF1dG9ub215IH0gZnJvbSAnLi9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQge1xuICBpc1YxQWdlbnQsXG4gIGNvbnZlcnRWMVRvVjIsXG59IGZyb20gJy4vdjFUb1YyQ29udmVydGVyLmpzJztcbmltcG9ydCB7XG4gIGRldGVybWluZVNhZmV0eVRpZXIsXG4gIGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZSxcbiAgY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdCxcbiAgY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbixcbiAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9zYWZldHlUaWVyU2VydmljZS5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5wdXROb3JtYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXROb3JtYWxpemVyLmpzJztcbmltcG9ydCB7IFNhZmVSZWdleCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Rvc1Byb3RlY3Rpb24uanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuXG5jb25zdCBBR0VOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuY29uc3QgU1RBVEVfRElSRUNUT1JZID0gJy5zdGF0ZSc7XG5jb25zdCBTVEFURV9GSUxFX0VYVEVOU0lPTiA9ICcuc3RhdGUueWFtbCc7XG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0O1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7XG5cbi8qKiBNYXRjaCB0aGUgc2FuaXRpemVkIHN0b3JhZ2UgaWRlbnRpdHkgdXNlZCBieSBhZ2VudCBkZWZpbml0aW9uIGxvb2t1cC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBZ2VudEV4ZWN1dGlvbklkZW50aXR5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5KHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG59XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBQYXJzZWRBZ2VudEZpbGUge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxleGlibGVSZWFkQ2FuZGlkYXRlIHtcbiAgYWdlbnQ6IEFnZW50O1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxleGlibGVSZWFkQ2FuZGlkYXRlcyB7XG4gIGNhbmRpZGF0ZXM6IEZsZXhpYmxlUmVhZENhbmRpZGF0ZVtdO1xuICBsb2FkRmFpbHVyZXM6IHVua25vd25bXTtcbn1cblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeSB7XG4gIHRva2VuOiBvYmplY3Q7XG4gIGFjdGl2ZUV4ZWN1dGlvbnM6IG51bWJlcjtcbiAgb2JzZXJ2ZXJzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uR2VuZXJhdGlvbk9ic2VydmF0aW9uIHtcbiAgdG9rZW46IG9iamVjdDtcbiAgcmVsZWFzZTogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBBZ2VudENyZWF0ZU1ldGFkYXRhID0gKFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4gJiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pICYge1xuICBjb250ZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgLyoqIFBlci1hZ2VudCB0b2tlbnMgcmV0YWluZWQgb25seSB3aGlsZSBleGVjdXRpb24gb3IgcmVjb3ZlcnkgaXMgaW4gZmxpZ2h0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvbkdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeT4oKTtcbiAgLy8gVHJhY2sgYWN0aXZlIGFnZW50cyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVBZ2VudE5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGF0aWMgcmVzb2x2ZXIgZm9yIGVsZW1lbnQgbWFuYWdlciBsb29rdXAgKERJIHBhdHRlcm4pXG4gIC8vIFRoaXMgYWxsb3dzIEFnZW50IGluc3RhbmNlcyB0byByZXNvbHZlIG1hbmFnZXJzIHdpdGhvdXQgdGlnaHQgY291cGxpbmdcbiAgcHJpdmF0ZSBzdGF0aWMgZWxlbWVudE1hbmFnZXJSZXNvbHZlcj86IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgLy8gSXNzdWUgIzQwMjogU3RhdGljIHJlc29sdmVyIGZvciBEYW5nZXJab25lRW5mb3JjZXIgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIGRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPzogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXI7XG5cbiAgLy8gSXNzdWUgIzE0MjogU3RhdGljIHJlc29sdmVyIGZvciBWZXJpZmljYXRpb25TdG9yZSAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgdmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj86ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnREaXJPdmVycmlkZSA9IHBhdGguam9pbihiYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuQUdFTlQsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBlbGVtZW50RGlyT3ZlcnJpZGUsIGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FnZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBmb3IgZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciBGdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFuYWdlciBuYW1lIGFuZCByZXR1cm5zIHRoZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM0MDI6IFNldCBEYW5nZXJab25lRW5mb3JjZXIgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXIpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMTQyOiBTZXQgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH0pOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk6ICgobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWdlbnRzIGFuZCBzdGF0ZSBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmVsZW1lbnREaXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogQWdlbnRDcmVhdGVNZXRhZGF0YVxuICApOiBQcm9taXNlPEVsZW1lbnRDcmVhdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgICAgLy8gTm9ybWFsaXplIGdvYWwgaW5wdXQgYmVmb3JlIHZhbGlkYXRpb24gLSBMTE1zIG1heSBwYXNzIHN0cmluZyBvciBvYmplY3RcbiAgICAgIC8vIFN0cmlwICdjb250ZW50JyBmcm9tIG1ldGFkYXRhIHRvIHByZXZlbnQgaXQgZnJvbSBvdmVyd3JpdGluZyB0aGUgcG9zaXRpb25hbFxuICAgICAgLy8gY29udGVudCBwYXJhbSAod2hpY2ggaXMgdGhlIGFnZW50J3MgaW5zdHJ1Y3Rpb25zIHRleHQpIGluIHRoZSB2YWxpZGF0aW9uIGNhbGwuXG4gICAgICBjb25zdCB7IGNvbnRlbnQ6IHJlZmVyZW5jZUNvbnRlbnQsIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnQgfSA9IG1ldGFkYXRhID8/IHt9O1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gPSB7XG4gICAgICAgIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnRcbiAgICAgIH07XG4gICAgICBpZiAobWV0YWRhdGE/LmdvYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3JtYWxpemVkTWV0YWRhdGEuZ29hbCA9IHRoaXMubm9ybWFsaXplR29hbElucHV0KFxuICAgICAgICAgIG1ldGFkYXRhLmdvYWwgYXMgc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAvLyBBZ2VudHMgc3VwcG9ydCBkdWFsLWZpZWxkIGNyZWF0aW9uOiBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyBhbmQgb3B0aW9uYWxcbiAgICAgIC8vIHJlZmVyZW5jZSBjb250ZW50LiBWYWxpZGF0aW9uIHByZWZlcnMgYmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgd2hlbiBib3RoXG4gICAgICAvLyBmaWVsZHMgYXJlIHByZXNlbnQgc28gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24tZmlyc3QgYWdlbnRzIGtlZXAgdGhlaXJcbiAgICAgIC8vIGN1cnJlbnQgc2VtYW50aWNzIHdoaWxlIGNvbnRlbnQtb25seSBhZ2VudHMgc3RpbGwgdmFsaWRhdGUgY29ycmVjdGx5LlxuICAgICAgY29uc3QgdmFsaWRhdGlvbklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByaW1hcnlUZXh0ID0gdGhpcy5nZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudCwgcmVmZXJlbmNlQ29udGVudCk7XG4gICAgICB2YWxpZGF0aW9uSW5wdXQuY29udGVudCA9IHByaW1hcnlUZXh0ID8/ICcnO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHZhbGlkYXRpb25JbnB1dCk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgaW5wdXRzIGZvciBlbGVtZW50IGNyZWF0aW9uXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgICAvLyBVc2UgQ29udGVudFZhbGlkYXRvciBmb3IgbXVsdGktbGluZSBjb250ZW50IHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgKG5ld2xpbmVzLCB0YWJzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgZGV0ZWN0aW5nIHByb21wdCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJztcblxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBhZ2VudCBuYW1lLiBVc2Ugb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgICB9LCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIGFnZW50Lm1ldGFkYXRhLmF1dGhvciA9IG5vcm1hbGl6ZWRNZXRhZGF0YT8uYXV0aG9yID8/IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBub3JtYWxpemVkTWV0YWRhdGE/LnNwZWNpYWxpemF0aW9ucyA/PyBhZ2VudC5leHRlbnNpb25zPy5zcGVjaWFsaXphdGlvbnMgPz8gW10sXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiBub3JtYWxpemVkTWV0YWRhdGE/LmRlY2lzaW9uRnJhbWV3b3JrID8/IGFnZW50LmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiBub3JtYWxpemVkTWV0YWRhdGE/LnJpc2tUb2xlcmFuY2UgPz8gYWdlbnQuZXh0ZW5zaW9ucz8ucmlza1RvbGVyYW5jZSxcbiAgICAgICAgbGVhcm5pbmdFbmFibGVkOiBub3JtYWxpemVkTWV0YWRhdGE/LmxlYXJuaW5nRW5hYmxlZCA/PyBhZ2VudC5leHRlbnNpb25zPy5sZWFybmluZ0VuYWJsZWQsXG4gICAgICB9O1xuICAgICAgLy8gUHJvbW90ZSBpbnN0cnVjdGlvbnMgdG8gZmlyc3QtY2xhc3MgcHJvcGVydHkgKG5vIGxvbmdlciBpbiBleHRlbnNpb25zKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgLy8gQWxzbyBrZWVwIGluIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdCBkdXJpbmcgdHJhbnNpdGlvblxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG5cbiAgICAgIC8vIFNldCByZWZlcmVuY2UgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlQ29udGVudCA9PT0gJ3N0cmluZycgJiYgcmVmZXJlbmNlQ29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShcbiAgICAgICAgICByZWZlcmVuY2VDb250ZW50LFxuICAgICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29udGVudFZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWYWxpZGF0aW9uIGZhaWxlZDogJHsoY29udGVudFZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyB8fCBbJ0NvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQnXSkuam9pbignLCAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBhZ2VudC5jb250ZW50ID0gY29udGVudFZhbGlkYXRpb25SZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCAnJztcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzcyNzogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBWMiBmaWVsZHMgQkVGT1JFIGFzc2lnbm1lbnQuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBTRUNPTkQgdmFsaWRhdGlvbiBsYXllciDigJQgQWdlbnRFbGVtZW50VmFsaWRhdG9yIChjYWxsZWQgYWJvdmUgdmlhXG4gICAgICAvLyB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSkgaXMgdGhlIGZpcnN0LiBUaGUgdmFsaWRhdG9yIGNhdGNoZXMgY2FtZWxDYXNlXG4gICAgICAvLyBpbnZhbGlkIHZhbHVlczsgdGhpcyBtZXRob2QgYWxzbyBub3JtYWxpemVzIHNuYWtlX2Nhc2Uga2V5cyAod2hpY2ggdGhlIHZhbGlkYXRvclxuICAgICAgLy8gZG9lc24ndCBzZWUpIGFuZCB2YWxpZGF0ZXMgdGhlbS4gQm90aCBsYXllcnMgYXJlIG5lZWRlZC4gU2VlIElzc3VlICM3MzAuXG4gICAgICBjb25zdCBtZXRhZGF0YVYyID0gbm9ybWFsaXplZE1ldGFkYXRhIGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtZXRhZGF0YVYyKSB7XG4gICAgICAgIGNvbnN0IHYyRXJyb3JzID0gdGhpcy52YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhVjIpO1xuICAgICAgICBpZiAodjJFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWMiBmaWVsZCB2YWxpZGF0aW9uIGZhaWxlZDogJHt2MkVycm9ycy5qb2luKCc7ICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFYyIEZJRUxEUzogU3RvcmUgVjItc3BlY2lmaWMgZmllbGRzIGluIGFnZW50IG1ldGFkYXRhIChub3QganVzdCBleHRlbnNpb25zKVxuICAgICAgLy8gVGhpcyBlbmFibGVzIFYyIGFnZW50IGNyZWF0aW9uIHZpYSBNQ1AtQVFMIGNyZWF0ZV9lbGVtZW50IG9wZXJhdGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdvYWwpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hY3RpdmF0ZXMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYWN0aXZhdGVzID0gbWV0YWRhdGFWMi5hY3RpdmF0ZXM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8udG9vbHMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnN5c3RlbVByb21wdCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hdXRvbm9teSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hdXRvbm9teSA9IG1ldGFkYXRhVjIuYXV0b25vbXk7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBQZXJzaXN0IGdhdGVrZWVwZXIgcG9saWN5IGZvciBHYXRla2VlcGVyIGVuZm9yY2VtZW50IGR1cmluZyBleGVjdXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nYXRla2VlcGVyKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNzIyOiBQZXJzaXN0IHJlc2lsaWVuY2UgcG9saWN5ICh3YXMgbWlzc2luZyBmcm9tIFYyIGZpZWxkIGFzc2lnbm1lbnRzKVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnJlc2lsaWVuY2UpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzYxMzogQ2hlY2sgbWV0YWRhdGEgbmFtZSB1bmlxdWVuZXNzIChub3QganVzdCBmaWxlbmFtZSlcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0FnZW50cy5maW5kKGEgPT5cbiAgICAgICAgYS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNhbml0aXplZE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJpYWxpemUgdGhlIGFnZW50IGNvbnRlbnQgZmlyc3RcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRDb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG5cbiAgICAgIC8vIFVzZSBhdG9taWMgZmlsZSBjcmVhdGlvbiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGNoZWNrLXRoZW4td3JpdGUgcGF0dGVybiB3aXRoIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb25cbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZUZpbGVFeGNsdXNpdmUoYWJzb2x1dGVQYXRoLCBzZXJpYWxpemVkQ29udGVudCwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENhY2hlIHRoZSBlbGVtZW50IGFmdGVyIHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGFnZW50LCBmaWxlbmFtZSk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChmaWxlbmFtZSwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIGNhY2hlRWxlbWVudCgpIHN0b3JlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBjcmVhdGVkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgYWdlbnRJZDogYWdlbnQuaWQgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDwn6SWICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YWdlbnQubWV0YWRhdGEuYXV0aG9yIHx8ICdhbm9ueW1vdXMnfWAsXG4gICAgICAgIGVsZW1lbnQ6IGFnZW50XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgYnkgbmFtZSAod2l0aG91dCBleHRlbnNpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFnZW50IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKiBAcmV0dXJucyBBZ2VudCBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgcmVhZChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRXaXRoU3RhdGVQb2xpY3kobmFtZSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgd2hpbGUgc2VsZWN0aW5nIHdoZXRoZXIgc3RhdGUtc3RvcmFnZSBmYWlsdXJlcyBhcmUgZmF0YWwuXG4gICAqIFNlY3VyaXR5LXNlbnNpdGl2ZSBjYWxsZXJzIHVzZSBzdHJpY3Qgc3RhdGUgcmVhZHMgc28gdW5hdmFpbGFibGUgZHVyYWJsZVxuICAgKiBzdGF0ZSBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIGFuIGFnZW50IHdpdGggbm8gYWN0aXZlIGdvYWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkV2l0aFN0YXRlUG9saWN5KG5hbWU6IHN0cmluZywgc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4pOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZEFnZW50RmlsZShmaWxlbmFtZSwgdHJ1ZSwgc3RyaWN0U3RhdGVFcnJvcnMsICFzdHJpY3RTdGF0ZUVycm9ycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGYWxsYmFjazogZmxleGlibGUgbWF0Y2hpbmcgdmlhIGxpc3Qgc2NhbiAoIzYwNylcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZsZXhpYmx5KG5hbWUsIHN0cmljdFN0YXRlRXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayBmb3IgcmVhZCgpIHdoZW4gZGlyZWN0IGZpbGUgbG9va3VwIGZhaWxzLlxuICAgKiBTZWFyY2hlcyBsb2FkZWQgYWdlbnRzIGJ5IG1ldGFkYXRhIG5hbWUgdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgc2x1ZyBtYXRjaGluZy5cbiAgICogTG9ncyBhIHdhcm5pbmcgd2hlbiBhIG1hdGNoIGlzIGZvdW5kIChpbmRpY2F0ZXMgZmlsZW5hbWUvbmFtZSBtaXNtYXRjaCBuZWVkaW5nIGNsZWFudXApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGaWxlIG9uIGRpc2s6IFwibGVnYWN5LXBvc3Rlci1hZ2VudC5tZFwiXG4gICAqIC8vIE1ldGFkYXRhIG5hbWU6IFwibGVnYWN5LXBvc3RlclwiXG4gICAqIC8vIERpcmVjdCBsb29rdXAgZm9yIFwibGVnYWN5LXBvc3Rlci5tZFwiIGZhaWxzIChFTk9FTlQpXG4gICAqIC8vIEZsZXhpYmxlIGZhbGxiYWNrIG1hdGNoZXMgdmlhIG1ldGFkYXRhIG5hbWU6XG4gICAqIGNvbnN0IGFnZW50ID0gYXdhaXQgcmVhZChcImxlZ2FjeS1wb3N0ZXJcIik7IC8vIHJlc29sdmVzIHZpYSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkRmxleGlibHkobmFtZTogc3RyaW5nLCBzdHJpY3RTdGF0ZUVycm9ycyA9IGZhbHNlKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBjYW5kaWRhdGVzLCBsb2FkRmFpbHVyZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZvckZsZXhpYmxlUmVhZChzdHJpY3RTdGF0ZUVycm9ycyk7XG5cbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoU2x1ZyA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG5cbiAgICAgIC8vIFBhc3MgMTogZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBvbiBtZXRhZGF0YSBuYW1lXG4gICAgICBsZXQgbWF0Y2ggPSBjYW5kaWRhdGVzLmZpbmQoXG4gICAgICAgICh7IGFnZW50IH0pID0+IGFnZW50Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gY2FuZGlkYXRlcy5maW5kKCh7IGFnZW50IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhZ2VudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gc2x1ZyA9PT0gc2VhcmNoU2x1ZyB8fCBzbHVnID09PSBzZWFyY2hMb3dlcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAvLyBTdHJpY3QgcmVjb3ZlcnkgdmVyaWZpZXMgdGhlIGNhbGxlci1yZXF1ZXN0ZWQgaWRlbnRpdHkuIE9yZGluYXJ5IGxlZ2FjeVxuICAgICAgICAvLyByZWFkcyBwcmVzZXJ2ZSB0aGUgc3RhdGUgaWRlbnRpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXRjaGVkIGZpbGUuXG4gICAgICAgIGNvbnN0IHN0YXRlSWRlbnRpdHkgPSBzdHJpY3RTdGF0ZUVycm9ycyA/IG5hbWUgOiB0aGlzLnN0cmlwRXh0ZW5zaW9uKG1hdGNoLmZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkU3RhdGVGb3VuZCA9IGF3YWl0IHRoaXMuaHlkcmF0ZUFnZW50U3RhdGUoXG4gICAgICAgICAgbWF0Y2guYWdlbnQsXG4gICAgICAgICAgc3RhdGVJZGVudGl0eSxcbiAgICAgICAgICBzdHJpY3RTdGF0ZUVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzICYmICFyZXF1ZXN0ZWRTdGF0ZUZvdW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCB2ZXJpZnkgZHVyYWJsZSBzdGF0ZSBmb3IgZmxleGlibHkgbWF0Y2hlZCBhZ2VudCBcIiR7bmFtZX1cIiB1bmRlciBpdHMgcmVxdWVzdGVkIGlkZW50aXR5YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFnZW50IFwiJHtuYW1lfVwiIHJlc29sdmVkIHZpYSBmbGV4aWJsZSBtYXRjaGluZyB0byBmaWxlIHdpdGggbWV0YWRhdGEgbmFtZSBcIiR7bWF0Y2guYWdlbnQubWV0YWRhdGEubmFtZX1cIi4gYCArXG4gICAgICAgICAgYENvbnNpZGVyIHJlbmFtaW5nIHRoZSBmaWxlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBjb252ZW50aW9uICgjNjA3KS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtYXRjaC5hZ2VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWRGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IGxvYWRGYWlsdXJlc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCAobG9va3VwRXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bG9va3VwRXJyb3J9YCk7XG4gICAgICB0aHJvdyBsb29rdXBFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW51bWVyYXRlIGZhbGxiYWNrIGNhbmRpZGF0ZXMgd2l0aG91dCBjcmVhdGluZyBtaXNzaW5nIHN0b3JhZ2UuIFN0cmljdFxuICAgKiByZWNvdmVyeSBwcm9wYWdhdGVzIGxpc3RpbmcgZmFpbHVyZXM7IG9yZGluYXJ5IHJlYWRzIHJldGFpbiB0aGUgcG9ydGZvbGlvXG4gICAqIEFQSSdzIGVtcHR5LWRpcmVjdG9yeSBhbmQgdW5hdmFpbGFibGUtZGlyZWN0b3J5IGNvbXBhdGliaWxpdHkgYmVoYXZpb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RGb3JGbGV4aWJsZVJlYWQoc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4pOiBQcm9taXNlPEZsZXhpYmxlUmVhZENhbmRpZGF0ZXM+IHtcbiAgICBjb25zdCBmaWxlcyA9IHN0cmljdFN0YXRlRXJyb3JzXG4gICAgICA/IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoRWxlbWVudFR5cGUuQUdFTlQsIHsgdGhyb3dPbkZpbGVzeXN0ZW1FcnJvcjogdHJ1ZSB9KVxuICAgICAgOiBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICAvLyBMb2FkIGRlZmluaXRpb25zIHdpdGhvdXQgY2FuZGlkYXRlLWZpbGVuYW1lIHN0YXRlLiBPbmNlIGEgbWF0Y2ggaXMga25vd24sXG4gICAgLy8gcmVhZEZsZXhpYmx5KCkgaHlkcmF0ZXMgaXQgdXNpbmcgdGhlIHJlcXVlc3RlZCBsb2dpY2FsIGlkZW50aXR5LlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBmaWxlcy5tYXAoZmlsZSA9PiB0aGlzLmxvYWRBZ2VudEZpbGUoZmlsZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpXG4gICAgKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzOiBGbGV4aWJsZVJlYWRDYW5kaWRhdGVzID0ge1xuICAgICAgY2FuZGlkYXRlczogW10sXG4gICAgICBsb2FkRmFpbHVyZXM6IFtdXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCByZXN1bHRdIG9mIHJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5jYW5kaWRhdGVzLnB1c2goeyBhZ2VudDogcmVzdWx0LnZhbHVlLCBmaWxlUGF0aDogZmlsZXNbaW5kZXhdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5sb2FkRmFpbHVyZXMucHVzaChyZXN1bHQucmVhc29uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWV0YWRhdGEvY29udGVudCBmb3IgYW4gZXhpc3RpbmcgYWdlbnQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4sXG4gICAgY29udGVudD86IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHNhbml0aXplZE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBub3QgZm91bmQgZm9yIHVwZGF0ZTogJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGVkaXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUVkaXQoYWdlbnQsIHtcbiAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICBjb250ZW50XG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBBZ2VudCB1cGRhdGUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgQWdlbnQgdXBkYXRlIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoXG4gICAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVwZGF0ZXMuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICA1MDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogdXBkYXRlcy5zcGVjaWFsaXphdGlvbnMubWFwKGl0ZW0gPT4gc2FuaXRpemVJbnB1dChpdGVtLCA1MCkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiB1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgcmlza1RvbGVyYW5jZTogdXBkYXRlcy5yaXNrVG9sZXJhbmNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSB1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscztcbiAgICB9XG5cbiAgICBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgdXBkYXRlZDogJHtzYW5pdGl6ZWROYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcHJvdmlkZWQgYWdlbnQgbmFtZS5cbiAgICovXG4gIHZhbGlkYXRlTmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgYmUgZW1wdHknIH07XG4gICAgfVxuXG4gICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gYWdlbnQgZnJvbSBzZXJpYWxpemVkIGNvbnRlbnQuXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VKc29uKGRhdGEsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHBhcnNlZC5tZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShwYXJzZWQpKTtcbiAgICAgIH1cbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogcGFyc2VkLmluc3RydWN0aW9ucyB8fCAnJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG5cbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChyZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBhZ2VudCB0byBKU09OIG9yIG1hcmtkb3duIChkZWZhdWx0KS5cbiAgICovXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQoYWdlbnQ6IEFnZW50LCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBhZ2VudC5zZXJpYWxpemVUb0pTT04oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGFnZW50IGZpbGUsIGVuZm9yY2luZyBzaXplIGFuZCBmb3JtYXQgY2hlY2tzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRBZ2VudEZpbGUoZmlsZVBhdGgsIHRydWUsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50RmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGh5ZHJhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBzdHJpY3RTdGF0ZUVycm9yczogYm9vbGVhbixcbiAgICBjYWNoZUxvYWRlZEVsZW1lbnQgPSB0cnVlLFxuICApOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgaWYgKGh5ZHJhdGVTdGF0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKFxuICAgICAgICAgIGFnZW50LFxuICAgICAgICAgIHRoaXMuc3RyaXBFeHRlbnNpb24ocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgICBzdHJpY3RTdGF0ZUVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYWNoZUxvYWRlZEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGAsXG4gICAgICAgIGRldGFpbHM6IGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gbG9hZGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgZnJvbSAke2Z1bGxQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUgdG8gcGVyc2lzdCBzdGF0ZSB3aGVuIHJlcXVpcmVkLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShhZ2VudDogQWdlbnQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcbiAgICBhd2FpdCBzdXBlci5zYXZlKGFnZW50LCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIGlmIChhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUodGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKSwgYWdlbnQuZ2V0U3RhdGUoKSk7XG4gICAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pOyAgLy8gU3luYyBhZ2VudCdzIGludGVybmFsIHZlcnNpb24gKElzc3VlICMxMjMgZml4KVxuICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYWdlbnQgc3RhdGUgdG8gZGlzayAocHVibGljIEFQSSBmb3IgZXh0ZXJuYWwgY2FsbGVycykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBwcm9wZXIgd2F5IGZvciBleHRlcm5hbCBjb2RlIChzdHJhdGVnaWVzLCBoYW5kbGVycykgdG9cbiAgICogdHJpZ2dlciBzdGF0ZSBwZXJzaXN0ZW5jZS4gSXQgaW1wbGVtZW50cyB0aGUgT3B0aW9uIEMgcGF0dGVybiBmcm9tIElzc3VlICMxMjM6XG4gICAqIHN0YXRlVmVyc2lvbiBpcyBvbmx5IGluY3JlbWVudGVkIG9uIHN1Y2Nlc3NmdWwgc2F2ZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBBZ2VudCBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj4gLSBUcnVlIGlmIHN0YXRlIHdhcyBwZXJzaXN0ZWQsIGZhbHNlIGlmIG5vdCBuZWVkZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhZ2VudCBub3QgZm91bmQgb3Igc2F2ZSBmYWlsc1xuICAgKi9cbiAgYXN5bmMgcGVyc2lzdFN0YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgbm90IGZvdW5kOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKG5hbWUsIGFnZW50LmdldFN0YXRlKCkpO1xuICAgIGFnZW50W0NPTU1JVF9QRVJTSVNURURfVkVSU0lPTl0obmV3VmVyc2lvbik7XG4gICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIHJlbW92ZSBhc3NvY2lhdGVkIHN0YXRlIGZpbGUuXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIHRvIGVuc3VyZSBzdGF0ZSBmaWxlIGRlbGV0aW9uIG1hdGNoZXNcbiAgICogdGhlIG5vcm1hbGl6ZWQgZmlsZW5hbWUgdXNlZCBmb3Igc3RhdGUgZmlsZSBjcmVhdGlvbi9sb2FkaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKTtcbiAgICBhd2FpdCBzdXBlci5kZWxldGUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgZGVsZXRpb25cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhY2sgdXAgdGhlIHN0YXRlIGZpbGUgYmVmb3JlIGRlbGV0aW5nIGl0XG4gICAgICBpZiAodGhpcy5iYWNrdXBTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm1vdmVkT3JpZ2luYWwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShzdGF0ZVBhdGgsIEVsZW1lbnRUeXBlLkFHRU5ULCB7XG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgY2FjaGUgY2xlYW51cFxuICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICByZXR1cm4gc3VwZXIuZXhpc3RzKHNhbml0aXplZFBhdGgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmFsaWRhdGVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0YXJnZXRQYXRoLmluY2x1ZGVzKCcuLicpIHx8IHRhcmdldFBhdGguaW5jbHVkZXMoJ34nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0UGF0aC5zdGFydHNXaXRoKCcvJykgfHwgL15bQS1aYS16XTovLnRlc3QodGFyZ2V0UGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFHRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVBZ2VudE5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBhY3RpdmUgc3RhdHVzIHRvIGFnZW50cyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldCAoYnkgbmFtZSlcbiAgICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5oYXMoYWdlbnQubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGFnZW50IHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgYWdlbnQ/OiBBZ2VudCB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIC8vIEFkZCB0byBhY3RpdmUgc2V0IChieSBuYW1lLCB3aGljaCBpcyBzdGFibGUgYWNyb3NzIHJlbG9hZHMpXG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmFkZChhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGdvYWxDb3VudDogKGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogYWdlbnQubWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSksXG4gICAgICBhZ2VudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVBZ2VudChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0FHRU5UX0RFQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGRlYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkFHRU5ULCBhZ2VudC5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgYWdlbnRzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maWx0ZXIoYSA9PiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGEubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gYWdlbnQgd2l0aCBnb2FsIHBhcmFtZXRlcnNcbiAgICpcbiAgICogUmV0dXJucyBjb250ZXh0IGZvciBMTE0gdG8gZHJpdmUgdGhlIGFnZW50aWMgbG9vcC5cbiAgICogVGhpcyBtZXRob2Q6XG4gICAqIDEuIExvYWRzIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uXG4gICAqIDIuIFZhbGlkYXRlcyBhbmQgcmVuZGVycyB0aGUgZ29hbCB0ZW1wbGF0ZSB3aXRoIHBhcmFtZXRlcnNcbiAgICogMy4gQWN0aXZhdGVzIGNvbmZpZ3VyZWQgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIDQuIEV2YWx1YXRlcyBwcm9ncmFtbWF0aWMgY29uc3RyYWludHMgYW5kIHJpc2tcbiAgICogNS4gUmV0dXJucyBzdHJ1Y3R1cmVkIGNvbnRleHQgZm9yIExMTVxuICAgKlxuICAgKiBUaGUgTExNIHRoZW4gZHJpdmVzIHRoZSBhZ2VudGljIGxvb3AgdXNpbmcgdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC8vIFRocmVhZCB0aGUgdHJpZ2dlcmluZyBNQ1AgbGlmZWN5Y2xlIG9wIHRocm91Z2ggdmFsaWRhdGlvbiBzbyBlcnJvciBtZXNzYWdlc1xuICAgIC8vIGNhbiBkaXN0aW5ndWlzaCBhIGZyZXNoIGV4ZWN1dGVfYWdlbnQgY2FsbCBmcm9tIGEgbWlzdXNlZCBjb250aW51ZV9leGVjdXRpb24uXG4gICAgY29udGV4dDoge1xuICAgICAgb3BlcmF0aW9uTmFtZT86ICdleGVjdXRlX2FnZW50JyB8ICdjb250aW51ZV9leGVjdXRpb24nO1xuICAgIH0gPSB7fVxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIC8vIE11c3QgaGFwcGVuIGJlZm9yZSBhbnkgYXdhaXQgc28gcmVjb3Zlcnkgc2VlcyBzdGFydHMgZnJvbSBNQ1AtQVFMLCBsZWdhY3lcbiAgICAvLyB0b29scywgYW5kIGFueSBmdXR1cmUgY2FsbGVyIHRoYXQgdXNlcyB0aGUgc2hhcmVkIG1hbmFnZXIgZW50cnkgcG9pbnQuXG4gICAgdGhpcy5iZWdpbkV4ZWN1dGlvbkF0dGVtcHQobmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IG1ldGFkYXRhIGFzIHYyIChtYXkgaGF2ZSBnb2FsIGNvbmZpZylcbiAgICAgIGxldCBtZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHYyLjAgYWdlbnQgd2l0aCBnb2FsIGNvbmZpZ3VyYXRpb25cbiAgICAgIC8vIElmIG5vdCwgYXV0by1jb252ZXJ0IFYxIHRvIFYyIGluIHBsYWNlIChJc3N1ZSAjNTg3KVxuICAgICAgaWYgKCFtZXRhZGF0YS5nb2FsIHx8ICFtZXRhZGF0YS5nb2FsLnRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChpc1YxQWdlbnQobWV0YWRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYWdlbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHQgPSBjb252ZXJ0VjFUb1YyKG1ldGFkYXRhLCBpbnN0cnVjdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKGNvbnZlcnNpb25SZXN1bHQuY29udmVydGVkKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBjb252ZXJ0ZWQgbWV0YWRhdGEgb250byB0aGUgZXhpc3RpbmcgYWdlbnQgKGluLXBsYWNlKVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFnZW50Lm1ldGFkYXRhLCBjb252ZXJzaW9uUmVzdWx0Lm1ldGFkYXRhKTtcblxuICAgICAgICAgICAgLy8gTG9nIGNvbnZlcnNpb24gd2FybmluZ3NcbiAgICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyBhdXRvLWNvbnZlcnRlZCBmcm9tIFYxIHRvIFYyIGluIHBsYWNlYCwge1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBjb252ZXJzaW9uUmVzdWx0Lndhcm5pbmdzLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdXBncmFkZWQgYWdlbnQgYmFjayB0byBpdHMgb3JpZ2luYWwgZmlsZVxuICAgICAgICAgICAgY29uc3QgdXBncmFkZWRGaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChuYW1lLCAxMDApKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdXBncmFkZWRGaWxlbmFtZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgQWdlbnQgJyR7bmFtZX0nIGNvbnZlcnRlZCBmcm9tIFYxIHRvIFYyIGFuZCBzYXZlZCBpbiBwbGFjZWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBZ2VudCAnJHtuYW1lfScgY2Fubm90IGJlIGV4ZWN1dGVkOiBtaXNzaW5nIGdvYWwudGVtcGxhdGUgYW5kIGNvbnZlcnNpb24gZmFpbGVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtuYW1lfScgaXMgbm90IGEgdjIuMCBhZ2VudC4gTWlzc2luZyBnb2FsLnRlbXBsYXRlIGNvbmZpZ3VyYXRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2xvbmUgcGFyYW1ldGVycyB0byBwcmV2ZW50IG11dGF0aW9uIG9mIGNhbGxlcidzIG9iamVjdCAoSXNzdWUgIzExOClcbiAgICAgIGNvbnN0IGNsb25lZFBhcmFtZXRlcnMgPSBzdHJ1Y3R1cmVkQ2xvbmUocGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDJiLiBTZWN1cml0eSB2YWxpZGF0aW9uIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgKElzc3VlICMxMDMpXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1ldGVyU2VjdXJpdHkoY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDMuIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsLnBhcmFtZXRlcnMgc2NoZW1hXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1ldGVycyhtZXRhZGF0YS5nb2FsLCBjbG9uZWRQYXJhbWV0ZXJzLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogY29udGV4dC5vcGVyYXRpb25OYW1lID8/ICdleGVjdXRlX2FnZW50JyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyA0LiBSZW5kZXIgZ29hbCB0ZW1wbGF0ZSBieSByZXBsYWNpbmcge3BhcmFtZXRlcn0gcGxhY2Vob2xkZXJzXG4gICAgICBjb25zdCByZW5kZXJlZEdvYWwgPSB0aGlzLnJlbmRlckdvYWxUZW1wbGF0ZShtZXRhZGF0YS5nb2FsLnRlbXBsYXRlLCBjbG9uZWRQYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gNGIuIERldGVjdCB1bm1hdGNoZWQgcGxhY2Vob2xkZXJzIGFmdGVyIHJlbmRlcmluZyAoSXNzdWUgIzEyNilcbiAgICAgIGNvbnN0IHVubWF0Y2hlZFBsYWNlaG9sZGVycyA9IHRoaXMuZGV0ZWN0VW5tYXRjaGVkUGxhY2Vob2xkZXJzKHJlbmRlcmVkR29hbCk7XG4gICAgICBpZiAodW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1VubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMgZGV0ZWN0ZWQgYWZ0ZXIgcmVuZGVyaW5nJywge1xuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB1bm1hdGNoZWQ6IHVubWF0Y2hlZFBsYWNlaG9sZGVycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIENyZWF0ZSBleGVjdXRpb24gY29udGV4dCBCRUZPUkUgYWN0aXZhdGluZyBlbGVtZW50cyAoSXNzdWUgIzEwOSAtIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uKVxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQobmFtZSk7XG5cbiAgICAgIC8vIDViLiBTdGF0aWMgYWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gKElzc3VlICMzNzQpXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzPy5hZ2VudHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBhd2FpdCB0aGlzLmRldGVjdEFjdGl2YXRpb25DeWNsZXMobmFtZSwgbWV0YWRhdGEuYWN0aXZhdGVzLmFnZW50cyk7XG4gICAgICAgIGlmIChjeWNsZVBhdGgpIHtcbiAgICAgICAgICBjb25zdCBjeWNsZVN0YXJ0ID0gY3ljbGVQYXRoLmluZGV4T2YoY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgY29uc3QgY3ljbGUgPSBjeWNsZVBhdGguc2xpY2UoY3ljbGVTdGFydCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEFnZW50TWFuYWdlci5mb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIEFjdGl2YXRlIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHM6IFJlY29yZDxzdHJpbmcsIEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4+ID0ge307XG4gICAgICBjb25zdCBhY3RpdmF0aW9uV2FybmluZ3M6IEFycmF5PHsgZWxlbWVudFR5cGU6IHN0cmluZzsgZWxlbWVudE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2VsZW1lbnRUeXBlLCBlbGVtZW50TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lcyB8fCBlbGVtZW50TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudE5hbWUgb2YgZWxlbWVudE5hbWVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudENvbnRlbnQoZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBleGVjdXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHNbZWxlbWVudFR5cGVdLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRDb250ZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSElHSC0xOiBSZS10aHJvdyBjaXJjdWxhciBhY3RpdmF0aW9uIGVycm9ycyBpbW1lZGlhdGVseSAoSXNzdWUgIzEwOSlcbiAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2lyY3VsYXIgYWdlbnQgYWN0aXZhdGlvbiBkZXRlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3MucHVzaCh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JzogZmFpbGVkIHRvIGFjdGl2YXRlICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScg4oCUICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGVsZW1lbnRzIHJhdGhlciB0aGFuIGZhaWxpbmcgY29tcGxldGVseVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA3LiBCdWlsZCB0aGUgcmVzdWx0IHdpdGggYWxsIGNvbnRleHQgKGluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHNhZmV0eSB0aWVyKVxuICAgICAgY29uc3QgcmVzdWx0OiBFeGVjdXRlQWdlbnRSZXN1bHQgPSB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgZ29hbDogcmVuZGVyZWRHb2FsLFxuICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgYWN0aXZhdGlvbldhcm5pbmdzOiBhY3RpdmF0aW9uV2FybmluZ3MubGVuZ3RoID4gMCA/IGFjdGl2YXRpb25XYXJuaW5ncyA6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gSXNzdWUgIzEyNjogV2FybiBhYm91dCB1bm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIHRlbXBsYXRlV2FybmluZ3M6IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB1bm1hdGNoZWRQbGFjZWhvbGRlcnMubWFwKHAgPT4gYFVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcjogeyR7cH19YClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHM6IG1ldGFkYXRhLnRvb2xzPy5hbGxvd2VkIHx8IFtdLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhIHx8IFtdLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IG1ldGFkYXRhLnN5c3RlbVByb21wdCxcbiAgICAgICAgc2FmZXR5VGllcjogJ2Fkdmlzb3J5JywgLy8gRGVmYXVsdCwgd2lsbCBiZSB1cGRhdGVkIGJlbG93XG4gICAgICB9O1xuXG4gICAgICAvLyA4LiBDcmVhdGUgYW5kIHBlcnNpc3QgdGhlIGdvYWwgZm9yIExMTSB0cmFja2luZ1xuICAgICAgLy8gVGhpcyBhbGxvd3MgcmVjb3JkX2FnZW50X3N0ZXAgdG8gZmluZCBhbmQgdXBkYXRlIHRoZSBnb2FsXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZ29hbCB1c2luZyBhZ2VudC5hZGRHb2FsKCkgd2hpY2ggaGFuZGxlcyB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb25cbiAgICAgIGNvbnN0IG5ld0dvYWwgPSBhZ2VudC5hZGRHb2FsKHtcbiAgICAgICAgZGVzY3JpcHRpb246IHJlbmRlcmVkR29hbCxcbiAgICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgICBpbXBvcnRhbmNlOiA1LFxuICAgICAgICB1cmdlbmN5OiA1LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBnb2FsIHN0YXR1cyB0byBpbl9wcm9ncmVzcyBzaW5jZSBleGVjdXRpb24gaGFzIHN0YXJ0ZWRcbiAgICAgIG5ld0dvYWwuc3RhdHVzID0gJ2luX3Byb2dyZXNzJztcblxuICAgICAgY29uc3QgZXhlY1Nhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoZXhlY1Nhbml0aXplZE5hbWUpKTtcblxuICAgICAgLy8gU3RvcmUgZ29hbElkIGluIHJlc3VsdCBmb3IgTExNIHRvIHVzZSB3aXRoIHJlY29yZF9hZ2VudF9zdGVwXG4gICAgICByZXN1bHQuZ29hbElkID0gbmV3R29hbC5pZDtcblxuICAgICAgLy8gRml4ICM0NDU6IEluY2x1ZGUgc3RhdGVWZXJzaW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIGRvIHZlcnNpb24tYXdhcmUgb3BlcmF0aW9uc1xuICAgICAgY29uc3QgcG9zdFNhdmVTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgICByZXN1bHQuc3RhdGVWZXJzaW9uID0gcG9zdFNhdmVTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMTtcblxuICAgICAgLy8gQ2FsbCB2YWxpZGF0ZUdvYWxTZWN1cml0eSBhbmQgYWRkIHdhcm5pbmdzIHRvIHJlc3VsdFxuICAgICAgY29uc3Qgc2VjdXJpdHlWYWxpZGF0aW9uID0gYWdlbnQudmFsaWRhdGVHb2FsU2VjdXJpdHkocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmIChzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MgJiYgc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LnNlY3VyaXR5V2FybmluZ3MgPSBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgZXZhbHVhdGVDb25zdHJhaW50cyBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LmNvbnN0cmFpbnRzID0gYWdlbnQuZXZhbHVhdGVDb25zdHJhaW50cyhuZXdHb2FsKTtcblxuICAgICAgLy8gQ2FsbCBhc3Nlc3NSaXNrIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQgPSBhZ2VudC5hc3Nlc3NSaXNrKCdleGVjdXRlJywgbmV3R29hbCwge30pO1xuXG4gICAgICAvLyBDYWxsIGNhbGN1bGF0ZVByaW9yaXR5U2NvcmUgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5wcmlvcml0eVNjb3JlID0gYWdlbnQuY2FsY3VsYXRlUHJpb3JpdHlTY29yZShuZXdHb2FsKTtcblxuICAgICAgLy8gOS4gRGV0ZXJtaW5lIHNhZmV0eSB0aWVyIGJhc2VkIG9uIHJpc2sgYXNzZXNzbWVudCBhbmQgc2VjdXJpdHkgd2FybmluZ3NcbiAgICAgIC8vIChOb3RlOiBleGVjdXRpb25Db250ZXh0IGFscmVhZHkgY3JlYXRlZCBlYXJsaWVyIGZvciBjaXJjdWxhciBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBzYWZldHlUaWVyUmVzdWx0ID0gZGV0ZXJtaW5lU2FmZXR5VGllcihcbiAgICAgICAgcmVzdWx0LnJpc2tBc3Nlc3NtZW50Py5zY29yZSB8fCAwLFxuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyB8fCBbXSxcbiAgICAgICAgcmVuZGVyZWRHb2FsLFxuICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHRcbiAgICAgICk7XG5cbiAgICAgIC8vIDEwLiBTZXQgc2FmZXR5IHRpZXIgYW5kIHJlbGF0ZWQgZmllbGRzXG4gICAgICByZXN1bHQuc2FmZXR5VGllciA9IHNhZmV0eVRpZXJSZXN1bHQudGllcjtcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyUmVzdWx0ID0gc2FmZXR5VGllclJlc3VsdDtcbiAgICAgIHJlc3VsdC5leGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgLy8gMTEuIEFkZCB0aWVyLXNwZWNpZmljIHJlc3BvbnNlc1xuICAgICAgc3dpdGNoIChzYWZldHlUaWVyUmVzdWx0LnRpZXIpIHtcbiAgICAgICAgY2FzZSAnY29uZmlybSc6XG4gICAgICAgICAgcmVzdWx0LmNvbmZpcm1hdGlvblJlcXVpcmVkID0gY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdChcbiAgICAgICAgICAgICdPcGVyYXRpb24gcmVxdWlyZXMgY29uZmlybWF0aW9uJyxcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAndmVyaWZ5JzpcbiAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UoXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgICdkaXNwbGF5X2NvZGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkYW5nZXJfem9uZSc6XG4gICAgICAgICAgcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkID0gY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbihcbiAgICAgICAgICAgICdhZ2VudF9leGVjdXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzLmpvaW4oJzsgJyksXG4gICAgICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcuZGFuZ2VyWm9uZS5lbmFibGVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBbHNvIGFkZCB2ZXJpZmljYXRpb24gaWYgbm90IGJsb2NrZWRcbiAgICAgICAgICBpZiAoIXJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC5ibG9ja2VkKSB7XG4gICAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQudmVyaWZpY2F0aW9uUmVxdWlyZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fkdmlzb3J5JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIGFjdGlvbiBuZWVkZWQgZm9yIGFkdmlzb3J5IHRpZXJcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfRVhFQ1VURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5leGVjdXRlQWdlbnQnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgZXhlY3V0ZWQ6ICR7bmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9IChzYWZldHk6ICR7c2FmZXR5VGllclJlc3VsdC50aWVyfSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgIHNhZmV0eVRpZXI6IHNhZmV0eVRpZXJSZXN1bHQudGllcixcbiAgICAgICAgICByaXNrU2NvcmU6IHNhZmV0eVRpZXJSZXN1bHQucmlza1Njb3JlLFxuICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMgfHwge30pLFxuICAgICAgICAgIGdvYWxDb3VudDogKG1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGFnZW50ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lbmRFeGVjdXRpb25BdHRlbXB0KG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBIb2xkIGEgYm91bmRlZCBvYnNlcnZhdGlvbiBsZWFzZSB3aGlsZSBzdGFsZS1wb2xpY3kgcmVjb3ZlcnkgaXMgaW4gZmxpZ2h0LiAqL1xuICBvYnNlcnZlRXhlY3V0aW9uR2VuZXJhdGlvbihuYW1lOiBzdHJpbmcpOiBFeGVjdXRpb25HZW5lcmF0aW9uT2JzZXJ2YXRpb24ge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXkpO1xuICAgIGVudHJ5Lm9ic2VydmVycyArPSAxO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBlbnRyeS50b2tlbixcbiAgICAgIHJlbGVhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKHJlbGVhc2VkKSByZXR1cm47XG4gICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgZW50cnkub2JzZXJ2ZXJzIC09IDE7XG4gICAgICAgIHRoaXMuY2xlYW51cEV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5LCBlbnRyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBoYXNFeGVjdXRpb25HZW5lcmF0aW9uQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9ic2VydmVkVG9rZW46IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5nZXQobm9ybWFsaXplQWdlbnRFeGVjdXRpb25JZGVudGl0eShuYW1lKSk7XG4gICAgcmV0dXJuICFlbnRyeSB8fCBlbnRyeS5hY3RpdmVFeGVjdXRpb25zID4gMCB8fCBlbnRyeS50b2tlbiAhPT0gb2JzZXJ2ZWRUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5FeGVjdXRpb25BdHRlbXB0KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXkpO1xuICAgIGVudHJ5LnRva2VuID0ge307XG4gICAgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyArPSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRFeGVjdXRpb25BdHRlbXB0KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmV4ZWN1dGlvbkdlbmVyYXRpb25zLmdldChrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICBlbnRyeS5hY3RpdmVFeGVjdXRpb25zID0gTWF0aC5tYXgoMCwgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyAtIDEpO1xuICAgIHRoaXMuY2xlYW51cEV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5LCBlbnRyeSk7XG4gIH1cblxuICBwcml2YXRlIGdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXk6IHN0cmluZyk6IEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeSB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5nZXQoa2V5KTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IHsgdG9rZW46IHt9LCBhY3RpdmVFeGVjdXRpb25zOiAwLCBvYnNlcnZlcnM6IDAgfTtcbiAgICAgIHRoaXMuZXhlY3V0aW9uR2VuZXJhdGlvbnMuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBFeGVjdXRpb25HZW5lcmF0aW9uKGtleTogc3RyaW5nLCBlbnRyeTogRXhlY3V0aW9uR2VuZXJhdGlvbkVudHJ5KTogdm9pZCB7XG4gICAgaWYgKGVudHJ5LmFjdGl2ZUV4ZWN1dGlvbnMgPT09IDAgJiYgZW50cnkub2JzZXJ2ZXJzID09PSAwKSB7XG4gICAgICB0aGlzLmV4ZWN1dGlvbkdlbmVyYXRpb25zLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfSA9IHt9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtRGVmcyA9IGdvYWxDb25maWcucGFyYW1ldGVycyB8fCBbXTtcbiAgICBjb25zdCByZXF1aXJlZFBhcmFtTmFtZXMgPSBwYXJhbURlZnNcbiAgICAgIC5maWx0ZXIocGFyYW1EZWYgPT4gcGFyYW1EZWYucmVxdWlyZWQpXG4gICAgICAubWFwKHBhcmFtRGVmID0+IHBhcmFtRGVmLm5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcbiAgICBjb25zdCBtaXNzaW5nUmVxdWlyZWQgPSByZXF1aXJlZFBhcmFtTmFtZXMuZmlsdGVyKHBhcmFtTmFtZSA9PiAhKHBhcmFtTmFtZSBpbiBwYXJhbWV0ZXJzKSk7XG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHRoaXMuZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgICAgICAgIG1pc3NpbmdSZXF1aXJlZCxcbiAgICAgICAgICByZXF1aXJlZFBhcmFtTmFtZXMsXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFR5cGUgY2hlY2sgcHJvdmlkZWQgcGFyYW1ldGVyc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICBjb25zdCBwYXJhbURlZiA9IHBhcmFtRGVmcy5maW5kKHAgPT4gcC5uYW1lID09PSBrZXkpO1xuICAgICAgaWYgKCFwYXJhbURlZikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBwYXJhbWV0ZXIgJyR7a2V5fScgcHJvdmlkZWQgdG8gYWdlbnRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgdmFsaWRhdGlvblxuICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnc3RyaW5nJyAmJiBhY3R1YWxUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnbnVtYmVyJyAmJiBhY3R1YWxUeXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgbnVtYmVyLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnYm9vbGVhbicgJiYgYWN0dWFsVHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWR2aXNvcnkgbGVuZ3RoIHdhcm5pbmcgZm9yIHN0cmluZyB2YWx1ZXMgKGRlZmVuc2UtaW4tZGVwdGgsIGRvZXMgbm90IHRocm93KVxuICAgICAgaWYgKGFjdHVhbFR5cGUgPT09ICdzdHJpbmcnICYmICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1BhcmFtZXRlciBzdHJpbmcgdmFsdWUgZXhjZWVkcyBNQVhfR09BTF9MRU5HVEggKGFkdmlzb3J5KScsIHtcbiAgICAgICAgICBwYXJhbU5hbWU6IGtleSxcbiAgICAgICAgICB2YWx1ZUxlbmd0aDogKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcnMgbm90IHByb3ZpZGVkXG4gICAgZm9yIChjb25zdCBwYXJhbURlZiBvZiBwYXJhbURlZnMpIHtcbiAgICAgIGlmICghcGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpICYmIHBhcmFtRGVmLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtRGVmLm5hbWVdID0gcGFyYW1EZWYuZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gYWN0aW9uYWJsZSBtaXNzaW5nLXBhcmFtZXRlciBlcnJvciBmb3IgZXhlY3V0ZS9jb250aW51ZSBjYWxscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgIG1pc3NpbmdSZXF1aXJlZDogc3RyaW5nW10sXG4gICAgcmVxdWlyZWRQYXJhbU5hbWVzOiBzdHJpbmdbXSxcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50U3VmZml4ID0gY29udGV4dC5hZ2VudE5hbWUgPyBgIGZvciBhZ2VudCAnJHtjb250ZXh0LmFnZW50TmFtZX0nYCA6ICcnO1xuICAgIGxldCBtZXNzYWdlID1cbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMke2FnZW50U3VmZml4fTogJHttaXNzaW5nUmVxdWlyZWQuam9pbignLCAnKX0uYDtcblxuICAgIGlmIChyZXF1aXJlZFBhcmFtTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWVzc2FnZSArPSBgIFJlcXVpcmVkIGdvYWwgcGFyYW1ldGVyczogJHtyZXF1aXJlZFBhcmFtTmFtZXMuam9pbignLCAnKX0uYDtcbiAgICB9XG5cbiAgICBtZXNzYWdlICs9ICcgRGlzY292ZXIgdGhlIGZ1bGwgZXhlY3V0aW9uIGNvbnRyYWN0IHZpYSBtY3BfYXFsX3JlYWQgaW50cm9zcGVjdDogJyArXG4gICAgICAneyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH0uJztcblxuICAgIGlmIChjb250ZXh0Lm9wZXJhdGlvbk5hbWUgPT09ICdjb250aW51ZV9leGVjdXRpb24nKSB7XG4gICAgICBtZXNzYWdlICs9ICcgSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgYWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdXNlICcgK1xuICAgICAgICAnbWNwX2FxbF9jcmVhdGUgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGluc3RlYWQuIGNvbnRpbnVlX2V4ZWN1dGlvbiBpcyBvbmx5ICcgK1xuICAgICAgICAnZm9yIHJlc3VtaW5nIGEgcHJldmlvdXNseSBwYXVzZWQgZXhlY3V0aW9uIGFuZCBzdGlsbCByZXF1aXJlcyB0aGUgc2FtZSAnICtcbiAgICAgICAgJ2dvYWwgcGFyYW1ldGVycyBhcyBleGVjdXRlX2FnZW50Lic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGdvYWwgdGVtcGxhdGUgYnkgcmVwbGFjaW5nIHtwYXJhbWV0ZXJ9IHBsYWNlaG9sZGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJHb2FsVGVtcGxhdGUoXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBzdHJpbmcge1xuICAgIGxldCByZW5kZXJlZCA9IHRlbXBsYXRlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICAvLyBFc2NhcGUga2V5IHRvIHByZXZlbnQgcmVnZXggbWV0YWNoYXJhY3RlcnMgZnJvbSBjYXVzaW5nIFJlRG9TIChJc3N1ZSAjMTAzKVxuICAgICAgY29uc3QgZXNjYXBlZEtleSA9IFNhZmVSZWdleC5lc2NhcGUoa2V5KTtcbiAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxceyR7ZXNjYXBlZEtleX1cXFxcfWAsICdnJyksIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIENhcCByZW5kZXJlZCBnb2FsIGxlbmd0aCB0byBwcmV2ZW50IG92ZXJzaXplZCBwYXlsb2Fkc1xuICAgIGlmIChyZW5kZXJlZC5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKSB7XG4gICAgICBsb2dnZXIud2FybignUmVuZGVyZWQgZ29hbCBleGNlZWRzIE1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCwgdHJ1bmNhdGluZycsIHtcbiAgICAgICAgcmVuZGVyZWRMZW5ndGg6IHJlbmRlcmVkLmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RILFxuICAgICAgfSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnN1YnN0cmluZygwLCBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHVubWF0Y2hlZCB7cGxhY2Vob2xkZXJ9IHBhdHRlcm5zIHJlbWFpbmluZyBhZnRlciB0ZW1wbGF0ZSByZW5kZXJpbmcuXG4gICAqIFJldHVybnMgYXJyYXkgb2YgcGxhY2Vob2xkZXIgbmFtZXMgZm91bmQgaW4gdGhlIHJlbmRlcmVkIHN0cmluZy5cbiAgICogSXNzdWUgIzEyNjogV2FybiB3aGVuIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVubWF0Y2hlZFBsYWNlaG9sZGVycyhyZW5kZXJlZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUGF0dGVybiA9IC9cXHsoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXH0vZztcbiAgICBjb25zdCB1bm1hdGNoZWQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBwbGFjZWhvbGRlclBhdHRlcm4uZXhlYyhyZW5kZXJlZCkpICE9PSBudWxsKSB7XG4gICAgICB1bm1hdGNoZWQucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB1bm1hdGNoZWQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZSBmb3IgY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24uXG4gICAqIFVzZWQgYnkgYm90aCB0aGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgYW5kIHRoZSBydW50aW1lIGNoYWluIGNoZWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgYWdlbnROYW1lID0gY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gKFxuICAgICAgYENpcmN1bGFyIGFnZW50IGFjdGl2YXRpb24gZGV0ZWN0ZWQgKGN5Y2xlIG9mICR7Y3ljbGVQYXRoLmxlbmd0aCAtIDF9KTogYCArXG4gICAgICBgJHtjeWNsZVBhdGguam9pbignIOKGkiAnKX0uIGAgK1xuICAgICAgYEFnZW50ICcke2FnZW50TmFtZX0nIGNhbm5vdCBhY3RpdmF0ZSBpdHNlbGYgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTYWZldHkgbGltaXRzIGZvciBhY3RpdmF0aW9uIGdyYXBoIHRyYXZlcnNhbCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQUNUSVZBVElPTl9ERVBUSCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTk9ERVNfVklTSVRFRCA9IDEwMDtcblxuICAvKipcbiAgICogU3RhdGljIGFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIOKAlCBMYXllciAxIG9mIGR1YWwtZGV0ZWN0aW9uIHN0cmF0ZWd5IChJc3N1ZSAjMzc0KVxuICAgKlxuICAgKiBQZXJmb3JtcyBhc3luYyBERlMgb24gdGhlIGFjdGl2YXRpb24gZ3JhcGggdG8gZGV0ZWN0IGN5Y2xlcyBCRUZPUkUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICogVGhpcyBpcyBhIHByZS1mbGlnaHQgY2hlY2sgdGhhdCBwcmV2ZW50cyBjaXJjdWxhciBhY3RpdmF0aW9uIGNoYWlucyBmcm9tIGJlaW5nIGF0dGVtcHRlZC5cbiAgICpcbiAgICogTGF5ZXIgMSAodGhpcyBtZXRob2QpOiBTdGF0aWMgZ3JhcGggYW5hbHlzaXMg4oCUIHdhbGtzIHRoZSBhY3RpdmF0aW9uIGdyYXBoIGZyb20gdGhlIHJvb3RcbiAgICogYWdlbnQsIGxvYWRpbmcgZWFjaCBhZ2VudCdzIGBhY3RpdmF0ZXMuYWdlbnRzYCBtZXRhZGF0YS4gQ2F0Y2hlcyBhbGwgY3ljbGVzIHJlYWNoYWJsZVxuICAgKiBmcm9tIHRoZSByb290IHdpdGhvdXQgZXhlY3V0aW5nIGFueSBhZ2VudHMuIEJvdW5kZWQgYnkgTUFYX0FDVElWQVRJT05fREVQVEggYW5kXG4gICAqIE1BWF9OT0RFU19WSVNJVEVEIHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvbiBmcm9tIGxhcmdlIGFjeWNsaWMgZ3JhcGhzLlxuICAgKlxuICAgKiBMYXllciAyIChnZXRFbGVtZW50Q29udGVudCBydW50aW1lIGNoZWNrKTogRGVmZW5zZS1pbi1kZXB0aCDigJQgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlc1xuICAgKiBsaWtlIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICogY2hlY2sgYW5kIGFjdHVhbCBleGVjdXRpb24uIFNlZSBnZXRFbGVtZW50Q29udGVudCBmb3IgZGV0YWlscy5cbiAgICpcbiAgICogQHBhcmFtIHJvb3ROYW1lIC0gVGhlIHJvb3QgYWdlbnQgbmFtZSBpbml0aWF0aW5nIHRoZSBhY3RpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBhY3RpdmF0ZWRBZ2VudHMgLSBUaGUgaW1tZWRpYXRlIGFnZW50cyBhY3RpdmF0ZWQgYnkgdGhlIHJvb3RcbiAgICogQHJldHVybnMgVGhlIGN5Y2xlIHBhdGggYXJyYXkgaWYgYSBjeWNsZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEFjdGl2YXRpb25DeWNsZXMoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICBhY3RpdmF0ZWRBZ2VudHM6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgLy8gQ2FjaGUgbG9hZGVkIGFnZW50cyB0byBhdm9pZCByZWR1bmRhbnQgSS9PIGR1cmluZyBERlNcbiAgICBjb25zdCBhZ2VudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdIHwgbnVsbD4oKTtcblxuICAgIC8vIEhlbHBlcjogbG9hZCBhbiBhZ2VudCdzIGFjdGl2YXRlcy5hZ2VudHMgbGlzdCAoY2FjaGVkKVxuICAgIGNvbnN0IGdldEFjdGl2YXRlZEFnZW50cyA9IGFzeW5jIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhZ2VudENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIGFnZW50Q2FjaGUuZ2V0KGNhY2hlS2V5KSB8fCBbXTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyByZWZlcmVuY2VkIGluIGFjdGl2YXRlcy5hZ2VudHMgY291bGQgbm90IGJlIHJlc29sdmVkIGR1cmluZyBjeWNsZSBkZXRlY3Rpb25gKTtcbiAgICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgIGNvbnN0IGFnZW50cyA9IG1ldGEuYWN0aXZhdGVzPy5hZ2VudHMgfHwgW107XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBhZ2VudHMpO1xuICAgICAgICByZXR1cm4gYWdlbnRzO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBUcmFja3Mgbm9kZXMgd2hvc2UgZW50aXJlIHN1YnRyZWUgaGFzIGJlZW4gZXhwbG9yZWQgd2l0aG91dCBmaW5kaW5nIGEgY3ljbGUuXG4gICAgLy8gUHJldmVudHMgZXhwb25lbnRpYWwgcmUtZXhwbG9yYXRpb24gaW4gZGlhbW9uZC9jb252ZXJnZW50IGdyYXBocy5cbiAgICBjb25zdCBmdWxseUV4cGxvcmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IG5vZGVzVmlzaXRlZCA9IDA7XG5cbiAgICAvLyBERlMg4oCUIHN0YWNrIGVudHJpZXM6IFtjdXJyZW50QWdlbnQsIHBhdGhTb0ZhciwgcGF0aFNldExvd2VyXVxuICAgIC8vIHBhdGhTZXRMb3dlciBpcyBhIFNldDxzdHJpbmc+IG9mIGxvd2VyY2FzZWQgbmFtZXMgZm9yIE8oMSkgY3ljbGUgY2hlY2tzXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFtzdHJpbmcsIHN0cmluZ1tdLCBTZXQ8c3RyaW5nPl0+ID0gW107XG5cbiAgICBjb25zdCByb290TG93ZXIgPSByb290TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgYWN0aXZhdGVkQWdlbnRzKSB7XG4gICAgICAvLyBTZWxmLWxvb3A6IGFnZW50IGRpcmVjdGx5IGFjdGl2YXRlcyBpdHNlbGZcbiAgICAgIGlmIChjaGlsZC50b0xvd2VyQ2FzZSgpID09PSByb290TG93ZXIpIHtcbiAgICAgICAgcmV0dXJuIFtyb290TmFtZSwgY2hpbGRdO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aFNldCA9IG5ldyBTZXQ8c3RyaW5nPihbcm9vdExvd2VyLCBjaGlsZC50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICBzdGFjay5wdXNoKFtjaGlsZCwgW3Jvb3ROYW1lLCBjaGlsZF0sIHBhdGhTZXRdKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW2N1cnJlbnQsIGN1cnJlbnRQYXRoLCBwYXRoU2V0XSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgbm9kZXNWaXNpdGVkKys7XG4gICAgICBpZiAobm9kZXNWaXNpdGVkID4gQWdlbnRNYW5hZ2VyLk1BWF9OT0RFU19WSVNJVEVEKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBhYm9ydGVkOiBleGNlZWRlZCAke0FnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRH0gbm9kZXMgdmlzaXRlZC4gYCArXG4gICAgICAgICAgYFRoZSBhY3RpdmF0aW9uIGdyYXBoIG1heSBiZSB0b28gbGFyZ2UuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA+IEFnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSCArIDEpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIGZvciAnJHtyb290TmFtZX0nIGhpdCBkZXB0aCBsaW1pdCBvZiAke0FnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSH0uIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBkZWVwZXIgYnJhbmNoZXMuYFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudExvd2VyID0gY3VycmVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZ1bGx5RXhwbG9yZWQuaGFzKGN1cnJlbnRMb3dlcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhpcyBhZ2VudCdzIGFjdGl2YXRpb25zXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IGdldEFjdGl2YXRlZEFnZW50cyhjdXJyZW50KTtcblxuICAgICAgbGV0IGZvdW5kQ3ljbGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgY2hpbGRMb3dlciA9IGNoaWxkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xlOiBkb2VzIHRoaXMgY2hpbGQgYXBwZWFyIGVhcmxpZXIgaW4gdGhlIHBhdGg/XG4gICAgICAgIGlmIChwYXRoU2V0LmhhcyhjaGlsZExvd2VyKSkge1xuICAgICAgICAgIHJldHVybiBbLi4uY3VycmVudFBhdGgsIGNoaWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZnVsbHlFeHBsb3JlZC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICBjb25zdCBuZXdQYXRoU2V0ID0gbmV3IFNldChwYXRoU2V0KTtcbiAgICAgICAgICBuZXdQYXRoU2V0LmFkZChjaGlsZExvd2VyKTtcbiAgICAgICAgICBzdGFjay5wdXNoKFtjaGlsZCwgWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF0sIG5ld1BhdGhTZXRdKTtcbiAgICAgICAgICBmb3VuZEN5Y2xlID0gdHJ1ZTsgLy8gaGFzIGNoaWxkcmVuIHRvIGV4cGxvcmUsIG5vdCBmdWxseSBleHBsb3JlZCB5ZXRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyB1bmV4cGxvcmVkIGNoaWxkcmVuLCB0aGlzIG5vZGUncyBzdWJ0cmVlIGlzIGN5Y2xlLWZyZWVcbiAgICAgIGlmICghZm91bmRDeWNsZSkge1xuICAgICAgICBmdWxseUV4cGxvcmVkLmFkZChjdXJyZW50TG93ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250ZW50IGZyb20gYW4gZWxlbWVudCAoZWxlbWVudC1hZ25vc3RpYylcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RWxlbWVudENvbnRlbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBFeGVjdXRpb25Db250ZXh0XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gR2V0IHRoZSBzdGF0aWMgcmVzb2x2ZXJcbiAgICBjb25zdCByZXNvbHZlciA9IEFnZW50TWFuYWdlci5nZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk7XG4gICAgaWYgKCFyZXNvbHZlcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCAtIGNhbm5vdCBhY3RpdmF0ZSAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfWApO1xuICAgICAgcmV0dXJuIGBbRWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkIGZvciAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfV1gO1xuICAgIH1cblxuICAgIC8vIExheWVyIDIgKGRlZmVuc2UtaW4tZGVwdGgpOiBSdW50aW1lIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uIChJc3N1ZSAjMTA5KVxuICAgIC8vIFRoZSBzdGF0aWMgcHJlLWZsaWdodCBjaGVjayAoZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcywgbGF5ZXIgMSkgY2F0Y2hlcyBtb3N0IGN5Y2xlc1xuICAgIC8vIGJlZm9yZSBleGVjdXRpb24gYmVnaW5zLiBUaGlzIHJ1bnRpbWUgY2hlY2sgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlcyBzdWNoIGFzXG4gICAgLy8gZHluYW1pY2FsbHktY29uc3RydWN0ZWQgYWN0aXZhdGlvbiBjaGFpbnMgb3IgYWdlbnRzIG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0YXRpY1xuICAgIC8vIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBVc2VzIGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiB3aGljaCB0cmFja3MgdGhlXG4gICAgLy8gY3VycmVudCBleGVjdXRpb24gcGF0aCDigJQgZWZmZWN0aXZlIGZvciBkaXJlY3QgYW5kIG11bHRpLWhvcCBjaGFpbnMgd2l0aGluIGFcbiAgICAvLyBzaW5nbGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSAnYWdlbnRzJyAmJiBleGVjdXRpb25Db250ZXh0Py5hZ2VudENoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblNldCA9IG5ldyBTZXQoZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLm1hcChuYW1lID0+IG5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoY2hhaW5TZXQuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBbLi4uZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLCBlbGVtZW50TmFtZV07XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihBZ2VudE1hbmFnZXIuZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcCBwbHVyYWwgZWxlbWVudCB0eXBlcyB0byBtYW5hZ2VyIG5hbWVzXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgcGVyc29uYXM6ICdQZXJzb25hTWFuYWdlcicsXG4gICAgICAgIHNraWxsczogJ1NraWxsTWFuYWdlcicsXG4gICAgICAgIG1lbW9yaWVzOiAnTWVtb3J5TWFuYWdlcicsXG4gICAgICAgIHRlbXBsYXRlczogJ1RlbXBsYXRlTWFuYWdlcicsXG4gICAgICAgIGVuc2VtYmxlczogJ0Vuc2VtYmxlTWFuYWdlcicsXG4gICAgICAgIGFnZW50czogJ0FnZW50TWFuYWdlcidcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmFnZXJOYW1lID0gbWFuYWdlck5hbWVNYXBbZWxlbWVudFR5cGVdO1xuICAgICAgaWYgKCFtYW5hZ2VyTmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIHJldHVybiBgW1Vua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW5hZ2VyID0gcmVzb2x2ZXIobWFuYWdlck5hbWUpO1xuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBNYW5hZ2VyIG5vdCBmb3VuZCBmb3IgZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtNYW5hZ2VyIG5vdCBmb3VuZDogJHttYW5hZ2VyTmFtZX1dYDtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGFsbCBlbGVtZW50cyBvZiB0aGlzIHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG4gICAgICAvLyBJc3N1ZSAjMjQzMjogYWN0aXZhdGVzOiByZWZlcmVuY2VzIHVzZSBjYW5vbmljYWwgZmlsZW5hbWUgc2x1Z3MgKGUuZy5cbiAgICAgIC8vICdzZWN1cml0eS1hbmFseXN0JywgJ2J1Zy1yZXBvcnQnKSB3aGlsZSBlbGVtZW50IG1ldGFkYXRhIGNhcnJpZXMgZGlzcGxheVxuICAgICAgLy8gbmFtZXMgKCdTZWN1cml0eSBBbmFseXN0JywgJ0J1Z1JlcG9ydCcpLiBFeGFjdC1uYW1lIG1hdGNoZXMgd2luIGFjcm9zcyB0aGVcbiAgICAgIC8vIGZ1bGwgbGlzdDsgb3RoZXJ3aXNlIGJvdGggc2lkZXMgbWFwIHRocm91Z2ggdGhlIHNhbWUgc2x1ZyBkZXJpdmF0aW9uXG4gICAgICAvLyBnZXRFbGVtZW50RmlsZW5hbWUoKSB1c2VzIHdoZW4gc2F2aW5nIOKAlCBub3JtYWxpemVGaWxlbmFtZSB3aXRoIGl0c1xuICAgICAgLy8gZW1wdHktcmVzdWx0ICd1bm5hbWVkJyBmYWxsYmFjayDigJQgc28gYSByZWZlcmVuY2UgcmVzb2x2ZXMgZXhhY3RseSB3aGVuIGl0XG4gICAgICAvLyBtYXRjaGVzIHRoZSBlbGVtZW50J3Mgb24tZGlzayBmaWxlbmFtZSAoaW5jbHVkaW5nIGNhbWVsQ2FzZSBzcGxpdHMgYW5kXG4gICAgICAvLyBzZXBhcmF0b3Itb25seSBuYW1lcyBsaWtlICctLS0nIHRoYXQgc2F2ZSBhcyB1bm5hbWVkLm1kKS5cbiAgICAgIGNvbnN0IGNhbm9uaWNhbFNsdWcgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgICAgLy8gVGhlICd1bm5hbWVkJyBmYWxsYmFjayBhcHBsaWVzIG9ubHkgdG8gY2FuZGlkYXRlIGVsZW1lbnRzIChtaXJyb3JpbmcgaG93XG4gICAgICAvLyB0aGV5IHdlcmUgc2F2ZWQpLiBBIHJlZmVyZW5jZSB0aGF0IGlzIGVtcHR5IG9yIG5vcm1hbGl6ZXMgdG8gbm90aGluZ1xuICAgICAgLy8gKCcnLCAnICAgJywgJy0tLScpIGNhbiBuZXZlciBuYW1lIGEgc2F2ZWQgZmlsZSDigJQgdmFsaWRhdGVBY3RpdmF0ZXMoKSBvbmx5XG4gICAgICAvLyB3YXJucyBvbiBzdWNoIGVudHJpZXMsIHNvIGV4Y2x1ZGUgdGhlbSBoZXJlIG9yIHRoZXkgd291bGQgcmlkZSB0aGVcbiAgICAgIC8vIGZhbGxiYWNrIG9udG8gYXJiaXRyYXJ5IHNlcGFyYXRvci1vbmx5LW5hbWVkIGVsZW1lbnRzLlxuICAgICAgY29uc3QgdHJpbW1lZFJlZmVyZW5jZSA9IGVsZW1lbnROYW1lLnRyaW0oKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSB0cmltbWVkUmVmZXJlbmNlID8gdGhpcy5ub3JtYWxpemVGaWxlbmFtZSh0cmltbWVkUmVmZXJlbmNlKSA6ICcnO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSkgPz9cbiAgICAgICAgKG5vcm1hbGl6ZWRUYXJnZXRcbiAgICAgICAgICA/IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT5cbiAgICAgICAgICAgICAgdHlwZW9mIGUubWV0YWRhdGEubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgY2Fub25pY2FsU2x1ZyhlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkVGFyZ2V0XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gYXBwcm9wcmlhdGUgY29udGVudCBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5pbnN0cnVjdGlvbnMgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnbWVtb3JpZXMnOiB7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGVsZW1lbnQuZ2V0RW50cmllcygpO1xuICAgICAgICAgIHJldHVybiBgTWVtb3J5ICcke2VsZW1lbnROYW1lfScgd2l0aCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdlbnNlbWJsZXMnOiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudExpc3QgPSBPYmplY3QuZW50cmllcyhlbGVtZW50LmVsZW1lbnRzIHx8IHt9KVxuICAgICAgICAgICAgLm1hcCgoW3R5cGUsIG5hbWVzXSkgPT4gYCR7dHlwZX06ICR7QXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcy5qb2luKCcsICcpIDogU3RyaW5nKG5hbWVzKX1gKVxuICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgcmV0dXJuIGBFbnNlbWJsZSAnJHtlbGVtZW50TmFtZX0nIGFjdGl2YXRlczogJHtlbGVtZW50TGlzdH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYWdlbnRzJzoge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGVsZW1lbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBgW0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3IgJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBnZXR0aW5nIGNvbnRlbnQgZm9yICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdhZ2VudHMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBhZ2VudHMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGFnZW50cyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0FHRU5UUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke3RoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplfS8ke21heH0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhY3RpdmVDb3VudDogdGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUsXG4gICAgICAgICAgbWF4QWxsb3dlZDogbWF4LFxuICAgICAgICAgIGFjdGl2ZUFnZW50TmFtZXM6IEFycmF5LmZyb20odGhpcy5hY3RpdmVBZ2VudE5hbWVzKSxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgYWdlbnRzIHNldFxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudE5hbWVzID0gbmV3IFNldChhZ2VudHMubWFwKGEgPT4gYS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVBZ2VudE5hbWVzKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdBZ2VudE5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgYWdlbnQgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIGFnZW50czogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdhZ2VudHMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBhZ2VudHM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICBkZXRhaWxzOiBgQ2xlYW51cCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFuIGFnZW50IHN0YXRlIGZpbGUgKFlBTUwpLlxuICAgKlxuICAgKiBJTVBST1ZFTUVOVDogT3B0aW1pc3RpYyBsb2NraW5nIHdpdGggdmVyc2lvbiBjaGVja2luZyAoSXNzdWUgIzI0KVxuICAgKiBQcmV2ZW50cyBzdGF0ZSBjb3JydXB0aW9uIGZyb20gY29uY3VycmVudCB1cGRhdGVzIGJ5IGNvbXBhcmluZyB2ZXJzaW9uc1xuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIG5hbWluZ1xuICAgKiBUaGlzIGVuc3VyZXMgc3RhdGUgZmlsZXMgdXNlIGtlYmFiLWNhc2UgKGUuZy4sIFwiY3J1ZHYtYWdlbnQtZGVsdGEuc3RhdGUueWFtbFwiKVxuICAgKiByZWdhcmRsZXNzIG9mIGlucHV0IG5hbWUgZm9ybWF0IChlLmcuLCBcIkNSVURWLUFnZW50LURlbHRhXCIpXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IFdyYXAgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIGluIGZpbGUgbG9ja1xuICAgKiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbiBmcm9tIGNvbmN1cnJlbnQgYWdlbnQgZXhlY3V0aW9uc1xuICAgKlxuICAgKiBGSVggKElzc3VlICMxMjMpOiBWZXJzaW9uIGluY3JlbWVudHMgb24gc3VjY2Vzc2Z1bCBzYXZlLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5ldyBzdGF0ZSB2ZXJzaW9uIGFmdGVyIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgKiBAcHJvdGVjdGVkIE9ubHkgYWNjZXNzaWJsZSBieSBzdWJjbGFzc2VzIChlLmcuLCBUZXN0YWJsZUFnZW50TWFuYWdlciBmb3IgdGVzdGluZylcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlQWdlbnRTdGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGU6IEFnZW50U3RhdGUsXG4gICAgc3RyaWN0RXhpc3RpbmdTdGF0ZUVycm9ycyA9IGZhbHNlLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChzdHJpY3RFeGlzdGluZ1N0YXRlRXJyb3JzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydFN0YXRlRGlyZWN0b3J5QXZhaWxhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcbiAgICB9XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5KG5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG5cbiAgICAvLyBGSVggKElzc3VlICMxMDcgLSBDUklULTIpOiBBY3F1aXJlIGZpbGUgbG9jayB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvblxuICAgIC8vIFRoZSBsb2NrIGNvdmVycyB0aGUgZW50aXJlIHJlYWQtY29tcGFyZS13cml0ZSBzZXF1ZW5jZSB0byBlbnN1cmUgYXRvbWljaXR5XG4gICAgYXdhaXQgdGhpcy5maWxlTG9ja01hbmFnZXIud2l0aExvY2soYGFnZW50LXN0YXRlOiR7bm9ybWFsaXplZE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gRklYOiBPcHRpbWlzdGljIGxvY2tpbmcgY2hlY2sgKElzc3VlICMyNClcbiAgICAgIC8vIExvYWQgZXhpc3Rpbmcgc3RhdGUgdG8gY29tcGFyZSB2ZXJzaW9ucyBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUsIHN0cmljdEV4aXN0aW5nU3RhdGVFcnJvcnMpO1xuICAgICAgaWYgKHN0cmljdEV4aXN0aW5nU3RhdGVFcnJvcnMgJiYgIWV4aXN0aW5nU3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBzdGF0ZSBkaXNhcHBlYXJlZCB3aGlsZSBjb21wbGV0aW5nIGdvYWwgZm9yICcke25hbWV9J2ApO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nU3RhdGUgJiYgZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDaGVjayBpZiBvdXIgc3RhdGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgICAgICAvLyBJZiB2ZXJzaW9ucyBkb24ndCBtYXRjaCwgaXQgbWVhbnMgYW5vdGhlciBwcm9jZXNzIHVwZGF0ZWQgdGhlIHN0YXRlXG4gICAgICAgIGlmIChleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiA+IHN0YXRlLnN0YXRlVmVyc2lvbikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0IGRldGVjdGVkIGZvciBhZ2VudCAke25hbWV9YCwge1xuICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgIGF0dGVtcHRlZFZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ01FTU9SWV9TQVZFX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuc2F2ZUFnZW50U3RhdGUnLFxuICAgICAgICAgICAgZGV0YWlsczogYFN0YXRlIHZlcnNpb24gY29uZmxpY3Q6IGF0dGVtcHRlZCB0byBzYXZlIHN0YWxlIHN0YXRlYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogY3VycmVudCB2ZXJzaW9uIGlzICR7ZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb259LCBgICtcbiAgICAgICAgICAgIGBidXQgYXR0ZW1wdGVkIHRvIHNhdmUgdmVyc2lvbiAke3N0YXRlLnN0YXRlVmVyc2lvbn0uIGAgK1xuICAgICAgICAgICAgYFN0YXRlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgY29uY3VycmVudGx5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IEluY3JlbWVudCB2ZXJzaW9uIEJFRk9SRSBzZXJpYWxpemF0aW9uLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB2ZXJzaW9uIG9ubHkgaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IChzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMCkgKyAxO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSB0aGlzLnByZXBhcmVTdGF0ZUZvclNlcmlhbGl6YXRpb24oc3RhdGUpO1xuXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwoc2VyaWFsaXplZFN0YXRlLCB7XG4gICAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IGZhaWxzYWZlIGNvcnJ1cHRzIGJvb2xlYW5zL251bWJlcnMgaW4gYWdlbnQgc3RhdGVcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpemVcbiAgICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UudmFsaWRhdGVTaXplKHlhbWxDb250ZW50LCBNQVhfWUFNTF9TSVpFLCAnQWdlbnQgc3RhdGUnKTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBsb29rdXBzXG4gICAgICB0aGlzLnN0YXRlQ2FjaGUuc2V0KG5vcm1hbGl6ZWROYW1lLCBzdGF0ZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgc3RhdGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5YCwge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgZ29hbENvdW50OiBzdGF0ZS5nb2Fscz8ubGVuZ3RoID8/IDBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgdmVyc2lvbiBmb3IgY2FsbGVyIHRvIHN5bmMgYWdlbnQncyBpbnRlcm5hbCBzdGF0ZVxuICAgIC8vIHN0YXRlVmVyc2lvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbnVtYmVyIGFmdGVyIHRoZSBpbmNyZW1lbnQgYWJvdmVcbiAgICByZXR1cm4gc3RhdGUuc3RhdGVWZXJzaW9uITtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5OiBlbnN1cmUgYC5tZGAgZXh0ZW5zaW9uIG9uIHJlcXVlc3RlZCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEV4dGVuc2lvbihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IGZpbGVQYXRoLnNsaWNlKDAsIC1BR0VOVF9GSUxFX0VYVEVOU0lPTi5sZW5ndGgpXG4gICAgICA6IGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoeWRyYXRlQWdlbnRTdGF0ZShcbiAgICBhZ2VudDogQWdlbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmljdFN0YXRlRXJyb3JzID0gZmFsc2UsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShuYW1lLCBzdHJpY3RTdGF0ZUVycm9ycyk7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnBhcnNlKGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpKTtcbiAgICBzZXJpYWxpemVkLnN0YXRlID0gc3RhdGU7XG4gICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCkpO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcsIHN0cmljdFN0YXRlRXJyb3JzID0gZmFsc2UpOiBQcm9taXNlPEFnZW50U3RhdGUgfCBudWxsPiB7XG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGxvb2t1cHNcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUVsZW1lbnRTdG9yYWdlSWRlbnRpdHkobmFtZSk7XG5cbiAgICAvLyBTZWN1cml0eS1zZW5zaXRpdmUgc3RhdGUgY2hlY2tzIG11c3QgcmUtcmVhZCBkdXJhYmxlIHN0b3JhZ2UgcmF0aGVyIHRoYW5cbiAgICAvLyB0cnVzdGluZyBhIHBvc3NpYmx5IHN0YWxlIHByb2Nlc3MgY2FjaGUuXG4gICAgaWYgKCFzdHJpY3RTdGF0ZUVycm9ycyAmJiB0aGlzLnN0YXRlQ2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQobm9ybWFsaXplZE5hbWUpITtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShzdGF0ZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgWUFNTCBwYXJzaW5nXG4gICAgICAvLyBTdGF0ZSBmaWxlcyBhcmUgcHVyZSBZQU1MIGJ1dCBwYXJzZUZyb250bWF0dGVyIGhhbmRsZXMgYm90aCBmb3JtYXRzXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIubG9hZEFnZW50U3RhdGUnXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSByZXN1bHQuZGF0YSBhcyBBZ2VudFN0YXRlO1xuICAgICAgdGhpcy5ub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIGlmICghc3RyaWN0U3RhdGVFcnJvcnMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRTdGF0ZURpcmVjdG9yeUF2YWlsYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5ndWlzaCBhIGxlZ2l0aW1hdGVseSBhYnNlbnQgcGVyLWFnZW50IHN0YXRlIGZpbGUgZnJvbSB1bmF2YWlsYWJsZVxuICAgKiBzdGF0ZSBzdG9yYWdlLiBTdHJpY3QgcmVjb3ZlcnkgbWF5IHRyZWF0IG9ubHkgdGhlIGZvcm1lciBhcyBlbXB0eSBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0U3RhdGVEaXJlY3RvcnlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KHRoaXMuc3RhdGVEaXIpO1xuICAgICAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWdlbnQgc3RhdGUgc3RvcmFnZSBwYXRoIGlzIG5vdCBhIGRpcmVjdG9yeScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IHN0YXRlIGRpcmVjdG9yeSB1bmF2YWlsYWJsZTogJHtyZWFzb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcsIG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCBTRUNVUklUWV9MSU1JVFMuTUFYX0RPQ1VNRU5UQVRJT05fRklFTERfTEVOR1RIKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZGVmYXVsdHMgdG8gcHJldmVudCBpbmplY3Rpb24gd2hlbiB1c2VkIGluIGdvYWwgcmVuZGVyaW5nXG4gICAgICAgICAgaWYgKHR5cGVvZiBwLmRlZmF1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHNhbml0aXplSW5wdXQocC5kZWZhdWx0LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHAuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbC50ZW1wbGF0ZSxcbiAgICAgICAgcGFyYW1ldGVyczogdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE9iamVjdCB3aXRob3V0IHRlbXBsYXRlIC0gY2Fubm90IGNvbnZlcnRcbiAgICBsb2dnZXIud2FybignR29hbCBvYmplY3QgbWlzc2luZyB0ZW1wbGF0ZSBmaWVsZCwgY2Fubm90IGNvbnZlcnQgdG8gVjInLCB7IGdvYWwgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogUGFyc2VkQWdlbnRGaWxlIHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnBhcnNlQWdlbnRGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UgZW5zdXJlcyBmcm9udG1hdHRlciBleGlzdHMsIG9yIHRocm93cyBlcnJvclxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGVuYW1lIGZvciBhbiBhZ2VudCBlbGVtZW50LlxuICAgKlxuICAgKiBVc2VzIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBjb25zaXN0ZW50XG4gICAqIGZpbGVuYW1lIGZvcm1hdHRpbmcgYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICBcIkNyZWF0aXZlIFdyaXRlclwiIC0+IFwiY3JlYXRpdmUtd3JpdGVyLm1kXCJcbiAgICogICBcIkNSVURWLUFnZW50LURlbHRhXCIgLT4gXCJjcnVkdi1hZ2VudC1kZWx0YS5tZFwiXG4gICAqICAgXCJNdWx0aV9Hb2FsX0FnZW50XCIgLT4gXCJtdWx0aS1nb2FsLWFnZW50Lm1kXCJcbiAgICogICBcIkNhbWVsQ2FzZU5hbWVcIiAtPiBcImNhbWVsLWNhc2UtbmFtZS5tZFwiXG4gICAqL1xuICBwcml2YXRlIGdldEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZvciB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eW2EtekEtWjAtOV8tXSskLy50ZXN0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IERlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvbiBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZTogQWdlbnRTdGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlIGluc3RhbmNlb2YgRGF0ZSA/IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSA6IHN0YXRlLmxhc3RBY3RpdmUsXG4gICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQgPz8gMCksXG4gICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbikgOiAnMScsICAvLyBJbmNsdWRlIHZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZ1xuICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgIC4uLmdvYWwsXG4gICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQ6IGdvYWwuY29tcGxldGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jb21wbGV0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jb21wbGV0ZWRBdCxcbiAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSA6IHVuZGVmaW5lZFxuICAgICAgfSkpLFxuICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgIC4uLmRlY2lzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZTogQWdlbnRTdGF0ZSk6IHZvaWQge1xuICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IERlZmF1bHQgbWlzc2luZyBhcnJheXMgdG8gcHJldmVudCBUeXBlRXJyb3JcbiAgICAvLyBJZiBzdGF0ZSBmaWxlIGlzIG1pc3NpbmcgZ29hbHMvZGVjaXNpb25zL2NvbnRleHQsIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXlzL29iamVjdHNcbiAgICBpZiAoIXN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2FscyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuY29udGV4dCkge1xuICAgICAgc3RhdGUuY29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugc3RhdGVWZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmcgKElzc3VlICMyNClcbiAgICBpZiAoc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZlcnNpb24gMSBpZiBub3QgcHJlc2VudCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICBzdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUoc3RhdGUubGFzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmltcG9ydGFuY2UgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLnVyZ2VuY3kgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwudXJnZW5jeSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXBkYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKGRlY2lzaW9uID0+IHtcbiAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2lzaW9uLmNvbmZpZGVuY2UgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpc2lvbi50aW1lc3RhbXApIHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICogV3JhcHMgQWdlbnQucmVjb3JkRGVjaXNpb24oKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIC8qKiBPcHRpb25hbCBmaW5kaW5ncyBvciByZXN1bHRzIGZyb20gdGhpcyBzdGVwICovXG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICAvKiogT3B0aW9uYWwgaGludCBhYm91dCB3aGF0IHRoZSBMTE0gcGxhbnMgdG8gZG8gbmV4dCAoZm9yIHByb2FjdGl2ZSByaXNrIGV2YWx1YXRpb24pICovXG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqIE9wdGlvbmFsIHJpc2sgc2NvcmUgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKDAtMTAwKSAqL1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgICAvKiogUnVudGltZSBvdmVycmlkZSBmb3IgbWF4QXV0b25vbW91c1N0ZXBzIChJc3N1ZSAjNDQ3KSAqL1xuICAgIG1heFN0ZXBzT3ZlcnJpZGU/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZWNpc2lvbjoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqIEF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29udGludWUgb3IgcGF1c2UgKi9cbiAgICBhdXRvbm9teTogQXV0b25vbXlEaXJlY3RpdmU7XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZSB0byBmaW5kIGFjdGl2ZSBnb2Fsc1xuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBhY3RpdmVHb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcblxuICAgIGlmICghYWN0aXZlR29hbCkge1xuICAgICAgY29uc3QgZ29hbFN0YXR1c2VzID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gYCR7Zy5pZH06ICR7Zy5zdGF0dXN9YCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGFjdGl2ZSBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke2dvYWxTdGF0dXNlcyB8fCAnbm9uZSd9LiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwgZmlyc3QuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDYWxsIEFnZW50LnJlY29yZERlY2lzaW9uKCkgdG8gcGVyc2lzdCB0aGUgc3RlcFxuICAgIGNvbnN0IGRlY2lzaW9uID0gYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgICAgZGVjaXNpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5maW5kaW5ncyA/PyAnJyxcbiAgICAgIGNvbmZpZGVuY2U6IHBhcmFtcy5jb25maWRlbmNlID8/IDAuOCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNS4gR2V0IHVwZGF0ZWQgc3RhdGUgZm9yIHN0ZXAgY291bnQgYW5kIGF1dG9ub215IGV2YWx1YXRpb25cbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gNi4gQ2FsY3VsYXRlIHN0ZXAgY291bnQgZm9yIHRoaXMgZ29hbFxuICAgIC8vIHN0ZXBDb3VudCA9IG51bWJlciBvZiBzdGVwcyBjb21wbGV0ZWQgKGluY2x1ZGluZyB0aGUgb25lIGp1c3QgcmVjb3JkZWQpXG4gICAgLy8gVGhlIGV2YWx1YXRvciB1c2VzIHRoaXMgdG8gY2hlY2sgaWYgd2UndmUgaGl0IG1heEF1dG9ub21vdXNTdGVwc1xuICAgIC8vIGFuZCB0byBjb21wdXRlIHN0ZXBzUmVtYWluaW5nIGZvciB0aGUgYXV0b25vbXkgZGlyZWN0aXZlLlxuICAgIGNvbnN0IGdvYWxEZWNpc2lvbnMgPSB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBhY3RpdmVHb2FsLmlkKTtcbiAgICBjb25zdCBzdGVwQ291bnQgPSBnb2FsRGVjaXNpb25zLmxlbmd0aDtcblxuICAgIC8vIDcuIEdldCBhZ2VudCBtZXRhZGF0YSBmb3IgYXV0b25vbXkgY29uZmlnXG4gICAgY29uc3QgYWdlbnRNZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIDguIEV2YWx1YXRlIGF1dG9ub215IC0gc2hvdWxkIHdlIGNvbnRpbnVlIG9yIHBhdXNlP1xuICAgIC8vIElzc3VlICM0MDI6IFBhc3MgREktaW5qZWN0ZWQgRGFuZ2VyWm9uZUVuZm9yY2VyIHZpYSBjb250ZXh0XG4gICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCBhdXRvbm9teUNvbmZpZyA9IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlICE9PSB1bmRlZmluZWRcbiAgICAgID8geyAuLi5hZ2VudE1ldGFkYXRhLmF1dG9ub215LCBtYXhBdXRvbm9tb3VzU3RlcHM6IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlIH1cbiAgICAgIDogYWdlbnRNZXRhZGF0YS5hdXRvbm9teTtcblxuICAgIGNvbnN0IGF1dG9ub215RGlyZWN0aXZlID0gZXZhbHVhdGVBdXRvbm9teSh7XG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBhdXRvbm9teUNvbmZpZyxcbiAgICAgIHN0ZXBDb3VudCxcbiAgICAgIGN1cnJlbnRTdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICBjdXJyZW50U3RlcE91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgbmV4dEFjdGlvbkhpbnQ6IHBhcmFtcy5uZXh0QWN0aW9uSGludCxcbiAgICAgIHJpc2tTY29yZTogcGFyYW1zLnJpc2tTY29yZSxcbiAgICAgIGRhbmdlclpvbmVFbmZvcmNlcjogQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPy4oKSxcbiAgICAgIHZlcmlmaWNhdGlvblN0b3JlOiBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj8uKCksXG4gICAgICBnb2FsRGVzY3JpcHRpb246IGFjdGl2ZUdvYWwuZGVzY3JpcHRpb24sXG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgfSk7XG5cbiAgICAvLyA5LiBSZXR1cm4gZGVjaXNpb24sIHN0YXRlIHN1bW1hcnksIGFuZCBhdXRvbm9teSBkaXJlY3RpdmVcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTdGVwIHJlY29yZGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgLFxuICAgICAgZGVjaXNpb246IHtcbiAgICAgICAgaWQ6IGRlY2lzaW9uLmlkLFxuICAgICAgICBnb2FsSWQ6IGRlY2lzaW9uLmdvYWxJZCxcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmRlY2lzaW9uLFxuICAgICAgICByZWFzb25pbmc6IGRlY2lzaW9uLnJlYXNvbmluZyxcbiAgICAgICAgZnJhbWV3b3JrOiBkZWNpc2lvbi5mcmFtZXdvcmssXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBhdXRvbm9teTogYXV0b25vbXlEaXJlY3RpdmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICogV3JhcHMgQWdlbnQuY29tcGxldGVHb2FsKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5jb21wbGV0ZUFnZW50R29hbFdpdGhTdGF0ZVBvbGljeShwYXJhbXMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBDb21wbGV0ZSBhbiBleGFjdCBkdXJhYmxlIGdvYWwgd2l0aG91dCBjb25zdWx0aW5nIG9yZGluYXJ5IHN0YXRlIGNhY2hlcy4gKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWxGb3JSZWNvdmVyeShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ6IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVBZ2VudEdvYWxXaXRoU3RhdGVQb2xpY3kocGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBZ2VudEdvYWxXaXRoU3RhdGVQb2xpY3kocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0sIHN0cmljdFN0YXRlRXJyb3JzOiBib29sZWFuKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZ29hbDoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xuICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICBjb21wbGV0ZWRBdDogc3RyaW5nO1xuICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgYWN0dWFsRWZmb3J0PzogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0cmljczoge1xuICAgICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBudW1iZXI7XG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbnVtYmVyO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gc3RyaWN0U3RhdGVFcnJvcnNcbiAgICAgID8gYXdhaXQgdGhpcy5yZWFkV2l0aFN0YXRlUG9saWN5KHBhcmFtcy5hZ2VudE5hbWUsIHRydWUpXG4gICAgICA6IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEZpbmQgZ29hbCB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBsZXQgZ29hbDogQWdlbnRHb2FsIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHBhcmFtcy5nb2FsSWQpIHtcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gcGFyYW1zLmdvYWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgbW9zdCByZWNlbnQgaW4tcHJvZ3Jlc3MgZ29hbFxuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzXG4gICAgICAgIC5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0LmdldFRpbWUoKSAtIGEuY3JlYXRlZEF0LmdldFRpbWUoKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHBhcmFtcy5nb2FsSWRcbiAgICAgICAgICA/IGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmRgXG4gICAgICAgICAgOiBgTm8gaW4tcHJvZ3Jlc3MgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzICYmIGdvYWwuc3RhdHVzICE9PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBHb2FsICcke2dvYWwuaWR9JyBjaGFuZ2VkIHdoaWxlIGFib3J0aW5nIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjb3JkIGZpbmFsIGRlY2lzaW9uIHdpdGggc3VtbWFyeVxuICAgIGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogZ29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiAnZ29hbF9jb21wbGV0ZScsXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5zdW1tYXJ5LFxuICAgICAgY29uZmlkZW5jZTogMS4wLFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIENhbGwgQWdlbnQuY29tcGxldGVHb2FsKClcbiAgICBhZ2VudC5jb21wbGV0ZUdvYWwoZ29hbC5pZCwgcGFyYW1zLm91dGNvbWUpO1xuXG4gICAgLy8gNS4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA2LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3QgY29tcGxldGVTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycykge1xuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUoXG4gICAgICAgIGNvbXBsZXRlU2FuaXRpemVkTmFtZSxcbiAgICAgICAgYWdlbnQuZ2V0U3RhdGUoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShjb21wbGV0ZVNhbml0aXplZE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyA3LiBSZXR1cm4gZ29hbCwgbWV0cmljcywgYW5kIHN0YXRlXG4gICAgY29uc3QgdXBkYXRlZFN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZWRHb2FsID0gdXBkYXRlZFN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLmlkID09PSBnb2FsLmlkKSE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBHb2FsIGNvbXBsZXRlZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nIHdpdGggb3V0Y29tZTogJHtwYXJhbXMub3V0Y29tZX1gLFxuICAgICAgZ29hbDoge1xuICAgICAgICBpZDogY29tcGxldGVkR29hbC5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGNvbXBsZXRlZEdvYWwuZGVzY3JpcHRpb24sXG4gICAgICAgIHN0YXR1czogY29tcGxldGVkR29hbC5zdGF0dXMgYXMgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIsXG4gICAgICAgIGNyZWF0ZWRBdDogY29tcGxldGVkR29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29tcGxldGVkQXQ6IGNvbXBsZXRlZEdvYWwuY29tcGxldGVkQXQhLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVzdGltYXRlZEVmZm9ydDogY29tcGxldGVkR29hbC5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgIGFjdHVhbEVmZm9ydDogY29tcGxldGVkR29hbC5hY3R1YWxFZmZvcnRcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKiBXcmFwcyBBZ2VudC5nZXRTdGF0ZSgpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGdldEFnZW50U3RhdGUocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zLCBmYWxzZSk7XG4gIH1cblxuICAvKiogU3RyaWN0IGR1cmFibGUtc3RhdGUgdmFyaWFudCByZXNlcnZlZCBmb3Igc3RhbGUtcG9saWN5IHJlY292ZXJ5LiAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlRm9yUmVjb3ZlcnkocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9LCBzdHJpY3RTdGF0ZUVycm9yczogYm9vbGVhbik6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBpbXBvcnRhbmNlOiBudW1iZXI7XG4gICAgICAgIHVyZ2VuY3k6IG51bWJlcjtcbiAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50Pzogc3RyaW5nO1xuICAgICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcmlza0xldmVsPzogc3RyaW5nO1xuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGRlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgIGtleXM6IHN0cmluZ1tdO1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWRXaXRoU3RhdGVQb2xpY3kocGFyYW1zLmFnZW50TmFtZSwgc3RyaWN0U3RhdGVFcnJvcnMpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gMy4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA0LiBGaWx0ZXIgZGVjaXNpb25zIGJhc2VkIG9uIGluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICBjb25zdCBkZWNpc2lvbnMgPSBwYXJhbXMuaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgICAgPyBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIDogc3RhdGUuZGVjaXNpb25zLnNsaWNlKC0xMCk7IC8vIExhc3QgMTAgZGVjaXNpb25zXG5cbiAgICAvLyA1LiBCdWlsZCBjb250ZXh0IHN1bW1hcnlcbiAgICBjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHRTaXplID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29udGV4dCkubGVuZ3RoO1xuXG4gICAgLy8gNi4gUmV0dXJuIHN0YXRlIGFuZCBtZXRyaWNzXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgICAgICBpZDogZy5pZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmlvcml0eTogZy5wcmlvcml0eSxcbiAgICAgICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgICAgIGltcG9ydGFuY2U6IGcuaW1wb3J0YW5jZSxcbiAgICAgICAgICB1cmdlbmN5OiBnLnVyZ2VuY3ksXG4gICAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50OiBnLmVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGcuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBnLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnLmNvbXBsZXRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY2llczogZy5kZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmlza0xldmVsOiBnLnJpc2tMZXZlbCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGcuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICAgIGFjdHVhbEVmZm9ydDogZy5hY3R1YWxFZmZvcnQsXG4gICAgICAgICAgbm90ZXM6IGcubm90ZXNcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9ucy5tYXAoZCA9PiAoe1xuICAgICAgICAgIGlkOiBkLmlkLFxuICAgICAgICAgIGdvYWxJZDogZC5nb2FsSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICAgICAgZnJhbWV3b3JrOiBkLmZyYW1ld29yayxcbiAgICAgICAgICBjb25maWRlbmNlOiBkLmNvbmZpZGVuY2UsXG4gICAgICAgICAgb3V0Y29tZTogZC5vdXRjb21lXG4gICAgICAgIH0pKSxcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0ID8gc3RhdGUuY29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAgICBrZXlzOiBjb250ZXh0S2V5cyxcbiAgICAgICAgICBzaXplOiBjb250ZXh0U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdhdGhlcmVkIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbCBleGVjdXRpb24uXG4gICAqXG4gICAqIEFnZ3JlZ2F0ZXMgZGVjaXNpb24gaGlzdG9yeSwgZ29hbCBzdGF0ZSwgYW5kIHN1bW1hcnkgc3RhdGlzdGljc1xuICAgKiBpbnRvIGEgc3RydWN0dXJlZCBHYXRoZXJlZERhdGEgb2JqZWN0LiBUaGlzIGlzIGEgcmVhZC1zaWRlIHZpZXdcbiAgICogb3ZlciBleGlzdGluZyBhZ2VudCBzdGF0ZSBkYXRhLlxuICAgKlxuICAgKiBJc3N1ZSAjNjg6IEdhdGhlcmVkRGF0YUVudHJ5IGZvciBzdGF0ZSByZWNvcmRpbmdcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBDb21wbGV0aW9uIChFcGljICMzODApXG4gICAqL1xuICBhc3luYyBnZXRHYXRoZXJlZERhdGEocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEdhdGhlcmVkRGF0YT4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2F0aGVyZWQgPSBnZXRHYXRoZXJlZERhdGEocGFyYW1zLmFnZW50TmFtZSwgcGFyYW1zLmdvYWxJZCwgc3RhdGUpO1xuXG4gICAgaWYgKCFnYXRoZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke3N0YXRlLmdvYWxzLm1hcChnID0+IGcuaWQpLmpvaW4oJywgJykgfHwgJ25vbmUnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqIENvbWJpbmVzIGV4ZWN1dGVBZ2VudCB3aXRoIHN0YXRlIGNvbnRleHRcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQgJiB7XG4gICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgICByZWNlbnREZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgY29udGludWF0aW9uOiB7XG4gICAgICBpc1Jlc3VtaW5nOiBib29sZWFuO1xuICAgICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzPzogc3RyaW5nW107XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGN1cnJlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgYWN0aXZlR29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZ29hbCA9PiBnb2FsLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG5cbiAgICBpZiAoIWFjdGl2ZUdvYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNvbnRpbnVlX2V4ZWN1dGlvbiByZXF1aXJlcyBhbiBpbi1wcm9ncmVzcyBnb2FsIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbC4gSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgZ29hbCwgdXNlIG1jcF9hcWxfY3JlYXRlIHJlY29yZF9leGVjdXRpb25fc3RlcC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUdvYWxEZWNpc2lvbnMgPSBzdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGRlY2lzaW9uID0+IGRlY2lzaW9uLmdvYWxJZCA9PT0gYWN0aXZlR29hbC5pZCk7XG4gICAgaWYgKGFjdGl2ZUdvYWxEZWNpc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjb250aW51ZV9leGVjdXRpb24gaXMgb25seSBmb3IgcmVzdW1pbmcgYSBwYXVzZWQgZXhlY3V0aW9uIGFmdGVyIGF0IGxlYXN0IGAgK1xuICAgICAgICBgb25lIHJlY29yZGVkIHN0ZXAgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gQWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdGhlIGAgK1xuICAgICAgICBgbmV4dCBsaWZlY3ljbGUgY2FsbCBpcyBtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDaGVjayBpZiBhZ2VudCBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmVcbiAgICBjb25zdCBpc1Jlc3VtaW5nID0gc3RhdGUuc2Vzc2lvbkNvdW50ID4gMCB8fCBzdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID4gMDtcblxuICAgIC8vIDQuIEV4ZWN1dGUgYWdlbnQgbm9ybWFsbHkgKHRoaXMgYWN0aXZhdGVzIGVsZW1lbnRzIGFuZCBnZXRzIGNvbnRleHQpXG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0gcGFyYW1zLnBhcmFtZXRlcnMgfHwge307XG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBZ2VudChcbiAgICAgIHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBleGVjdXRpb25QYXJhbXMsXG4gICAgICB7IG9wZXJhdGlvbk5hbWU6ICdjb250aW51ZV9leGVjdXRpb24nIH1cbiAgICApO1xuXG4gICAgLy8gNS4gQnVpbGQgcHJldmlvdXMgc3RhdGUgc3VtbWFyeVxuICAgIGNvbnN0IHJlY2VudERlY2lzaW9ucyA9IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtNSkubWFwKGQgPT4gKHtcbiAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgIG91dGNvbWU6IGQub3V0Y29tZSxcbiAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGdvYWxTdW1tYXJ5ID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgcHJvZ3Jlc3M6IHVuZGVmaW5lZCAvLyBDb3VsZCBhZGQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gZnV0dXJlXG4gICAgfSkpO1xuXG4gICAgLy8gNi4gR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gc3RhdGVcbiAgICBjb25zdCBzdWdnZXN0ZWROZXh0U3RlcHMgPSB0aGlzLmdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlKTtcblxuICAgIC8vIDcuIE1lcmdlIGV4ZWN1dGlvbiByZXN1bHQgd2l0aCBjb250aW51YXRpb24gY29udGV4dFxuICAgIHJldHVybiB7XG4gICAgICAvLyBJbmNsdWRlIGFsbCBmaWVsZHMgZnJvbSBleGVjdXRlX2FnZW50IHJlc3VsdFxuICAgICAgLi4uZXhlY3V0aW9uUmVzdWx0LFxuXG4gICAgICAvLyBBZGQgcHJldmlvdXMgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IGdvYWxTdW1tYXJ5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZCBjb250aW51YXRpb24gY29udGV4dFxuICAgICAgY29udGludWF0aW9uOiB7XG4gICAgICAgIGlzUmVzdW1pbmcsXG4gICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCxcbiAgICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlOiBBZ2VudFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgZ29hbHNcbiAgICBjb25zdCBwZW5kaW5nR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKTtcbiAgICBpZiAocGVuZGluZ0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFN0YXJ0IHdvcmsgb24gJHtwZW5kaW5nR29hbHMubGVuZ3RofSBwZW5kaW5nIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW4tcHJvZ3Jlc3MgZ29hbHNcbiAgICBjb25zdCBpblByb2dyZXNzR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG4gICAgaWYgKGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBDb250aW51ZSAke2luUHJvZ3Jlc3NHb2Fscy5sZW5ndGh9IGluLXByb2dyZXNzIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYmxvY2tlZCBnb2FscyAoZGVwZW5kZW5jaWVzKVxuICAgIGNvbnN0IGJsb2NrZWRHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+XG4gICAgICBnLmRlcGVuZGVuY2llcyAmJiBnLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwICYmIGcuc3RhdHVzID09PSAncGVuZGluZydcbiAgICApO1xuICAgIGlmIChibG9ja2VkR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yICR7YmxvY2tlZEdvYWxzLmxlbmd0aH0gYmxvY2tlZCBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVjaXNpb24gaGlzdG9yeSBmb3IgZmFpbHVyZXNcbiAgICBjb25zdCByZWNlbnRGYWlsdXJlcyA9IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgLnNsaWNlKC0xMClcbiAgICAgIC5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdmYWlsdXJlJyk7XG4gICAgaWYgKHJlY2VudEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJldmlldyBhbmQgYWRkcmVzcyAke3JlY2VudEZhaWx1cmVzLmxlbmd0aH0gcmVjZW50IGZhaWx1cmUocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|