@dollhousemcp/mcp-server 2.0.12 → 2.0.13

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.13] - 2026-04-13
4
+
5
+ ### Security Fixes
6
+
7
+ - **False-positive CRITICAL alerts eliminated** — bundled elements containing legitimate YAML keys (`javascript:`) or educational security payloads (`wget` in pentest templates) no longer fire CRITICAL alerts at install time (#1941)
8
+ - **JavaScript protocol injection regex tightened** — pattern now requires a non-whitespace character after the colon (`javascript[ \t]*:[ \t]*\S`), preventing bare YAML map keys from matching while still catching real `javascript:void(0)` injection attempts (#1941)
9
+ - **Bundled element trust system** — build generates `data/HASHES.json`; at startup, `DefaultElementProvider` verifies each bundled file against its SHA-256 and registers matching hashes with `ContentValidator`; verified content bypasses injection scanning, modified files automatically lose trust (#1941)
10
+
11
+ ### CI/CD
12
+
13
+ - **OIDC publishing restored** — removed broken `npm install -g npm@11` step that caused every publish workflow to fail with `MODULE_NOT_FOUND: promise-retry`; npm 10.x (ships with Node 22) already supports `--provenance` (#1941)
14
+
3
15
  ## [2.0.12] - 2026-04-12
4
16
 
5
17
  ### Authenticated Web Console
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "2.0.12";
6
- export declare const BUILD_TIMESTAMP = "2026-04-12T18:19:09.410Z";
5
+ export declare const PACKAGE_VERSION = "2.0.13";
6
+ export declare const BUILD_TIMESTAMP = "2026-04-13T16:33:05.030Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '2.0.12';
6
- export const BUILD_TIMESTAMP = '2026-04-12T18:19:09.410Z';
5
+ export const PACKAGE_VERSION = '2.0.13';
6
+ export const BUILD_TIMESTAMP = '2026-04-13T16:33:05.030Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMTInO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTEyVDE4OjE5OjA5LjQxMFonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMTMnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTEzVDE2OjMzOjA1LjAzMFonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
@@ -37,6 +37,14 @@ export declare class DefaultElementProvider {
37
37
  private static metadataCache;
38
38
  private static readonly MAX_CACHE_SIZE;
39
39
  constructor(config?: DefaultElementProviderConfig);
40
+ /**
41
+ * Read data/HASHES.json (shipped with the npm package) and register each
42
+ * SHA-256 hash with ContentValidator as trusted bundled content.
43
+ *
44
+ * Only files whose on-disk hash matches the manifest entry are registered —
45
+ * any post-install modification breaks the hash and revokes trust automatically.
46
+ */
47
+ private registerBundledHashes;
40
48
  /**
41
49
  * Get the current loadTestData configuration value
42
50
  * @returns Whether test data loading is enabled
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ import { ElementType } from './types.js';
17
17
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
18
18
  import { SecurityMonitor } from '../security/securityMonitor.js';
19
19
  import { SecureYamlParser } from '../security/secureYamlParser.js';
20
+ import { ContentValidator } from '../security/contentValidator.js';
20
21
  // File operation constants
21
22
  export const FILE_CONSTANTS = {
22
23
  ELEMENT_EXTENSION: '.md',
@@ -102,6 +103,47 @@ export class DefaultElementProvider {
102
103
  logger.info('[DefaultElementProvider] Development mode detected - test data loading disabled');
103
104
  logger.info('[DefaultElementProvider] To enable test data, set DOLLHOUSE_LOAD_TEST_DATA=true');
104
105
  }
106
+ // Register bundled element hashes with ContentValidator so verified bundled
107
+ // content does not trigger false-positive CRITICAL injection alerts at startup.
108
+ this.registerBundledHashes();
109
+ }
110
+ /**
111
+ * Read data/HASHES.json (shipped with the npm package) and register each
112
+ * SHA-256 hash with ContentValidator as trusted bundled content.
113
+ *
114
+ * Only files whose on-disk hash matches the manifest entry are registered —
115
+ * any post-install modification breaks the hash and revokes trust automatically.
116
+ */
117
+ registerBundledHashes() {
118
+ try {
119
+ const hashesPath = path.join(this.__dirname, '..', 'data', 'HASHES.json');
120
+ const raw = fsSync.readFileSync(hashesPath, 'utf-8');
121
+ const manifest = JSON.parse(raw);
122
+ const dataDir = path.join(this.__dirname, '..', 'data');
123
+ let registered = 0;
124
+ for (const [relPath, expectedHash] of Object.entries(manifest.files)) {
125
+ const fullPath = path.join(dataDir, relPath);
126
+ try {
127
+ const content = fsSync.readFileSync(fullPath);
128
+ const actualHash = createHash('sha256').update(content).digest('hex');
129
+ if (actualHash === expectedHash) {
130
+ ContentValidator.registerBundledHash(expectedHash);
131
+ registered++;
132
+ }
133
+ else {
134
+ logger.warn(`[DefaultElementProvider] Bundled file hash mismatch — treating as untrusted: ${relPath}`);
135
+ }
136
+ }
137
+ catch {
138
+ // File missing from this build's data/ — skip silently
139
+ }
140
+ }
141
+ logger.debug(`[DefaultElementProvider] Registered ${registered} verified bundled element hashes`);
142
+ }
143
+ catch {
144
+ // HASHES.json missing (older install, dev mode, or stripped package) — degrade gracefully
145
+ logger.debug('[DefaultElementProvider] data/HASHES.json not found — bundled element trust skipped');
146
+ }
105
147
  }
106
148
  /**
107
149
  * Get the current loadTestData configuration value
@@ -986,4 +1028,4 @@ export class DefaultElementProvider {
986
1028
  }
987
1029
  }
988
1030
  }
989
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR25FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FB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InNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdEVsZW1lbnRQcm92aWRlciAtIFBvcHVsYXRlcyBwb3J0Zm9saW8gd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGZyb20gYnVuZGxlZCBkYXRhXG4gKiBcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBjb3B5aW5nIGRlZmF1bHQgcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhbmQgb3RoZXIgZWxlbWVudHNcbiAqIGZyb20gdGhlIE5QTSBwYWNrYWdlIG9yIEdpdCByZXBvc2l0b3J5IHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvIG9uIGZpcnN0IHJ1bi5cbiAqIEl0IGVuc3VyZXMgdXNlcnMgaGF2ZSBleGFtcGxlIGNvbnRlbnQgdG8gd29yayB3aXRoIGltbWVkaWF0ZWx5IGFmdGVyIGluc3RhbGxhdGlvbi5cbiAqL1xuXG4vLyBOT1RFOiBmc1N5bmMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGZvciBzeW5jaHJvbm91cyBkZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvbiBhdCBtb2R1bGUgbG9hZCB0aW1lLlxuLy8gVGhlIElTX0RFVkVMT1BNRU5UX01PREUgY2hlY2sgcnVucyBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uIGJlZm9yZSBhc3luYyBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUuXG4vLyBBbGwgb3RoZXIgZmlsZSBvcGVyYXRpb25zIHVzZSBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGNlbnRyYWxpemVkLCBzZWN1cmUgZmlsZSBoYW5kbGluZy5cbmltcG9ydCAqIGFzIGZzU3luYyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIEZpbGUgb3BlcmF0aW9uIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IEZJTEVfQ09OU1RBTlRTID0ge1xuICBFTEVNRU5UX0VYVEVOU0lPTjogJy5tZCcsXG4gIFlBTUxfRVhURU5TSU9OOiAnLnlhbWwnLFxuICBZTUxfRVhURU5TSU9OOiAnLnltbCcsXG4gIEpTT05fRVhURU5TSU9OOiAnLmpzb24nLFxuICBNQVhfRklMRV9TSVpFOiAxMCAqIDEwMjQgKiAxMDI0LCAvLyAxME1CIG1heCBmaWxlIHNpemUgZm9yIHNhZmV0eVxuICBDSEVDS1NVTV9BTEdPUklUSE06ICdzaGEyNTYnLFxuICBGSUxFX1BFUk1JU1NJT05TOiAwbzY0NCxcbiAgQ0hVTktfU0laRTogNjQgKiAxMDI0IC8vIDY0S0IgY2h1bmtzIGZvciByZWFkaW5nIGxhcmdlIGZpbGVzXG59IGFzIGNvbnN0O1xuXG4vLyBEZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvblxuLy8gV2hlbiBydW5uaW5nIGZyb20gYSBnaXQgY2xvbmUsIHdlIGRvbid0IHdhbnQgdG8gYXV0by1sb2FkIHRlc3QgZGF0YVxuY29uc3QgSVNfREVWRUxPUE1FTlRfTU9ERSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeSAoZGV2ZWxvcG1lbnQgbW9kZSlcbiAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5naXQnKTtcbiAgICByZXR1cm4gZnNTeW5jLmV4aXN0c1N5bmMoZ2l0RGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KSgpO1xuXG4vLyBJbnRlcm5hbCBjb25zdGFudHNcbmNvbnN0IENPUFlfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQ09QWV9SRVRSWV9ERUxBWSA9IDEwMDsgLy8gbXNcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIEN1c3RvbSBkYXRhIGRpcmVjdG9yeSBwYXRocyB0byBzZWFyY2ggKGNoZWNrZWQgYmVmb3JlIGRlZmF1bHQgcGF0aHMpICovXG4gIGN1c3RvbURhdGFQYXRocz86IHN0cmluZ1tdO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aHMgYWZ0ZXIgY3VzdG9tIHBhdGhzICovXG4gIHVzZURlZmF1bHRQYXRocz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGxvYWQgdGVzdC9leGFtcGxlIGRhdGEgZnJvbSByZXBvc2l0b3J5IChkZWZhdWx0OiBmYWxzZSBpbiBkZXYgbW9kZSkgKi9cbiAgbG9hZFRlc3REYXRhPzogYm9vbGVhbjtcbiAgLyoqIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgY2VudHJhbGl6ZWQgZmlsZSBvcGVyYXRpb25zICovXG4gIGZpbGVPcGVyYXRpb25zPzogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcbn1cblxuLy8gUEVSRk9STUFOQ0U6IE1ldGFkYXRhIGNhY2hlIHdpdGggbXRpbWUtYmFzZWQgaW52YWxpZGF0aW9uXG5pbnRlcmZhY2UgTWV0YWRhdGFDYWNoZUVudHJ5IHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9ucz86IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgc3RhdGljIGxvZ0xpc3RlbmVyPzogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbiAgc3RhdGljIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBDYWNoZSBtZXRhZGF0YSB3aXRoIGZpbGUgbXRpbWUgZm9yIGludmFsaWRhdGlvblxuICBwcml2YXRlIHN0YXRpYyBtZXRhZGF0YUNhY2hlOiBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlRW50cnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQ0FDSEVfU0laRSA9IDIwOyAvLyBNRU1PUlkgTEVBSyBGSVg6IEZ1cnRoZXIgcmVkdWNlZCBjYWNoZSBzaXplIHRvIHByZXZlbnQgYWNjdW11bGF0aW9uIGR1cmluZyBwZXJmb3JtYW5jZSB0ZXN0c1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgLy8gU3RvcmUgZmlsZU9wZXJhdGlvbnMgc2VydmljZSBpZiBwcm92aWRlZFxuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBjb25maWc/LmZpbGVPcGVyYXRpb25zO1xuICAgIFxuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0ZXN0IGRhdGEgbG9hZGluZ1xuICAgIGNvbnN0IGVudkxvYWRUZXN0RGF0YSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0FEX1RFU1RfREFUQTtcbiAgICBjb25zdCBsb2FkVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAndHJ1ZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMSc7XG4gICAgY29uc3QgZGlzYWJsZVRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ2ZhbHNlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcwJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBkZXZlbG9wbWVudCBtb2RlICh3aXRoIHJlc3BlY3QgdG8gRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9ICgoKSA9PiB7XG4gICAgICAvLyBSZXNwZWN0IEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSBmaXJzdFxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yY2UgcHJvZHVjdGlvbiBtb2RlXG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBGb3JjZSBkZXZlbG9wbWVudCBtb2RlXG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2l0IGRldGVjdGlvblxuICAgICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gICAgfSkoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgbG9hZFRlc3REYXRhIHZhbHVlXG4gICAgbGV0IGNvbXB1dGVkTG9hZFRlc3REYXRhOiBib29sZWFuO1xuICAgIGlmIChsb2FkVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGVuYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNhYmxlVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGRpc2FibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBsb2dpYzogZW5hYmxlIGluIHByb2R1Y3Rpb24sIGRpc2FibGUgaW4gZGV2ZWxvcG1lbnQgdW5sZXNzIGNvbmZpZyBvdmVycmlkZXNcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gIWlzRGV2TW9kZSAmJiAoY29uZmlnPy5sb2FkVGVzdERhdGEgPz8gdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLy8gQXBwbHkgZmluYWwgbG9hZFRlc3REYXRhIGxvZ2ljIC0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZXZlbG9wbWVudCBtb2RlIHRha2UgcHJlY2VkZW5jZVxuICAgICAgbG9hZFRlc3REYXRhOiBsb2FkVGVzdERhdGFGcm9tRW52ID8gdHJ1ZSA6IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPyBmYWxzZSA6IGNvbXB1dGVkTG9hZFRlc3REYXRhXG4gICAgfTtcbiAgICBcbiAgICBpZiAoaXNEZXZNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3RlZCAtIHRlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFRvIGVuYWJsZSB0ZXN0IGRhdGEsIHNldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZScpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsb2FkVGVzdERhdGEgY29uZmlndXJhdGlvbiB2YWx1ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNUZXN0RGF0YUxvYWRpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICogQHJldHVybnMgV2hldGhlciBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXZlbG9wbWVudE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gIH1cblxuICAvLyA9PT09PSBIRUxQRVIgTUVUSE9EUyBGT1IgRklMRSBPUEVSQVRJT05TID09PT09XG4gIC8vIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gZmlsZU9wZXJhdGlvbnMgaXMgbm90IGluamVjdGVkXG4gIC8vIGFuZCBjZW50cmFsaXplIGFsbCBmaWxlIHN5c3RlbSBjYWxscyB0aHJvdWdoIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGVuIGF2YWlsYWJsZVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8ZnNTeW5jLlN0YXRzPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZmlsZVBhdGgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogaW1wb3J0IGZzL3Byb21pc2VzIGR5bmFtaWNhbGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMuc3RhdChmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3REaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHJldHVybiBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZURpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZU9wKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlGaWxlT3AnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNobW9kRmlsZShmaWxlUGF0aDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QoZmlsZVBhdGgsIG1vZGUsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jaG1vZEZpbGUnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jaG1vZChmaWxlUGF0aCwgbW9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUZpbGVPcChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoZmlsZVBhdGgsIHVuZGVmaW5lZCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmRlbGV0ZUZpbGVPcCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5yZWFkRmlsZUNvbnRlbnQnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gPT09PT0gRU5EIEhFTFBFUiBNRVRIT0RTID09PT09XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYXRocyBmb3IgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgKiBPcmRlcmVkIGJ5IHByaW9yaXR5IC0gY3VzdG9tIHBhdGhzIGZpcnN0LCB0aGVuIGRldmVsb3BtZW50L2dpdCwgdGhlbiBOUE0gbG9jYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGdldCBkYXRhU2VhcmNoUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIEFkZCBjdXN0b20gcGF0aHMgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbURhdGFQYXRocykge1xuICAgICAgcGF0aHMucHVzaCguLi50aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZGVmYXVsdCBwYXRocyBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZURlZmF1bHRQYXRocyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIFNraXAgZGV2ZWxvcG1lbnQvcmVwb3NpdG9yeSBkYXRhIHBhdGhzIHVubGVzcyB0ZXN0IGRhdGEgbG9hZGluZyBpcyBlbmFibGVkXG4gICAgICBpZiAodGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICAgIC8vIERldmVsb3BtZW50L0dpdCBpbnN0YWxsYXRpb24gKHJlbGF0aXZlIHRvIHRoaXMgZmlsZSlcbiAgICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgICBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLi8uLi9kYXRhJyksXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YScpLFxuICAgICAgICAgIC8vIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKGxhc3QgcmVzb3J0KVxuICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnZGF0YScpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIE5QTSBpbnN0YWxsYXRpb24gcGF0aHMgKHRoZXNlIHdvdWxkIGhhdmUgcHJvZHVjdGlvbiBkYXRhKVxuICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBtYWNPUyBIb21lYnJld1xuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gc3RhbmRhcmQgVW5peC9MaW51eFxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgJy91c3IvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3NcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXNcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzICh4ODYpXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzIHdpdGggbnZtXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8ICcnLCAnbnBtJywgJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInLCAnZGF0YScpXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGJ5IGNoZWNraW5nIGVhY2ggc2VhcmNoIHBhdGhcbiAgICogVXNlcyBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgY2FjaGVzIHRoZSByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZERhdGFEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBhdmFpbGFibGVcbiAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBhbGwgcGF0aHMgaW4gcGFyYWxsZWwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGNoZWNrUHJvbWlzZXMgPSB0aGlzLmRhdGFTZWFyY2hQYXRocy5tYXAoYXN5bmMgKHNlYXJjaFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzZWFyY2hQYXRoKTtcbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAvLyBWZXJpZnkgaXQgY29udGFpbnMgZXhwZWN0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCBoYXNQZXJzb25hcyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAncGVyc29uYXMnKSk7XG4gICAgICAgICAgY29uc3QgaGFzU2tpbGxzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdza2lsbHMnKSk7XG4gICAgICAgICAgaWYgKGhhc1BlcnNvbmFzIHx8IGhhc1NraWxscykge1xuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoZWNrUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZvdW5kIGRhdGEgZGlyZWN0b3J5IGF0OiAke3Jlc3VsdC52YWx1ZX1gKTtcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci53YXJuKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCBpbiBhbnkgc2VhcmNoIHBhdGgnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZGlyUGF0aCk7XG4gICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmlsZSBwYXRoIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIGZpbGUgcGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGlyZWN0b3J5IHRyYXZlcnNhbFxuICAgKiBQcmV2aW91c2x5OiBGaWxlIHBhdGhzIHdlcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24sIGFsbG93aW5nIHBvdGVudGlhbCAuLi8uLi8uLi8gYXR0YWNrc1xuICAgKiBOb3c6IFN0cmljdCB2YWxpZGF0aW9uIGVuc3VyZXMgcGF0aHMgc3RheSB3aXRoaW4gYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gYWxsb3dlZEJhc2VQYXRocyBBcnJheSBvZiBhbGxvd2VkIGJhc2UgcGF0aHMgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhdGggaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYWxsb3dlZEJhc2VQYXRocz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOb3JtYWxpemUgcGF0aCB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgcGF0aHMgY29udGFpbmluZyB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0cywgYnV0IGFsbG93IFdpbmRvd3MgOC4zIHNob3J0IHBhdGggbmFtZXNcbiAgICAgIC8vIFdpbmRvd3Mgc2hvcnQgcGF0aCBuYW1lcyB1c2UgfiBmb2xsb3dlZCBieSBhIGRpZ2l0IChlLmcuLCBSVU5ORVJ+MSksIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkXG4gICAgICAvLyBPbmx5IGJsb2NrIH4gZm9sbG93ZWQgYnkgLyBvciBcXCAoaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIHBhdHRlcm5zKVxuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+LycpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+XFxcXCcpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IGFic29sdXRlIHBhdGhzIG91dHNpZGUgYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkgJiYgYWxsb3dlZEJhc2VQYXRocykge1xuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkQmFzZVBhdGhzLnNvbWUoYmFzZVBhdGggPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWJzb2x1dGUgcGF0aCBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXM6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgbnVsbCBieXRlcyBhbmQgb3RoZXIgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFwwJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHsgLy8gTk9TT05BUiAtIE51bGwgYnl0ZSBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTnVsbCBieXRlIGluIHBhdGggYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gREVQUkVDQVRFRDogQ29tbWVudGVkIG91dCBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiAtIHJlcGxhY2VkIHdpdGggbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gIC8qKlxuICAgKiBDYWNoZWQgY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICovXG4gIC8vIHByaXZhdGUgc3RhdGljIGNvbXBpbGVkVGVzdFBhdHRlcm5zOiBSZWdFeHBbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgY29tcGlsZWQgdGVzdCBwYXR0ZXJucyB3aXRoIGNhY2hpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgICovXG4gIC8vIHByaXZhdGUgZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTogUmVnRXhwW10ge1xuICAvLyAgIC8vIFVzZSBjYWNoZWQgcGF0dGVybnMgaWYgYXZhaWxhYmxlXG4gIC8vICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMpIHtcbiAgLy8gICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyAgIH1cbiAgLy8gICBcbiAgLy8gICAvLyBDb21waWxlIGFuZCBjYWNoZSBwYXR0ZXJucyBvbiBmaXJzdCB1c2VcbiAgLy8gICAvLyBDUklUSUNBTCBGSVg6IFJlbW92ZWQgb3Zlcmx5IGJyb2FkIC9edGVzdC0vaSBwYXR0ZXJuIHRoYXQgd2FzIGJsb2NraW5nIGxlZ2l0aW1hdGUgdXNlXG4gIC8vICAgLy8gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHBlcnNvbmFzIGxpa2UgXCJ0ZXN0LWRyaXZlbi1kZXZlbG9wZXJcIiBvciBcInRlc3QtYXV0b21hdGlvbi1leHBlcnRcIlxuICAvLyAgIC8vIFdlIG9ubHkgYmxvY2sgc3BlY2lmaWMgdGVzdCBwYXR0ZXJucyB0aGF0IGFyZSBjbGVhcmx5IGZyb20gb3VyIHRlc3Qgc3VpdGVcbiAgLy8gICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zID0gW1xuICAvLyAgICAgL150ZXN0cGVyc29uYS9pLCAgICAgICAgICAgICAgLy8gT3VyIHRlc3Qgc3VpdGUgcGF0dGVyblxuICAvLyAgICAgL155YW1sdGVzdC9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWxib21iL2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ebWVtb3J5LXRlc3QtL2ksICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15wZXJmLXRlc3QtL2ksICAgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnRlc3QtZml4dHVyZS0vaSwgICAgICAgICAgICAvLyBUZXN0IGZpeHR1cmUgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9edGVzdC1kYXRhLS9pLCAgICAgICAgICAgICAgIC8vIFRlc3QgZGF0YSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL2Jpbi1zaHxybS1yZnxwd25lZC9pLCAgICAgICAgLy8gTWFsaWNpb3VzIHBhdHRlcm5zXG4gIC8vICAgICAvY29uY3VycmVudC1cXGQrL2ksICAgICAgICAgICAgLy8gQ29uY3VycmVudCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9sZWdhY3lcXC5tZCQvaSwgICAgICAgICAgICAgICAvLyBMZWdhY3kgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvcGVyZm9ybWFuY2UtdGVzdC9pLCAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC8tXFxkezEzfS1bYS16MC05XStcXC5tZCQvaSwgICAgLy8gVGltZXN0YW1wLWJhc2VkIHRlc3QgZmlsZXNcbiAgLy8gICAgIC9edW5pdHRlc3QtL2ksICAgICAgICAgICAgICAgIC8vIFVuaXQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXmludGVncmF0aW9udGVzdC0vaSwgICAgICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0IHBhdHRlcm5cbiAgLy8gICBdO1xuICAvLyAgIFxuICAvLyAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IGRhdGEgcGF0dGVybnMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgY29waWVkIHRvIHByb2R1Y3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoKSBmb3IgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgYmxvY2tlZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBpc1Rlc3REYXRhUGF0dGVybihmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk7XG4gIC8vICAgcmV0dXJuIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlciBvbmx5IChuZXZlciByZWFkcyBjb250ZW50IGJvZHkpXG4gICAqIFVzZXMgYSBzbWFsbCBidWZmZXIgdG8gc2FmZWx5IGV4dHJhY3Qgb25seSB0aGUgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byByZWFkIG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJldXNhYmxlIGJ1ZmZlciBwb29sIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidWZmZXJQb29sOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9PTF9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogUmVkdWNlZCBidWZmZXIgcG9vbCBzaXplIHRvIG1hdGNoIGNhY2hlIHNpemUgZm9yIGNvbnNpc3RlbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgXG4gIHByaXZhdGUgZ2V0QnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IFRyYWNrIGJ1ZmZlciBwb29sIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbW9uaXRvcmluZ1xuICAgIGxldCBidWZmZXIgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucG9wKCk7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cysrO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzKys7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNDA5Nik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDcmVhdGVkIG5ldyBidWZmZXIgKHBvb2wgZW1wdHkpLCB0b3RhbCBjcmVhdGVkOiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWxlYXNlQnVmZmVyKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBBbHdheXMgYXR0ZW1wdCB0byByZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPCBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkUpIHtcbiAgICAgIGJ1ZmZlci5maWxsKDApOyAvLyBTRUNVUklUWTogQ2xlYXIgYnVmZmVyIGJlZm9yZSByZXVzZSB0byBwcmV2ZW50IGRhdGEgbGVha2FnZVxuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IElmIHBvb2wgaXMgZnVsbCwgY2xlYXIgdGhlIGJ1ZmZlciB0byBoZWxwIEdDXG4gICAgICBidWZmZXIuZmlsbCgwKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEJ1ZmZlciBwb29sIGZ1bGwsIGRpc2NhcmRpbmcgYnVmZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGJ1ZmZlciBwb29sIGFuZCBjYWNoZSB0byBmcmVlIG1lbW9yeVxuICAgKiBQRVJGT1JNQU5DRSBGSVg6IEFkZGVkIGNsZWFudXAgbWV0aG9kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24gb3IgcGVyaW9kaWMgY2xlYW51cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGJ1ZmZlciBwb29sXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA9IDA7XG4gICAgXG4gICAgLy8gQ2xlYXIgbWV0YWRhdGEgY2FjaGVcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSBudWxsO1xuICAgIFxuICAgIC8vIENsZWFyIHBvcHVsYXRpb24gcHJvbWlzZXNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTWVtb3J5IGNsZWFudXAgY29tcGxldGVkJywge1xuICAgICAgYnVmZmVyU3RhdHM6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLFxuICAgICAgY2FjaGVDbGVhcmVkOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAgICogUEVSRk9STUFOQ0UgTU9OSVRPUklORzogQWRkZWQgc3RhdGlzdGljcyBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIFRoaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byBidWZmZXIgcG9vbCBlZmZpY2llbmN5IGFuZCBjYWNoZSBwZXJmb3JtYW5jZVxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgIGhpdHM6IG51bWJlcjtcbiAgICAgIG1pc3NlczogbnVtYmVyOyBcbiAgICAgIGNyZWF0ZWQ6IG51bWJlcjtcbiAgICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICAgIHBvb2xTaXplOiBudW1iZXI7XG4gICAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgbWF4U2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH0ge1xuICAgIGNvbnN0IGJ1ZmZlckhpdHMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzO1xuICAgIGNvbnN0IGJ1ZmZlck1pc3NlcyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcztcbiAgICBjb25zdCB0b3RhbFJlcXVlc3RzID0gYnVmZmVySGl0cyArIGJ1ZmZlck1pc3NlcztcblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJQb29sOiB7XG4gICAgICAgIGhpdHM6IGJ1ZmZlckhpdHMsXG4gICAgICAgIG1pc3NlczogYnVmZmVyTWlzc2VzLFxuICAgICAgICBjcmVhdGVkOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkLFxuICAgICAgICBoaXRSYXRlOiB0b3RhbFJlcXVlc3RzID4gMCA/IGJ1ZmZlckhpdHMgLyB0b3RhbFJlcXVlc3RzIDogMCxcbiAgICAgICAgcG9vbFNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGgsXG4gICAgICAgIG1heFBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkVcbiAgICAgIH0sXG4gICAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICAgIHNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplLFxuICAgICAgICBtYXhTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgdGhlIFlBTUwgZnJvbnRtYXR0ZXIgbWV0YWRhdGEgZnJvbSBhIGZpbGUgKGZpcnN0IDRLQilcbiAgICpcbiAgICogU0VDVVJJVFkgTk9URSAoSXNzdWUgIzEyMjgpOiBUaGlzIG1ldGhvZCBNVVNUIHVzZSB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUgd2hlbiBjYWxsaW5nXG4gICAqIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnMuIFNldHRpbmcgdmFsaWRhdGVDb250ZW50XG4gICAqIHRvIGZhbHNlIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiBpbmNsdWRpbmcgemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uLFxuICAgKiBjcmVhdGluZyBhIHNlY3VyaXR5IGJ5cGFzcyB2dWxuZXJhYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlYWRcbiAgICogQHBhcmFtIHJldHJpZXMgLSBOdW1iZXIgb2YgcmV0cmllcyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKVxuICAgKiBAcmV0dXJucyBQYXJzZWQgbWV0YWRhdGEgb2JqZWN0IG9yIG51bGwgaWYgbm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZE1ldGFkYXRhT25seShmaWxlUGF0aDogc3RyaW5nLCByZXRyaWVzID0gMik6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIC8vIFBFUkZPUk1BTkNFOiBDaGVjayBjYWNoZSBmaXJzdCBiZWZvcmUgcmVhZGluZyBmaWxlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGZpbGVQYXRoO1xuICAgICAgY29uc3QgY2FjaGVkID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICAgIC8vIFJldHVybiBjYWNoZWQgbWV0YWRhdGEgaWYgZmlsZSBoYXNuJ3QgY2hhbmdlZFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgaW50ZWdlciBtdGltZSBjb21wYXJpc29uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBpc3N1ZXNcbiAgICAgIGlmIChjYWNoZWQgJiYgTWF0aC5mbG9vcihjYWNoZWQubXRpbWUpID09PSBNYXRoLmZsb29yKHN0YXRzLm10aW1lTXMpICYmIGNhY2hlZC5zaXplID09PSBzdGF0cy5zaXplKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENhY2hlIGhpdCBmb3IgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIG5vcm1hbCBmbG93XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBOT1RFOiBVc2luZyBkaXJlY3QgZnMub3BlbiBmb3IgcGFydGlhbCBmaWxlIHJlYWQgKGZpcnN0IDRLQiBvbmx5KS5cbiAgICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCByZWFkcyB3aXRoIGZpbGUgaGFuZGxlcy5cbiAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGFzIGEgZGlyZWN0IGZzIGNhbGwgZm9yIHBlcmZvcm1hbmNlLWNyaXRpY2FsXG4gICAgICAvLyBtZXRhZGF0YSBleHRyYWN0aW9uIHRoYXQgb25seSBuZWVkcyB0aGUgWUFNTCBmcm9udG1hdHRlci5cbiAgICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogVXNlIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgYWxsb2NhdGluZyBuZXcgYnVmZmVyIGVhY2ggdGltZVxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmQucmVhZChidWZmZXIsIDAsIDQwOTYsIDApO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVzdWx0LmJ5dGVzUmVhZCkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb29rIGZvciBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAgLy8gU3VwcG9ydCBib3RoIFVuaXggKFxcbikgYW5kIFdpbmRvd3MgKFxcclxcbikgbGluZSBlbmRpbmdzXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaGVhZGVyLm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyBmcm9udG1hdHRlciBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJzZSB0aGUgWUFNTCBmcm9udG1hdHRlciBzYWZlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVggKElzc3VlICMxMjI4KTogRW5hYmxlIHZhbGlkYXRlQ29udGVudCB0byBibG9jayB6ZXJvLXdpZHRoIFVuaWNvZGUgYW5kIG90aGVyIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgICAgICAvLyBTZWN1cmVZYW1sUGFyc2VyIHByb3ZpZGVzIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiwgaW5qZWN0aW9uIHByZXZlbnRpb24sIGFuZCBjb250ZW50IHNhbml0aXphdGlvblxuICAgICAgICAgIC8vIEl0IGV4cGVjdHMgZnVsbCBZQU1MIHdpdGggLS0tIG1hcmtlcnMsIHNvIHdlIHJlY29uc3RydWN0IHRoZSBmcm9udG1hdHRlciBibG9ja1xuICAgICAgICAgIC8vIFdlIGRpc2FibGUgZmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBhcyB0aGlzIGlzIGdlbmVyYWwgbWV0YWRhdGEgcGFyc2luZywgbm90IHBlcnNvbmEtc3BlY2lmaWNcbiAgICAgICAgICAvLyBidXQgd2UgTVVTVCBrZWVwIHZhbGlkYXRlQ29udGVudDogdHJ1ZSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnNcbiAgICAgICAgICBjb25zdCBmdWxsWWFtbCA9IGAtLS1cXG4ke21hdGNoWzFdfVxcbi0tLWA7XG4gICAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxZYW1sLCB7XG4gICAgICAgICAgICAvLyBSRVFVSVJFRDogdmFsaWRhdGVDb250ZW50IG11c3QgYmUgdHJ1ZSB0byBlbmFibGUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIGluY2x1ZGluZ1xuICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uIChVKzIwMEItVSsyMDBGLCBVK0ZFRkYsIGV0Yy4pLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2VcbiAgICAgICAgICAgIC8vIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgZm9yIFVuaWNvZGUtYmFzZWQgYXR0YWNrcy5cbiAgICAgICAgICAgIC8vIFNlZSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGZvciBkZXRlY3Rpb24gbG9naWMuXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAvLyBGaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGlzIG9wdGlvbmFsIGZvciBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0U6IENhY2hlIHRoZSBtZXRhZGF0YSB3aXRoIGZpbGUgc3RhdHMgZm9yIGZ1dHVyZSByZWFkc1xuICAgICAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnICYmIG1ldGFkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICBjb25zdCBjYWNoZUVudHJ5OiBNZXRhZGF0YUNhY2hlRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbXRpbWU6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ1JJVElDQUwgTUVNT1JZIExFQUsgRklYOiBNb3JlIGFnZ3Jlc3NpdmUgY2FjaGUgbWFuYWdlbWVudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0cyBhbmQganVzdCB1cGRhdGUgaXQgaW5zdGVhZCBvZiBhZGRpbmcgbmV3XG4gICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbnRyeSAtIG5vIGV2aWN0aW9uIG5lZWRlZFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFVwZGF0ZWQgZXhpc3RpbmcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IGVudHJ5IC0gY2hlY2sgaWYgd2UgbmVlZCB0byBldmljdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIFVzZSA+IGluc3RlYWQgb2YgPj0gdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBNQVhfQ0FDSEVfU0laRVxuICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSA+PSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNb3JlIGFnZ3Jlc3NpdmUgZXZpY3Rpb246IHJlbW92ZSBlbm91Z2ggZW50cmllcyB0byBzdGF5IHdlbGwgdW5kZXIgbGltaXRcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXNUb0V2aWN0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFICogMC40KSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXlzVG9FdmljdCA9IEFycmF5LmZyb20oRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmtleXMoKSkuc2xpY2UoMCwgZW50cmllc1RvRXZpY3QpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvRXZpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXZpY3RlZCAke2tleXNUb0V2aWN0Lmxlbmd0aH0gY2FjaGUgZW50cmllcyB0byBtYW5hZ2UgbWVtb3J5IChjYWNoZSBzaXplIHdhcyAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplICsga2V5c1RvRXZpY3QubGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWRkZWQgbmV3IGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofSAoY2FjaGUgc2l6ZSBub3c6ICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemV9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIGVycm9ycywgcmV0dXJuIG1ldGFkYXRhIGFueXdheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgLy8gSW52YWxpZCBZQU1MLCByZXR1cm4gbnVsbFxuICAgICAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjb25zdCB5YW1sRXJyb3JUeXBlID0gKHlhbWxFcnJvciBhcyBhbnkpPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnWUFNTEVycm9yJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBJbnZhbGlkIFlBTUwgaW4gJHtmaWxlUGF0aH06ICR7eWFtbEVycm9yVHlwZX0gLSAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBFbnN1cmUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBhbmQgYnVmZmVyIGlzIHJlbGVhc2VkIGluIEFMTCBwYXRoc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvciBmb3IgJHtmaWxlUGF0aH06ICR7Y2xvc2VFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQRVJGT1JNQU5DRTogUmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgICAgICB0aGlzLnJlbGVhc2VCdWZmZXIoYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGluIGRlYnVnIGxvZ3MgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnVW5rbm93bkVycm9yJztcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlIHx8ICdOT19DT0RFJztcbiAgICAgIFxuICAgICAgLy8gUkVMSUFCSUxJVFk6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBpZiAocmV0cmllcyA+IDAgJiYgKGVycm9yQ29kZSA9PT0gJ0VCVVNZJyB8fCBlcnJvckNvZGUgPT09ICdFQUdBSU4nKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBSZXRyeWluZyByZWFkIGZvciAke2ZpbGVQYXRofSBhZnRlciAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9YCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpOyAvLyBCcmllZiBkZWxheSBiZWZvcmUgcmV0cnlcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCwgcmV0cmllcyAtIDEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3QgcmVhZCBtZXRhZGF0YSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9IC0gJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGUgaXMgYSBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGJhc2VkIG9uIG1ldGFkYXRhXG4gICAqIFRoaXMgcmVwbGFjZXMgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gd2l0aCBhY2N1cmF0ZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBjb250YWlucyBfZG9sbGhvdXNlTUNQVGVzdDogdHJ1ZSBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaXNUZXN0ID0gISEobWV0YWRhdGEgJiYgbWV0YWRhdGEuX2RvbGxob3VzZU1DUFRlc3QgPT09IHRydWUpO1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVybiBpc1Rlc3Q7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHdlIGNhbid0IHJlYWQgdGhlIG1ldGFkYXRhLCBhc3N1bWUgaXQncyBub3QgYSB0ZXN0IGZpbGVcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNoZWNraW5nIHRlc3QgbWV0YWRhdGEgZm9yICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgaWYgd2UncmUgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGJ5IGNoZWNraW5nIGZvciBwcm9kdWN0aW9uIGluZGljYXRvcnNcbiAgICogVXNlcyBhIGNvbmZpZGVuY2UtYmFzZWQgYXBwcm9hY2ggcmVxdWlyaW5nIG11bHRpcGxlIGluZGljYXRvcnMgZm9yIGJldHRlciBhY2N1cmFjeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYXBwZWFycyB0byBiZSBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxsb3cgdGVzdHMgdG8gZXhwbGljaXRseSBvdmVycmlkZSBwcm9kdWN0aW9uIG1vZGUgZGV0ZWN0aW9uXG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXZWlnaHRlZCBpbmRpY2F0b3JzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvblxuICAgIGNvbnN0IGluZGljYXRvcnMgPSB7XG4gICAgICAvLyBTdHJvbmcgaW5kaWNhdG9ycyAod2VpZ2h0OiAyKVxuICAgICAgaGFzVXNlckhvbWVEaXI6IChwcm9jZXNzLmVudi5IT01FICYmIChwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvVXNlcnMvJykgfHwgcHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL2hvbWUvJykpKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAhIXByb2Nlc3MuZW52LlVTRVJQUk9GSUxFLFxuICAgICAgaXNQcm9kdWN0aW9uTm9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyxcbiAgICAgIG5vdEluVGVzdERpcjogKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGZvciBjcm9zcy1wbGF0Zm9ybSBjaGVja2luZyAoV2luZG93cyB1c2VzIFxcIGJ1dCBjaGVja3MgdXNlIC8pXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDd2QgPSBjd2QucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgIHJldHVybiAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3Rlc3QnKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvX190ZXN0c19fJykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3RlbXAnKSAmJlxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9kaXN0L3Rlc3QnKTtcbiAgICAgIH0pKCksXG4gICAgICBcbiAgICAgIC8vIE1vZGVyYXRlIGluZGljYXRvcnMgKHdlaWdodDogMSlcbiAgICAgIG5vdEluQ0k6ICFwcm9jZXNzLmVudi5DSSxcbiAgICAgIG5vVGVzdEVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIG5vRGV2RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHRlZCBzY29yZVxuICAgIGxldCBzY29yZSA9IDA7XG4gICAgaWYgKGluZGljYXRvcnMuaGFzVXNlckhvbWVEaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMuaXNQcm9kdWN0aW9uTm9kZSkgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJblRlc3REaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5DSSkgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub1Rlc3RFbnYpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9EZXZFbnYpIHNjb3JlICs9IDE7XG4gICAgXG4gICAgLy8gTG9nIGRldGVjdGlvbiBkZXRhaWxzIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3JzID0gT2JqZWN0LmVudHJpZXMoaW5kaWNhdG9ycylcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgXG4gICAgLy8gVFlQRVNDUklQVCBGSVg6IFJlbW92ZWQgbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgY2hlY2sgYXMgdGhpcyBtZXRob2QgZG9lc24ndCBleGlzdCBvbiBNQ1BMb2dnZXJcbiAgICAvLyBUaGUgbG9nZ2VyIGFscmVhZHkgaGFuZGxlcyBkZWJ1ZyBsZXZlbCBpbnRlcm5hbGx5LCBzbyB3ZSBjYW4gY2FsbCBkZWJ1ZygpIGRpcmVjdGx5XG4gICAgaWYgKHNjb3JlID49IDMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGVkJyxcbiAgICAgICAgeyBzY29yZSwgYWN0aXZlSW5kaWNhdG9ycywgZm9yY2VNb2RlOiAnbm90IHNldCcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVxdWlyZSBhIHNjb3JlIG9mIGF0IGxlYXN0IDMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uIChtb3JlIGNvbmZpZGVudClcbiAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBpbiBlZGdlIGNhc2VzIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgcmV0dXJuIHNjb3JlID49IDM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGFsbCBmaWxlcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgdG8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4gICAqIFNraXBzIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCB0byBwcmVzZXJ2ZSB1c2VyIG1vZGlmaWNhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nLCBlbGVtZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgY29waWVkQ291bnQgPSAwO1xuICAgIFxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5tYWtlRGlyZWN0b3J5KGRlc3REaXIpO1xuXG4gICAgICAvLyBSZWFkIHNvdXJjZSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5saXN0RGlyKHNvdXJjZURpcik7XG4gICAgICBcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNvcHkgbWFya2Rvd24gZmlsZXNcbiAgICAgICAgaWYgKCFmaWxlLmVuZHNXaXRoKEZJTEVfQ09OU1RBTlRTLkVMRU1FTlRfRVhURU5TSU9OKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3JtYWxpemUgZmlsZW5hbWUgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZSk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZEZpbGUuaXNWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgVW5pY29kZTogJHtmaWxlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgZmlsZSBwYXRocyB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgZmlsZXMgZnJvbSBlc2NhcGluZyB0aGUgaW50ZW5kZWQgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBzb3VyY2VWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChzb3VyY2VQYXRoLCBbc291cmNlRGlyXSk7XG4gICAgICAgIGNvbnN0IGRlc3RWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChkZXN0UGF0aCwgW2Rlc3REaXJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc291cmNlVmFsaWQgfHwgIWRlc3RWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBwYXRoOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBlbGVtZW50VHlwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBzYWZldHkgY2hlY2s6IEJsb2NrIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnRzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBpZiBsb2FkVGVzdERhdGEgaXMgZXhwbGljaXRseSBlbmFibGVkIChmb3IgdGVzdGluZyBzY2VuYXJpb3MpXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubG9hZFRlc3REYXRhICYmIHRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgIGNvbnN0IGlzRG9sbGhvdXNlVGVzdCA9IGF3YWl0IHRoaXMuaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChzb3VyY2VQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNEb2xsaG91c2VUZXN0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTRUNVUklUWTogQmxvY2tpbmcgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGJsb2NrZWQgdGVzdCBkYXRhXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdURVNUX0RBVEFfQkxPQ0tFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uTWV0aG9kOiAnbWV0YWRhdGEtYmFzZWQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgZGVzdEV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhkZXN0UGF0aCk7XG4gICAgICAgIGlmIChkZXN0RXhpc3RzKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBWYWxpZGF0ZSBzb3VyY2UgZmlsZSBiZWZvcmUgY29weWluZ1xuICAgICAgICAgIGNvbnN0IHNvdXJjZVN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIC8vIE5PVEU6IFVzaW5nIGRpcmVjdCBmcy5vcGVuIGZvciBjaHVua2VkL3N0cmVhbWluZyBmaWxlIHJlYWQuXG4gICAgLy8gRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBmaWxlIGhhbmRsZXMgZm9yIGNodW5rZWQgcmVhZGluZy5cbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkga2VwdCBhcyBhIGRpcmVjdCBmcyBjYWxsIGZvciBtZW1vcnktZWZmaWNpZW50XG4gICAgLy8gY2hlY2tzdW0gY2FsY3VsYXRpb24gb24gcG90ZW50aWFsbHkgbGFyZ2UgZmlsZXMuXG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcblxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuXG4gICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7XG4gICAgICAgICAgaGFzaC51cGRhdGUoYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChieXRlc1JlYWQgPiAwKTtcblxuICAgICAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgc3RyZWFtLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZmlsZSB3aXRoIGludGVncml0eSB2ZXJpZmljYXRpb24gYW5kIHJldHJ5IGxvZ2ljXG4gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFNvdXJjZSBmaWxlIHBhdGhcbiAgICogQHBhcmFtIGRlc3RQYXRoIERlc3RpbmF0aW9uIGZpbGUgcGF0aFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvcHkgZmFpbHMgYWZ0ZXIgYWxsIHJldHJ5IGF0dGVtcHRzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFZlcmlmaWNhdGlvbihzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVPcChzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNpemUgbWF0Y2hlc1xuICAgICAgICBjb25zdCBbc291cmNlU3RhdHMsIGRlc3RTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKVxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSBjaGVja3N1bSBtYXRjaGVzIGZvciBjb21wbGV0ZSBpbnRlZ3JpdHlcbiAgICAgICAgY29uc3QgW3NvdXJjZUNoZWNrc3VtLCBkZXN0Q2hlY2tzdW1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oc291cmNlUGF0aCksXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShkZXN0UGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNoZWNrc3VtICE9PSBkZXN0Q2hlY2tzdW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hlY2tzdW0gbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VDaGVja3N1bX0sIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RDaGVja3N1bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNobW9kRmlsZShkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyAtIGZpbGUgY29waWVkIGFuZCB2ZXJpZmllZFxuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdWNjZXNzZnVsbHkgY29waWVkIGFuZCB2ZXJpZmllZDogJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfWAsXG4gICAgICAgICAgeyBzaXplOiBzb3VyY2VTdGF0cy5zaXplLCBjaGVja3N1bTogc291cmNlQ2hlY2tzdW0uc3Vic3RyaW5nKDAsIDgpIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZU9wKGRlc3RQYXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGRpc2FibGVkXG4gICAgLy8gTm90ZTogVGhpcyBjaGVjayBpcyBuZWVkZWQgZXZlbiB0aG91Z2ggY29uc3RydWN0b3Igc2V0cyBjb25maWcsIGJlY2F1c2VcbiAgICAvLyBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgY29uc3RydWN0aW9uXG4gICAgXG4gICAgLy8gVXNlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHRoYXQgcmVzcGVjdHMgRk9SQ0VfUFJPRFVDVElPTl9NT0RFXG4gICAgY29uc3QgaXNEZXZlbG9wbWVudE1vZGUgPSAhdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpO1xuICAgIFxuICAgIGlmIChpc0RldmVsb3BtZW50TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlJyxcbiAgICAgICAgeyBcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIHJlYXNvbjogJ1Rlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyxcbiAgICAgICAgICBlbmFibGVXaXRoOiAnU2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlIHRvIGVuYWJsZSdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHNvdXJjZURpckV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhzb3VyY2VEaXIpO1xuICAgICAgaWYgKCFzb3VyY2VEaXJFeGlzdHMpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY29weWluZyAke2VsZW1lbnRUeXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICh0b3RhbENvcGllZCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50KHMpYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBicmVha2Rvd246IGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHN1Y2Nlc3NmdWwgcG9wdWxhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX1BPUFVMQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudHNgLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gbmV3IGVsZW1lbnRzIHRvIGNvcHkgLSBwb3J0Zm9saW8gbWF5IGFscmVhZHkgaGF2ZSBjb250ZW50Jyk7XG4gICAgfVxuICB9XG59Il19
1031
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztB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LFlBQVk7YUFDeEIsQ0FDRixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDBDQUEwQztnQkFDbEQsT0FBTyxFQUFFLHlDQUF5QyxXQUFXLG1CQUFtQjtnQkFDaEYsUUFBUSxFQUFFO29CQUNSLGdCQUFnQjtvQkFDaEIsT0FBTztvQkFDUCxZQUFZO2lCQUNiO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgLSBQb3B1bGF0ZXMgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICogXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgY29weWluZyBkZWZhdWx0IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzXG4gKiBmcm9tIHRoZSBOUE0gcGFja2FnZSBvciBHaXQgcmVwb3NpdG9yeSB0byB0aGUgdXNlcidzIHBvcnRmb2xpbyBvbiBmaXJzdCBydW4uXG4gKiBJdCBlbnN1cmVzIHVzZXJzIGhhdmUgZXhhbXBsZSBjb250ZW50IHRvIHdvcmsgd2l0aCBpbW1lZGlhdGVseSBhZnRlciBpbnN0YWxsYXRpb24uXG4gKi9cblxuLy8gTk9URTogZnNTeW5jIGlzIGludGVudGlvbmFsbHkga2VwdCBmb3Igc3luY2hyb25vdXMgZGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb24gYXQgbW9kdWxlIGxvYWQgdGltZS5cbi8vIFRoZSBJU19ERVZFTE9QTUVOVF9NT0RFIGNoZWNrIHJ1bnMgZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbiBiZWZvcmUgYXN5bmMgb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlLlxuLy8gQWxsIG90aGVyIGZpbGUgb3BlcmF0aW9ucyB1c2UgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBjZW50cmFsaXplZCwgc2VjdXJlIGZpbGUgaGFuZGxpbmcuXG5pbXBvcnQgKiBhcyBmc1N5bmMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuXG4vLyBGaWxlIG9wZXJhdGlvbiBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBGSUxFX0NPTlNUQU5UUyA9IHtcbiAgRUxFTUVOVF9FWFRFTlNJT046ICcubWQnLFxuICBZQU1MX0VYVEVOU0lPTjogJy55YW1sJyxcbiAgWU1MX0VYVEVOU0lPTjogJy55bWwnLFxuICBKU09OX0VYVEVOU0lPTjogJy5qc29uJyxcbiAgTUFYX0ZJTEVfU0laRTogMTAgKiAxMDI0ICogMTAyNCwgLy8gMTBNQiBtYXggZmlsZSBzaXplIGZvciBzYWZldHlcbiAgQ0hFQ0tTVU1fQUxHT1JJVEhNOiAnc2hhMjU2JyxcbiAgRklMRV9QRVJNSVNTSU9OUzogMG82NDQsXG4gIENIVU5LX1NJWkU6IDY0ICogMTAyNCAvLyA2NEtCIGNodW5rcyBmb3IgcmVhZGluZyBsYXJnZSBmaWxlc1xufSBhcyBjb25zdDtcblxuLy8gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb25cbi8vIFdoZW4gcnVubmluZyBmcm9tIGEgZ2l0IGNsb25lLCB3ZSBkb24ndCB3YW50IHRvIGF1dG8tbG9hZCB0ZXN0IGRhdGFcbmNvbnN0IElTX0RFVkVMT1BNRU5UX01PREUgPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgZ2l0IHJlcG9zaXRvcnkgKGRldmVsb3BtZW50IG1vZGUpXG4gICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gICAgcmV0dXJuIGZzU3luYy5leGlzdHNTeW5jKGdpdERpcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSkoKTtcblxuLy8gSW50ZXJuYWwgY29uc3RhbnRzXG5jb25zdCBDT1BZX1JFVFJZX0FUVEVNUFRTID0gMztcbmNvbnN0IENPUFlfUkVUUllfREVMQVkgPSAxMDA7IC8vIG1zXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZyB7XG4gIC8qKiBDdXN0b20gZGF0YSBkaXJlY3RvcnkgcGF0aHMgdG8gc2VhcmNoIChjaGVja2VkIGJlZm9yZSBkZWZhdWx0IHBhdGhzKSAqL1xuICBjdXN0b21EYXRhUGF0aHM/OiBzdHJpbmdbXTtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGhzIGFmdGVyIGN1c3RvbSBwYXRocyAqL1xuICB1c2VEZWZhdWx0UGF0aHM/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBsb2FkIHRlc3QvZXhhbXBsZSBkYXRhIGZyb20gcmVwb3NpdG9yeSAoZGVmYXVsdDogZmFsc2UgaW4gZGV2IG1vZGUpICovXG4gIGxvYWRUZXN0RGF0YT86IGJvb2xlYW47XG4gIC8qKiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGNlbnRyYWxpemVkIGZpbGUgb3BlcmF0aW9ucyAqL1xuICBmaWxlT3BlcmF0aW9ucz86IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG59XG5cbi8vIFBFUkZPUk1BTkNFOiBNZXRhZGF0YSBjYWNoZSB3aXRoIG10aW1lLWJhc2VkIGludmFsaWRhdGlvblxuaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVFbnRyeSB7XG4gIG1ldGFkYXRhOiBhbnk7XG4gIG10aW1lOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFbGVtZW50UHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9fZGlybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZWREYXRhRGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9wdWxhdGVJblByb2dyZXNzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM/OiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcml2YXRlIHN0YXRpYyBsb2dMaXN0ZW5lcj86IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4gIHN0YXRpYyBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTjogQ2FjaGUgbWV0YWRhdGEgd2l0aCBmaWxlIG10aW1lIGZvciBpbnZhbGlkYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgbWV0YWRhdGFDYWNoZTogTWFwPHN0cmluZywgTWV0YWRhdGFDYWNoZUVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0NBQ0hFX1NJWkUgPSAyMDsgLy8gTUVNT1JZIExFQUsgRklYOiBGdXJ0aGVyIHJlZHVjZWQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBkdXJpbmcgcGVyZm9ybWFuY2UgdGVzdHNcblxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnKSB7XG4gICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICB0aGlzLl9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcblxuICAgIC8vIFN0b3JlIGZpbGVPcGVyYXRpb25zIHNlcnZpY2UgaWYgcHJvdmlkZWRcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gY29uZmlnPy5maWxlT3BlcmF0aW9ucztcbiAgICBcbiAgICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgdGVzdCBkYXRhIGxvYWRpbmdcbiAgICBjb25zdCBlbnZMb2FkVGVzdERhdGEgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE7XG4gICAgY29uc3QgbG9hZFRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ3RydWUnIHx8IGVudkxvYWRUZXN0RGF0YSA9PT0gJzEnO1xuICAgIGNvbnN0IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPSBlbnZMb2FkVGVzdERhdGEgPT09ICdmYWxzZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMCc7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gZGV2ZWxvcG1lbnQgbW9kZSAod2l0aCByZXNwZWN0IHRvIEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSlcbiAgICBjb25zdCBpc0Rldk1vZGUgPSAoKCkgPT4ge1xuICAgICAgLy8gUmVzcGVjdCBGT1JDRV9QUk9EVUNUSU9OX01PREUgb3ZlcnJpZGUgZmlyc3RcbiAgICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvcmNlIHByb2R1Y3Rpb24gbW9kZVxuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRm9yY2UgZGV2ZWxvcG1lbnQgbW9kZVxuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIGdpdCBkZXRlY3Rpb25cbiAgICAgIHJldHVybiBJU19ERVZFTE9QTUVOVF9NT0RFO1xuICAgIH0pKCk7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIGxvYWRUZXN0RGF0YSB2YWx1ZVxuICAgIGxldCBjb21wdXRlZExvYWRUZXN0RGF0YTogYm9vbGVhbjtcbiAgICBpZiAobG9hZFRlc3REYXRhRnJvbUVudikge1xuICAgICAgLy8gRW52aXJvbm1lbnQgZXhwbGljaXRseSBlbmFibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGlzYWJsZVRlc3REYXRhRnJvbUVudikge1xuICAgICAgLy8gRW52aXJvbm1lbnQgZXhwbGljaXRseSBkaXNhYmxlcyB0ZXN0IGRhdGFcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgbG9naWM6IGVuYWJsZSBpbiBwcm9kdWN0aW9uLCBkaXNhYmxlIGluIGRldmVsb3BtZW50IHVubGVzcyBjb25maWcgb3ZlcnJpZGVzXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9ICFpc0Rldk1vZGUgJiYgKGNvbmZpZz8ubG9hZFRlc3REYXRhID8/IHRydWUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHVzZURlZmF1bHRQYXRoczogdHJ1ZSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIC8vIEFwcGx5IGZpbmFsIGxvYWRUZXN0RGF0YSBsb2dpYyAtIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGV2ZWxvcG1lbnQgbW9kZSB0YWtlIHByZWNlZGVuY2VcbiAgICAgIGxvYWRUZXN0RGF0YTogbG9hZFRlc3REYXRhRnJvbUVudiA/IHRydWUgOiBkaXNhYmxlVGVzdERhdGFGcm9tRW52ID8gZmFsc2UgOiBjb21wdXRlZExvYWRUZXN0RGF0YVxuICAgIH07XG4gICAgXG4gICAgaWYgKGlzRGV2TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIERldmVsb3BtZW50IG1vZGUgZGV0ZWN0ZWQgLSB0ZXN0IGRhdGEgbG9hZGluZyBkaXNhYmxlZCcpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBUbyBlbmFibGUgdGVzdCBkYXRhLCBzZXQgRE9MTEhPVVNFX0xPQURfVEVTVF9EQVRBPXRydWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBidW5kbGVkIGVsZW1lbnQgaGFzaGVzIHdpdGggQ29udGVudFZhbGlkYXRvciBzbyB2ZXJpZmllZCBidW5kbGVkXG4gICAgLy8gY29udGVudCBkb2VzIG5vdCB0cmlnZ2VyIGZhbHNlLXBvc2l0aXZlIENSSVRJQ0FMIGluamVjdGlvbiBhbGVydHMgYXQgc3RhcnR1cC5cbiAgICB0aGlzLnJlZ2lzdGVyQnVuZGxlZEhhc2hlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgZGF0YS9IQVNIRVMuanNvbiAoc2hpcHBlZCB3aXRoIHRoZSBucG0gcGFja2FnZSkgYW5kIHJlZ2lzdGVyIGVhY2hcbiAgICogU0hBLTI1NiBoYXNoIHdpdGggQ29udGVudFZhbGlkYXRvciBhcyB0cnVzdGVkIGJ1bmRsZWQgY29udGVudC5cbiAgICpcbiAgICogT25seSBmaWxlcyB3aG9zZSBvbi1kaXNrIGhhc2ggbWF0Y2hlcyB0aGUgbWFuaWZlc3QgZW50cnkgYXJlIHJlZ2lzdGVyZWQg4oCUXG4gICAqIGFueSBwb3N0LWluc3RhbGwgbW9kaWZpY2F0aW9uIGJyZWFrcyB0aGUgaGFzaCBhbmQgcmV2b2tlcyB0cnVzdCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJ1bmRsZWRIYXNoZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhc2hlc1BhdGggPSBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLicsICdkYXRhJywgJ0hBU0hFUy5qc29uJyk7XG4gICAgICBjb25zdCByYXcgPSBmc1N5bmMucmVhZEZpbGVTeW5jKGhhc2hlc1BhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgbWFuaWZlc3Q6IHsgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGNvbnN0IGRhdGFEaXIgPSBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLicsICdkYXRhJyk7XG4gICAgICBsZXQgcmVnaXN0ZXJlZCA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgW3JlbFBhdGgsIGV4cGVjdGVkSGFzaF0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QuZmlsZXMpKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRhdGFEaXIsIHJlbFBhdGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmc1N5bmMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoKTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgICAgaWYgKGFjdHVhbEhhc2ggPT09IGV4cGVjdGVkSGFzaCkge1xuICAgICAgICAgICAgQ29udGVudFZhbGlkYXRvci5yZWdpc3RlckJ1bmRsZWRIYXNoKGV4cGVjdGVkSGFzaCk7XG4gICAgICAgICAgICByZWdpc3RlcmVkKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQnVuZGxlZCBmaWxlIGhhc2ggbWlzbWF0Y2gg4oCUIHRyZWF0aW5nIGFzIHVudHJ1c3RlZDogJHtyZWxQYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmlsZSBtaXNzaW5nIGZyb20gdGhpcyBidWlsZCdzIGRhdGEvIOKAlCBza2lwIHNpbGVudGx5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUmVnaXN0ZXJlZCAke3JlZ2lzdGVyZWR9IHZlcmlmaWVkIGJ1bmRsZWQgZWxlbWVudCBoYXNoZXNgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEhBU0hFUy5qc29uIG1pc3NpbmcgKG9sZGVyIGluc3RhbGwsIGRldiBtb2RlLCBvciBzdHJpcHBlZCBwYWNrYWdlKSDigJQgZGVncmFkZSBncmFjZWZ1bGx5XG4gICAgICBsb2dnZXIuZGVidWcoJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBkYXRhL0hBU0hFUy5qc29uIG5vdCBmb3VuZCDigJQgYnVuZGxlZCBlbGVtZW50IHRydXN0IHNraXBwZWQnKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9hZFRlc3REYXRhIGNvbmZpZ3VyYXRpb24gdmFsdWVcbiAgICogQHJldHVybnMgV2hldGhlciB0ZXN0IGRhdGEgbG9hZGluZyBpcyBlbmFibGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVGVzdERhdGFMb2FkaW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubG9hZFRlc3REYXRhID8/IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIHN5c3RlbSBpcyBpbiBkZXZlbG9wbWVudCBtb2RlXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGV2ZWxvcG1lbnRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJU19ERVZFTE9QTUVOVF9NT0RFO1xuICB9XG5cbiAgLy8gPT09PT0gSEVMUEVSIE1FVEhPRFMgRk9SIEZJTEUgT1BFUkFUSU9OUyA9PT09PVxuICAvLyBUaGVzZSBtZXRob2RzIHByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIGZpbGVPcGVyYXRpb25zIGlzIG5vdCBpbmplY3RlZFxuICAvLyBhbmQgY2VudHJhbGl6ZSBhbGwgZmlsZSBzeXN0ZW0gY2FsbHMgdGhyb3VnaCBGaWxlT3BlcmF0aW9uc1NlcnZpY2Ugd2hlbiBhdmFpbGFibGVcblxuICBwcml2YXRlIGFzeW5jIHN0YXRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGZzU3luYy5TdGF0cz4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGZpbGVQYXRoKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2s6IGltcG9ydCBmcy9wcm9taXNlcyBkeW5hbWljYWxseSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgcmV0dXJuIGZzLnN0YXQoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsaXN0RGlyKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShkaXJQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsZUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShkaXJQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVPcChzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY29weUZpbGUoc291cmNlUGF0aCwgZGVzdFBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RmlsZU9wJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaG1vZEZpbGUoZmlsZVBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKGZpbGVQYXRoLCBtb2RlLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2htb2RGaWxlJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMuY2htb2QoZmlsZVBhdGgsIG1vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVGaWxlT3AoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGZpbGVQYXRoLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5kZWxldGVGaWxlT3AnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkRmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZpbGVQYXRoLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucmVhZEZpbGVDb250ZW50J1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgfVxuXG4gIC8vID09PT09IEVORCBIRUxQRVIgTUVUSE9EUyA9PT09PVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGF0aHMgZm9yIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICogT3JkZXJlZCBieSBwcmlvcml0eSAtIGN1c3RvbSBwYXRocyBmaXJzdCwgdGhlbiBkZXZlbG9wbWVudC9naXQsIHRoZW4gTlBNIGxvY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZGF0YVNlYXJjaFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIHBhdGhzIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpIHtcbiAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGRlZmF1bHQgcGF0aHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZy51c2VEZWZhdWx0UGF0aHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTa2lwIGRldmVsb3BtZW50L3JlcG9zaXRvcnkgZGF0YSBwYXRocyB1bmxlc3MgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgICAvLyBEZXZlbG9wbWVudC9HaXQgaW5zdGFsbGF0aW9uIChyZWxhdGl2ZSB0byB0aGlzIGZpbGUpXG4gICAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vZGF0YScpLFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uLy4uL2RhdGEnKSxcbiAgICAgICAgICAvLyBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChsYXN0IHJlc29ydClcbiAgICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2RhdGEnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgaW5jbHVkZSBOUE0gaW5zdGFsbGF0aW9uIHBhdGhzICh0aGVzZSB3b3VsZCBoYXZlIHByb2R1Y3Rpb24gZGF0YSlcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gbWFjT1MgSG9tZWJyZXdcbiAgICAgICAgJy9vcHQvaG9tZWJyZXcvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIHN0YW5kYXJkIFVuaXgvTGludXhcbiAgICAgICAgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgICcvdXNyL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93cyB3aXRoIG52bVxuICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCAnJywgJ25wbScsICdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJywgJ2RhdGEnKVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBieSBjaGVja2luZyBlYWNoIHNlYXJjaCBwYXRoXG4gICAqIFVzZXMgUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmREYXRhRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpcjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIHBhdGhzIGluIHBhcmFsbGVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBjaGVja1Byb21pc2VzID0gdGhpcy5kYXRhU2VhcmNoUGF0aHMubWFwKGFzeW5jIChzZWFyY2hQYXRoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoc2VhcmNoUGF0aCk7XG4gICAgICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgLy8gVmVyaWZ5IGl0IGNvbnRhaW5zIGV4cGVjdGVkIHN1YmRpcmVjdG9yaWVzXG4gICAgICAgICAgY29uc3QgaGFzUGVyc29uYXMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3BlcnNvbmFzJykpO1xuICAgICAgICAgIGNvbnN0IGhhc1NraWxscyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAnc2tpbGxzJykpO1xuICAgICAgICAgIGlmIChoYXNQZXJzb25hcyB8fCBoYXNTa2lsbHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIGFjY2Vzc2VkXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjaGVja1Byb21pc2VzKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdFxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBGb3VuZCBkYXRhIGRpcmVjdG9yeSBhdDogJHtyZXN1bHQudmFsdWV9YCk7XG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIud2FybignW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgaW4gYW55IHNlYXJjaCBwYXRoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gY2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKGRpclBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpbGUgcGF0aCB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBmaWxlIHBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IGRpcmVjdG9yeSB0cmF2ZXJzYWxcbiAgICogUHJldmlvdXNseTogRmlsZSBwYXRocyB3ZXJlIHVzZWQgd2l0aG91dCB2YWxpZGF0aW9uLCBhbGxvd2luZyBwb3RlbnRpYWwgLi4vLi4vLi4vIGF0dGFja3NcbiAgICogTm93OiBTdHJpY3QgdmFsaWRhdGlvbiBlbnN1cmVzIHBhdGhzIHN0YXkgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFRoZSBmaWxlIHBhdGggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIGFsbG93ZWRCYXNlUGF0aHMgQXJyYXkgb2YgYWxsb3dlZCBiYXNlIHBhdGhzIChvcHRpb25hbClcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwYXRoIGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGFsbG93ZWRCYXNlUGF0aHM/OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTRUNVUklUWTogTm9ybWFsaXplIHBhdGggdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IHBhdGhzIGNvbnRhaW5pbmcgdHJhdmVyc2FsIHBhdHRlcm5zXG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IENoZWNrIGZvciBob21lIGRpcmVjdG9yeSBleHBhbnNpb24gYXR0ZW1wdHMsIGJ1dCBhbGxvdyBXaW5kb3dzIDguMyBzaG9ydCBwYXRoIG5hbWVzXG4gICAgICAvLyBXaW5kb3dzIHNob3J0IHBhdGggbmFtZXMgdXNlIH4gZm9sbG93ZWQgYnkgYSBkaWdpdCAoZS5nLiwgUlVOTkVSfjEpLCB3aGljaCBzaG91bGQgYmUgYWxsb3dlZFxuICAgICAgLy8gT25seSBibG9jayB+IGZvbGxvd2VkIGJ5IC8gb3IgXFwgKGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBwYXR0ZXJucylcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnfi8nKSB8fCBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnflxcXFwnKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0IGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IFJlamVjdCBhYnNvbHV0ZSBwYXRocyBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpICYmIGFsbG93ZWRCYXNlUGF0aHMpIHtcbiAgICAgICAgY29uc3QgaXNBbGxvd2VkID0gYWxsb3dlZEJhc2VQYXRocy5zb21lKGJhc2VQYXRoID0+IHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkQmFzZSA9IHBhdGgubm9ybWFsaXplKGJhc2VQYXRoKTtcbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkQmFzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEFic29sdXRlIHBhdGggb3V0c2lkZSBhbGxvd2VkIGRpcmVjdG9yaWVzOiAke2ZpbGVQYXRofWApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IG51bGwgYnl0ZXMgYW5kIG90aGVyIGRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xcMCcpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCdcXHgwMCcpKSB7IC8vIE5PU09OQVIgLSBOdWxsIGJ5dGUgZGV0ZWN0aW9uIGZvciBzZWN1cml0eVxuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE51bGwgYnl0ZSBpbiBwYXRoIGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUGF0aCB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIERFUFJFQ0FURUQ6IENvbW1lbnRlZCBvdXQgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gLSByZXBsYWNlZCB3aXRoIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvblxuICAvKipcbiAgICogQ2FjaGVkIGNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqL1xuICAvLyBwcml2YXRlIHN0YXRpYyBjb21waWxlZFRlc3RQYXR0ZXJuczogUmVnRXhwW10gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogR2V0IGNvbXBpbGVkIHRlc3QgcGF0dGVybnMgd2l0aCBjYWNoaW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zXG4gICAqL1xuICAvLyBwcml2YXRlIGdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk6IFJlZ0V4cFtdIHtcbiAgLy8gICAvLyBVc2UgY2FjaGVkIHBhdHRlcm5zIGlmIGF2YWlsYWJsZVxuICAvLyAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zKSB7XG4gIC8vICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucztcbiAgLy8gICB9XG4gIC8vICAgXG4gIC8vICAgLy8gQ29tcGlsZSBhbmQgY2FjaGUgcGF0dGVybnMgb24gZmlyc3QgdXNlXG4gIC8vICAgLy8gQ1JJVElDQUwgRklYOiBSZW1vdmVkIG92ZXJseSBicm9hZCAvXnRlc3QtL2kgcGF0dGVybiB0aGF0IHdhcyBibG9ja2luZyBsZWdpdGltYXRlIHVzZVxuICAvLyAgIC8vIFVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBwZXJzb25hcyBsaWtlIFwidGVzdC1kcml2ZW4tZGV2ZWxvcGVyXCIgb3IgXCJ0ZXN0LWF1dG9tYXRpb24tZXhwZXJ0XCJcbiAgLy8gICAvLyBXZSBvbmx5IGJsb2NrIHNwZWNpZmljIHRlc3QgcGF0dGVybnMgdGhhdCBhcmUgY2xlYXJseSBmcm9tIG91ciB0ZXN0IHN1aXRlXG4gIC8vICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucyA9IFtcbiAgLy8gICAgIC9edGVzdHBlcnNvbmEvaSwgICAgICAgICAgICAgIC8vIE91ciB0ZXN0IHN1aXRlIHBhdHRlcm5cbiAgLy8gICAgIC9eeWFtbHRlc3QvaSwgICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL155YW1sYm9tYi9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXm1lbW9yeS10ZXN0LS9pLCAgICAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ecGVyZi10ZXN0LS9pLCAgICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL150ZXN0LWZpeHR1cmUtL2ksICAgICAgICAgICAgLy8gVGVzdCBmaXh0dXJlIHBhdHRlcm4gKG1vcmUgc3BlY2lmaWMpXG4gIC8vICAgICAvXnRlc3QtZGF0YS0vaSwgICAgICAgICAgICAgICAvLyBUZXN0IGRhdGEgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9iaW4tc2h8cm0tcmZ8cHduZWQvaSwgICAgICAgIC8vIE1hbGljaW91cyBwYXR0ZXJuc1xuICAvLyAgICAgL2NvbmN1cnJlbnQtXFxkKy9pLCAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvbGVnYWN5XFwubWQkL2ksICAgICAgICAgICAgICAgLy8gTGVnYWN5IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL3BlcmZvcm1hbmNlLXRlc3QvaSwgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvLVxcZHsxM30tW2EtejAtOV0rXFwubWQkL2ksICAgIC8vIFRpbWVzdGFtcC1iYXNlZCB0ZXN0IGZpbGVzXG4gIC8vICAgICAvXnVuaXR0ZXN0LS9pLCAgICAgICAgICAgICAgICAvLyBVbml0IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15pbnRlZ3JhdGlvbnRlc3QtL2ksICAgICAgICAgLy8gSW50ZWdyYXRpb24gdGVzdCBwYXR0ZXJuXG4gIC8vICAgXTtcbiAgLy8gICBcbiAgLy8gICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGVuYW1lIG1hdGNoZXMgdGVzdCBkYXRhIHBhdHRlcm5zIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGNvcGllZCB0byBwcm9kdWN0aW9uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KCkgZm9yIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IHBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGJsb2NrZWRcbiAgICovXG4gIC8vIHByaXZhdGUgaXNUZXN0RGF0YVBhdHRlcm4oZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5nZXRDb21waWxlZFRlc3RQYXR0ZXJucygpO1xuICAvLyAgIHJldHVybiBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KGZpbGVuYW1lKSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogUmVhZCBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXIgb25seSAobmV2ZXIgcmVhZHMgY29udGVudCBib2R5KVxuICAgKiBVc2VzIGEgc21hbGwgYnVmZmVyIHRvIHNhZmVseSBleHRyYWN0IG9ubHkgdGhlIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gcmVhZCBtZXRhZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIFBhcnNlZCBtZXRhZGF0YSBvYmplY3Qgb3IgbnVsbCBpZiBubyBmcm9udG1hdHRlciBmb3VuZFxuICAgKi9cbiAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBSZXVzYWJsZSBidWZmZXIgcG9vbCB0byByZWR1Y2UgYWxsb2NhdGlvbnNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYnVmZmVyUG9vbDogQnVmZmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1BPT0xfU0laRSA9IDIwOyAvLyBNRU1PUlkgTEVBSyBGSVg6IFJlZHVjZWQgYnVmZmVyIHBvb2wgc2l6ZSB0byBtYXRjaCBjYWNoZSBzaXplIGZvciBjb25zaXN0ZW50IG1lbW9yeSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgc3RhdGljIGJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIFxuICBwcml2YXRlIGdldEJ1ZmZlcigpOiBCdWZmZXIge1xuICAgIC8vIFBFUkZPUk1BTkNFOiBUcmFjayBidWZmZXIgcG9vbCB1c2FnZSBmb3Igb3B0aW1pemF0aW9uIG1vbml0b3JpbmdcbiAgICBsZXQgYnVmZmVyID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnBvcCgpO1xuICAgIGlmIChidWZmZXIpIHtcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmhpdHMrKztcbiAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcysrO1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQwOTYpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ3JlYXRlZCBuZXcgYnVmZmVyIChwb29sIGVtcHR5KSwgdG90YWwgY3JlYXRlZDogJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkfWApO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgcmVsZWFzZUJ1ZmZlcihidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENSSVRJQ0FMIEZJWDogQWx3YXlzIGF0dGVtcHQgdG8gcmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoIDwgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFKSB7XG4gICAgICBidWZmZXIuZmlsbCgwKTsgLy8gU0VDVVJJVFk6IENsZWFyIGJ1ZmZlciBiZWZvcmUgcmV1c2UgdG8gcHJldmVudCBkYXRhIGxlYWthZ2VcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5wdXNoKGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBFUkZPUk1BTkNFOiBJZiBwb29sIGlzIGZ1bGwsIGNsZWFyIHRoZSBidWZmZXIgdG8gaGVscCBHQ1xuICAgICAgYnVmZmVyLmZpbGwoMCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBCdWZmZXIgcG9vbCBmdWxsLCBkaXNjYXJkaW5nIGJ1ZmZlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBidWZmZXIgcG9vbCBhbmQgY2FjaGUgdG8gZnJlZSBtZW1vcnlcbiAgICogUEVSRk9STUFOQ0UgRklYOiBBZGRlZCBjbGVhbnVwIG1ldGhvZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duIG9yIHBlcmlvZGljIGNsZWFudXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBidWZmZXIgcG9vbFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPSAwO1xuICAgIFxuICAgIC8vIENsZWFyIG1ldGFkYXRhIGNhY2hlXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgLy8gQ2xlYXIgY2FjaGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyID0gbnVsbDtcbiAgICBcbiAgICAvLyBDbGVhciBwb3B1bGF0aW9uIHByb21pc2VzXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuY2xlYXIoKTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE1lbW9yeSBjbGVhbnVwIGNvbXBsZXRlZCcsIHtcbiAgICAgIGJ1ZmZlclN0YXRzOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyxcbiAgICAgIGNhY2hlQ2xlYXJlZDogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRzXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgY3JlYXRlZDogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGZvciBtb25pdG9yaW5nXG4gICAqIFBFUkZPUk1BTkNFIE1PTklUT1JJTkc6IEFkZGVkIHN0YXRpc3RpY3MgbWV0aG9kIGZvciBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgKiBUaGlzIHByb3ZpZGVzIGluc2lnaHRzIGludG8gYnVmZmVyIHBvb2wgZWZmaWNpZW5jeSBhbmQgY2FjaGUgcGVyZm9ybWFuY2VcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRQZXJmb3JtYW5jZVN0YXRzKCk6IHtcbiAgICBidWZmZXJQb29sOiB7XG4gICAgICBoaXRzOiBudW1iZXI7XG4gICAgICBtaXNzZXM6IG51bWJlcjsgXG4gICAgICBjcmVhdGVkOiBudW1iZXI7XG4gICAgICBoaXRSYXRlOiBudW1iZXI7XG4gICAgICBwb29sU2l6ZTogbnVtYmVyO1xuICAgICAgbWF4UG9vbFNpemU6IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgIG1heFNpemU6IG51bWJlcjtcbiAgICB9O1xuICB9IHtcbiAgICBjb25zdCBidWZmZXJIaXRzID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cztcbiAgICBjb25zdCBidWZmZXJNaXNzZXMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5taXNzZXM7XG4gICAgY29uc3QgdG90YWxSZXF1ZXN0cyA9IGJ1ZmZlckhpdHMgKyBidWZmZXJNaXNzZXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyUG9vbDoge1xuICAgICAgICBoaXRzOiBidWZmZXJIaXRzLFxuICAgICAgICBtaXNzZXM6IGJ1ZmZlck1pc3NlcyxcbiAgICAgICAgY3JlYXRlZDogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCxcbiAgICAgICAgaGl0UmF0ZTogdG90YWxSZXF1ZXN0cyA+IDAgPyBidWZmZXJIaXRzIC8gdG90YWxSZXF1ZXN0cyA6IDAsXG4gICAgICAgIHBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoLFxuICAgICAgICBtYXhQb29sU2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgICBzaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSxcbiAgICAgICAgbWF4U2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBvbmx5IHRoZSBZQU1MIGZyb250bWF0dGVyIG1ldGFkYXRhIGZyb20gYSBmaWxlIChmaXJzdCA0S0IpXG4gICAqXG4gICAqIFNFQ1VSSVRZIE5PVEUgKElzc3VlICMxMjI4KTogVGhpcyBtZXRob2QgTVVTVCB1c2UgdmFsaWRhdGVDb250ZW50OiB0cnVlIHdoZW4gY2FsbGluZ1xuICAgKiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkgdG8gZW5zdXJlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBydW5zLiBTZXR0aW5nIHZhbGlkYXRlQ29udGVudFxuICAgKiB0byBmYWxzZSB3b3VsZCBkaXNhYmxlIEFMTCBjb250ZW50IHZhbGlkYXRpb24gaW5jbHVkaW5nIHplcm8td2lkdGggY2hhcmFjdGVyIGRldGVjdGlvbixcbiAgICogY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgdnVsbmVyYWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkXG4gICAqIEBwYXJhbSByZXRyaWVzIC0gTnVtYmVyIG9mIHJldHJpZXMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMilcbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIHZhbGlkIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGg6IHN0cmluZywgcmV0cmllcyA9IDIpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICAvLyBQRVJGT1JNQU5DRTogQ2hlY2sgY2FjaGUgZmlyc3QgYmVmb3JlIHJlYWRpbmcgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBmaWxlUGF0aDtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5nZXQoY2FjaGVLZXkpO1xuXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIG1ldGFkYXRhIGlmIGZpbGUgaGFzbid0IGNoYW5nZWRcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGludGVnZXIgbXRpbWUgY29tcGFyaXNvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gaXNzdWVzXG4gICAgICBpZiAoY2FjaGVkICYmIE1hdGguZmxvb3IoY2FjaGVkLm10aW1lKSA9PT0gTWF0aC5mbG9vcihzdGF0cy5tdGltZU1zKSAmJiBjYWNoZWQuc2l6ZSA9PT0gc3RhdHMuc2l6ZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDYWNoZSBoaXQgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBjYWNoZWQubWV0YWRhdGE7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWQgd2l0aCBub3JtYWwgZmxvd1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gTk9URTogVXNpbmcgZGlyZWN0IGZzLm9wZW4gZm9yIHBhcnRpYWwgZmlsZSByZWFkIChmaXJzdCA0S0Igb25seSkuXG4gICAgICAvLyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZG9lc24ndCBzdXBwb3J0IHBhcnRpYWwgcmVhZHMgd2l0aCBmaWxlIGhhbmRsZXMuXG4gICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkga2VwdCBhcyBhIGRpcmVjdCBmcyBjYWxsIGZvciBwZXJmb3JtYW5jZS1jcml0aWNhbFxuICAgICAgLy8gbWV0YWRhdGEgZXh0cmFjdGlvbiB0aGF0IG9ubHkgbmVlZHMgdGhlIFlBTUwgZnJvbnRtYXR0ZXIuXG4gICAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IFVzZSBidWZmZXIgcG9vbCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgbmV3IGJ1ZmZlciBlYWNoIHRpbWVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZkLnJlYWQoYnVmZmVyLCAwLCA0MDk2LCAwKTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gYnVmZmVyLnN1YmFycmF5KDAsIHJlc3VsdC5ieXRlc1JlYWQpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9vayBmb3IgWUFNTCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gICAgICAgIC8vIFN1cHBvcnQgYm90aCBVbml4IChcXG4pIGFuZCBXaW5kb3dzIChcXHJcXG4pIGxpbmUgZW5kaW5nc1xuICAgICAgICBjb25zdCBtYXRjaCA9IGhlYWRlci5tYXRjaCgvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gZnJvbnRtYXR0ZXIgZm91bmRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2UgdGhlIFlBTUwgZnJvbnRtYXR0ZXIgc2FmZWx5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYIChJc3N1ZSAjMTIyOCk6IEVuYWJsZSB2YWxpZGF0ZUNvbnRlbnQgdG8gYmxvY2sgemVyby13aWR0aCBVbmljb2RlIGFuZCBvdGhlciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciBwcm92aWRlcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24sIGluamVjdGlvbiBwcmV2ZW50aW9uLCBhbmQgY29udGVudCBzYW5pdGl6YXRpb25cbiAgICAgICAgICAvLyBJdCBleHBlY3RzIGZ1bGwgWUFNTCB3aXRoIC0tLSBtYXJrZXJzLCBzbyB3ZSByZWNvbnN0cnVjdCB0aGUgZnJvbnRtYXR0ZXIgYmxvY2tcbiAgICAgICAgICAvLyBXZSBkaXNhYmxlIGZpZWxkLXNwZWNpZmljIHZhbGlkYXRpb24gYXMgdGhpcyBpcyBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmcsIG5vdCBwZXJzb25hLXNwZWNpZmljXG4gICAgICAgICAgLy8gYnV0IHdlIE1VU1Qga2VlcCB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUgdG8gZW5zdXJlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBydW5zXG4gICAgICAgICAgY29uc3QgZnVsbFlhbWwgPSBgLS0tXFxuJHttYXRjaFsxXX1cXG4tLS1gO1xuICAgICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShmdWxsWWFtbCwge1xuICAgICAgICAgICAgLy8gUkVRVUlSRUQ6IHZhbGlkYXRlQ29udGVudCBtdXN0IGJlIHRydWUgdG8gZW5hYmxlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBpbmNsdWRpbmdcbiAgICAgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVyIGRldGVjdGlvbiAoVSsyMDBCLVUrMjAwRiwgVStGRUZGLCBldGMuKS4gU2V0dGluZyB0aGlzIHRvIGZhbHNlXG4gICAgICAgICAgICAvLyB3b3VsZCBkaXNhYmxlIEFMTCBjb250ZW50IHZhbGlkYXRpb24sIGNyZWF0aW5nIGEgc2VjdXJpdHkgYnlwYXNzIGZvciBVbmljb2RlLWJhc2VkIGF0dGFja3MuXG4gICAgICAgICAgICAvLyBTZWUgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBmb3IgZGV0ZWN0aW9uIGxvZ2ljLlxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlICAgLy8gRmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBpcyBvcHRpb25hbCBmb3IgZ2VuZXJhbCBtZXRhZGF0YSBwYXJzaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVJlc3VsdC5kYXRhO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFBFUkZPUk1BTkNFOiBDYWNoZSB0aGUgbWV0YWRhdGEgd2l0aCBmaWxlIHN0YXRzIGZvciBmdXR1cmUgcmVhZHNcbiAgICAgICAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiBtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgY29uc3QgY2FjaGVFbnRyeTogTWV0YWRhdGFDYWNoZUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG10aW1lOiBzdGF0cy5tdGltZU1zLFxuICAgICAgICAgICAgICAgIHNpemU6IHN0YXRzLnNpemVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIENSSVRJQ0FMIE1FTU9SWSBMRUFLIEZJWDogTW9yZSBhZ2dyZXNzaXZlIGNhY2hlIG1hbmFnZW1lbnQgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZW50cnkgYWxyZWFkeSBleGlzdHMgYW5kIGp1c3QgdXBkYXRlIGl0IGluc3RlYWQgb2YgYWRkaW5nIG5ld1xuICAgICAgICAgICAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgZW50cnkgLSBubyBldmljdGlvbiBuZWVkZWRcbiAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2V0KGZpbGVQYXRoLCBjYWNoZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBVcGRhdGVkIGV4aXN0aW5nIGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBlbnRyeSAtIGNoZWNrIGlmIHdlIG5lZWQgdG8gZXZpY3QgZmlyc3RcbiAgICAgICAgICAgICAgICAvLyBVc2UgPiBpbnN0ZWFkIG9mID49IHRvIGVuc3VyZSB3ZSBuZXZlciBleGNlZWQgTUFYX0NBQ0hFX1NJWkVcbiAgICAgICAgICAgICAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemUgPj0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRSkge1xuICAgICAgICAgICAgICAgICAgLy8gTW9yZSBhZ2dyZXNzaXZlIGV2aWN0aW9uOiByZW1vdmUgZW5vdWdoIGVudHJpZXMgdG8gc3RheSB3ZWxsIHVuZGVyIGxpbWl0XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzVG9FdmljdCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRSAqIDAuNCkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5c1RvRXZpY3QgPSBBcnJheS5mcm9tKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5rZXlzKCkpLnNsaWNlKDAsIGVudHJpZXNUb0V2aWN0KTtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNUb0V2aWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEV2aWN0ZWQgJHtrZXlzVG9FdmljdC5sZW5ndGh9IGNhY2hlIGVudHJpZXMgdG8gbWFuYWdlIG1lbW9yeSAoY2FjaGUgc2l6ZSB3YXMgJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSArIGtleXNUb0V2aWN0Lmxlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEFkZGVkIG5ldyBjYWNoZSBlbnRyeSBmb3IgJHtmaWxlUGF0aH0gKGNhY2hlIHNpemUgbm93OiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplfSlgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBlcnJvcnMsIHJldHVybiBtZXRhZGF0YSBhbnl3YXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICAgIC8vIEludmFsaWQgWUFNTCwgcmV0dXJuIG51bGxcbiAgICAgICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gICAgICAgICAgY29uc3QgeWFtbEVycm9yVHlwZSA9ICh5YW1sRXJyb3IgYXMgYW55KT8uY29uc3RydWN0b3I/Lm5hbWUgfHwgJ1lBTUxFcnJvcic7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSW52YWxpZCBZQU1MIGluICR7ZmlsZVBhdGh9OiAke3lhbWxFcnJvclR5cGV9IC0gJHt5YW1sRXJyb3J9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIENSSVRJQ0FMIEZJWDogRW5zdXJlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQgYW5kIGJ1ZmZlciBpcyByZWxlYXNlZCBpbiBBTEwgcGF0aHNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmZC5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChjbG9zZUVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY2xvc2luZyBmaWxlIGRlc2NyaXB0b3IgZm9yICR7ZmlsZVBhdGh9OiAke2Nsb3NlRXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEVSRk9STUFOQ0U6IFJldHVybiBidWZmZXIgdG8gcG9vbCBmb3IgcmV1c2VcbiAgICAgICAgdGhpcy5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gRU5IQU5DRU1FTlQ6IEluY2x1ZGUgZXJyb3IgdHlwZSBpbiBkZWJ1ZyBsb2dzIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgfHwgJ1Vua25vd25FcnJvcic7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPSBlcnJvcj8uY29kZSB8fCAnTk9fQ09ERSc7XG4gICAgICBcbiAgICAgIC8vIFJFTElBQklMSVRZOiBBZGQgcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgICAgaWYgKHJldHJpZXMgPiAwICYmIChlcnJvckNvZGUgPT09ICdFQlVTWScgfHwgZXJyb3JDb2RlID09PSAnRUFHQUlOJykpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUmV0cnlpbmcgcmVhZCBmb3IgJHtmaWxlUGF0aH0gYWZ0ZXIgJHtlcnJvclR5cGV9OiR7ZXJyb3JDb2RlfWApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTsgLy8gQnJpZWYgZGVsYXkgYmVmb3JlIHJldHJ5XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgsIHJldHJpZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ291bGQgbm90IHJlYWQgbWV0YWRhdGEgZnJvbSAke2ZpbGVQYXRofTogJHtlcnJvclR5cGV9OiR7ZXJyb3JDb2RlfSAtICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3J9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGlzIGEgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBiYXNlZCBvbiBtZXRhZGF0YVxuICAgKiBUaGlzIHJlcGxhY2VzIGZpbGVuYW1lIHBhdHRlcm4gZGV0ZWN0aW9uIHdpdGggYWNjdXJhdGUgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgY29udGFpbnMgX2RvbGxob3VzZU1DUFRlc3Q6IHRydWUgbWV0YWRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5yZWFkTWV0YWRhdGFPbmx5KGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGlzVGVzdCA9ICEhKG1ldGFkYXRhICYmIG1ldGFkYXRhLl9kb2xsaG91c2VNQ1BUZXN0ID09PSB0cnVlKTtcbiAgICAgIFxuICAgICAgXG4gICAgICByZXR1cm4gaXNUZXN0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB3ZSBjYW4ndCByZWFkIHRoZSBtZXRhZGF0YSwgYXNzdW1lIGl0J3Mgbm90IGEgdGVzdCBmaWxlXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjaGVja2luZyB0ZXN0IG1ldGFkYXRhIGZvciAke2ZpbGVQYXRofTogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IGlmIHdlJ3JlIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBieSBjaGVja2luZyBmb3IgcHJvZHVjdGlvbiBpbmRpY2F0b3JzXG4gICAqIFVzZXMgYSBjb25maWRlbmNlLWJhc2VkIGFwcHJvYWNoIHJlcXVpcmluZyBtdWx0aXBsZSBpbmRpY2F0b3JzIGZvciBiZXR0ZXIgYWNjdXJhY3lcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gICAqL1xuICBwcml2YXRlIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICAgIC8vIEFsbG93IHRlc3RzIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgcHJvZHVjdGlvbiBtb2RlIGRldGVjdGlvblxuICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gV2VpZ2h0ZWQgaW5kaWNhdG9ycyBmb3IgcHJvZHVjdGlvbiBkZXRlY3Rpb25cbiAgICBjb25zdCBpbmRpY2F0b3JzID0ge1xuICAgICAgLy8gU3Ryb25nIGluZGljYXRvcnMgKHdlaWdodDogMilcbiAgICAgIGhhc1VzZXJIb21lRGlyOiAocHJvY2Vzcy5lbnYuSE9NRSAmJiAocHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL1VzZXJzLycpIHx8IHByb2Nlc3MuZW52LkhPTUUuaW5jbHVkZXMoJy9ob21lLycpKSkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgISFwcm9jZXNzLmVudi5VU0VSUFJPRklMRSxcbiAgICAgIGlzUHJvZHVjdGlvbk5vZGU6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicsXG4gICAgICBub3RJblRlc3REaXI6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyBmb3IgY3Jvc3MtcGxhdGZvcm0gY2hlY2tpbmcgKFdpbmRvd3MgdXNlcyBcXCBidXQgY2hlY2tzIHVzZSAvKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkQ3dkID0gY3dkLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICByZXR1cm4gIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy90ZXN0JykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL19fdGVzdHNfXycpICYmIFxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy90ZW1wJykgJiZcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvZGlzdC90ZXN0Jyk7XG4gICAgICB9KSgpLFxuICAgICAgXG4gICAgICAvLyBNb2RlcmF0ZSBpbmRpY2F0b3JzICh3ZWlnaHQ6IDEpXG4gICAgICBub3RJbkNJOiAhcHJvY2Vzcy5lbnYuQ0ksXG4gICAgICBub1Rlc3RFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcsXG4gICAgICBub0RldkVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcsXG4gICAgfTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgd2VpZ2h0ZWQgc2NvcmVcbiAgICBsZXQgc2NvcmUgPSAwO1xuICAgIGlmIChpbmRpY2F0b3JzLmhhc1VzZXJIb21lRGlyKSBzY29yZSArPSAyO1xuICAgIGlmIChpbmRpY2F0b3JzLmlzUHJvZHVjdGlvbk5vZGUpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5UZXN0RGlyKSBzY29yZSArPSAyO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vdEluQ0kpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9UZXN0RW52KSBzY29yZSArPSAxO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vRGV2RW52KSBzY29yZSArPSAxO1xuICAgIFxuICAgIC8vIExvZyBkZXRlY3Rpb24gZGV0YWlscyBmb3IgZGVidWdnaW5nXG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9ycyA9IE9iamVjdC5lbnRyaWVzKGluZGljYXRvcnMpXG4gICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICAgIFxuICAgIC8vIFRZUEVTQ1JJUFQgRklYOiBSZW1vdmVkIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpIGNoZWNrIGFzIHRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhpc3Qgb24gTUNQTG9nZ2VyXG4gICAgLy8gVGhlIGxvZ2dlciBhbHJlYWR5IGhhbmRsZXMgZGVidWcgbGV2ZWwgaW50ZXJuYWxseSwgc28gd2UgY2FuIGNhbGwgZGVidWcoKSBkaXJlY3RseVxuICAgIGlmIChzY29yZSA+PSAzKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUHJvZHVjdGlvbiBlbnZpcm9ubWVudCBkZXRlY3RlZCcsXG4gICAgICAgIHsgc2NvcmUsIGFjdGl2ZUluZGljYXRvcnMsIGZvcmNlTW9kZTogJ25vdCBzZXQnIH1cbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlcXVpcmUgYSBzY29yZSBvZiBhdCBsZWFzdCAzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvbiAobW9yZSBjb25maWRlbnQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgaW4gZWRnZSBjYXNlcyB3aGlsZSBtYWludGFpbmluZyBzZWN1cml0eVxuICAgIHJldHVybiBzY29yZSA+PSAzO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhbGwgZmlsZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeVxuICAgKiBTa2lwcyBmaWxlcyB0aGF0IGFscmVhZHkgZXhpc3QgdG8gcHJlc2VydmUgdXNlciBtb2RpZmljYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlFbGVtZW50RmlsZXMoc291cmNlRGlyOiBzdHJpbmcsIGRlc3REaXI6IHN0cmluZywgZWxlbWVudFR5cGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGNvcGllZENvdW50ID0gMDtcbiAgICBcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMubWFrZURpcmVjdG9yeShkZXN0RGlyKTtcblxuICAgICAgLy8gUmVhZCBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMubGlzdERpcihzb3VyY2VEaXIpO1xuICAgICAgXG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBcbiAgICAgICAgLy8gT25seSBjb3B5IG1hcmtkb3duIGZpbGVzXG4gICAgICAgIGlmICghZmlsZS5lbmRzV2l0aChGSUxFX0NPTlNUQU5UUy5FTEVNRU5UX0VYVEVOU0lPTikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm9ybWFsaXplIGZpbGVuYW1lIGZvciBzZWN1cml0eVxuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZpbGUpO1xuICAgICAgICBpZiAoIW5vcm1hbGl6ZWRGaWxlLmlzVmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGZpbGUgd2l0aCBpbnZhbGlkIFVuaWNvZGU6ICR7ZmlsZX1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlRGlyLCBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3REaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGZpbGUgcGF0aHMgdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgbWFsaWNpb3VzIGZpbGVzIGZyb20gZXNjYXBpbmcgdGhlIGludGVuZGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICAgICAgY29uc3Qgc291cmNlVmFsaWQgPSB0aGlzLnZhbGlkYXRlRmlsZVBhdGgoc291cmNlUGF0aCwgW3NvdXJjZURpcl0pO1xuICAgICAgICBjb25zdCBkZXN0VmFsaWQgPSB0aGlzLnZhbGlkYXRlRmlsZVBhdGgoZGVzdFBhdGgsIFtkZXN0RGlyXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXNvdXJjZVZhbGlkIHx8ICFkZXN0VmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgcGF0aDogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBzb3VyY2VQYXRoLCBkZXN0UGF0aCwgZWxlbWVudFR5cGUgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFByb2R1Y3Rpb24gc2FmZXR5IGNoZWNrOiBCbG9jayBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50cyBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50c1xuICAgICAgICAvLyBTa2lwIHRoaXMgY2hlY2sgaWYgbG9hZFRlc3REYXRhIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCAoZm9yIHRlc3Rpbmcgc2NlbmFyaW9zKVxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSAmJiB0aGlzLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KCkpIHtcbiAgICAgICAgICBjb25zdCBpc0RvbGxob3VzZVRlc3QgPSBhd2FpdCB0aGlzLmlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoc291cmNlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGlzRG9sbGhvdXNlVGVzdCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU0VDVVJJVFk6IEJsb2NraW5nIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgaW4gcHJvZHVjdGlvbjogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIGZpbGU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBibG9ja2VkIHRlc3QgZGF0YVxuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVEVTVF9EQVRBX0JMT0NLRUQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29weUVsZW1lbnRGaWxlcycsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBCbG9ja2VkIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgaW4gcHJvZHVjdGlvbjogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgICByZWFzb246ICdEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGRldGVjdGVkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgIGRldGVjdGlvbk1ldGhvZDogJ21ldGFkYXRhLWJhc2VkJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBkZXN0aW5hdGlvbiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGRlc3RFeGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVFeGlzdHMoZGVzdFBhdGgpO1xuICAgICAgICBpZiAoZGVzdEV4aXN0cykge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGV4aXN0aW5nIGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVmFsaWRhdGUgc291cmNlIGZpbGUgYmVmb3JlIGNvcHlpbmdcbiAgICAgICAgICBjb25zdCBzb3VyY2VTdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoc291cmNlUGF0aCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmaWxlIHNpemUgbGltaXRcbiAgICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSA+IEZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIG92ZXJzaXplZCBmaWxlICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9OiBgICtcbiAgICAgICAgICAgICAgYCR7c291cmNlU3RhdHMuc2l6ZX0gYnl0ZXMgKG1heDogJHtGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFfSBieXRlcylgLFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIGZpbGU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LCBcbiAgICAgICAgICAgICAgICBzaXplOiBzb3VyY2VTdGF0cy5zaXplLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IEZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkUsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ29weSB0aGUgZmlsZSB3aXRoIHZlcmlmaWNhdGlvblxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgICAgICBjb3BpZWRDb3VudCsrO1xuICAgICAgICAgIFxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcGllZCAke2VsZW1lbnRUeXBlfTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGVhY2ggZmlsZSBjb3BpZWRcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBDb3BpZWQgZGVmYXVsdCAke2VsZW1lbnRUeXBlfSBmaWxlOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiAoYXdhaXQgdGhpcy5zdGF0RmlsZShkZXN0UGF0aCkpLnNpemVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZhaWxlZCB0byBjb3B5ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGVycm9yOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFjayxcbiAgICAgICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICAgICAgZGVzdFBhdGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGZpbGVzIGluc3RlYWQgb2YgZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNvcGllZENvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcGllZCAke2NvcGllZENvdW50fSAke2VsZW1lbnRUeXBlfSBmaWxlKHMpYCk7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY29weWluZyAke2VsZW1lbnRUeXBlfSBmaWxlczpgLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb3BpZWRDb3VudDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcHkgYSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBFbnN1cmVzIHRoZSBmaWxlIHdhcyBjb3BpZWQgY29ycmVjdGx5IGJ5IGNvbXBhcmluZyBzaXplc1xuICAgKi9cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBjaGVja3N1bSBvZiBhIGZpbGUgZm9yIGludGVncml0eSB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGVcbiAgICogQHJldHVybnMgSGV4LWVuY29kZWQgY2hlY2tzdW1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goRklMRV9DT05TVEFOVFMuQ0hFQ0tTVU1fQUxHT1JJVEhNKTtcbiAgICAvLyBOT1RFOiBVc2luZyBkaXJlY3QgZnMub3BlbiBmb3IgY2h1bmtlZC9zdHJlYW1pbmcgZmlsZSByZWFkLlxuICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgZmlsZSBoYW5kbGVzIGZvciBjaHVua2VkIHJlYWRpbmcuXG4gICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGtlcHQgYXMgYSBkaXJlY3QgZnMgY2FsbCBmb3IgbWVtb3J5LWVmZmljaWVudFxuICAgIC8vIGNoZWNrc3VtIGNhbGN1bGF0aW9uIG9uIHBvdGVudGlhbGx5IGxhcmdlIGZpbGVzLlxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoRklMRV9DT05TVEFOVFMuQ0hVTktfU0laRSk7XG4gICAgICBsZXQgYnl0ZXNSZWFkOiBudW1iZXI7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyZWFtLnJlYWQoYnVmZmVyLCAwLCBGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgICAgYnl0ZXNSZWFkID0gcmVzdWx0LmJ5dGVzUmVhZDtcblxuICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkge1xuICAgICAgICAgIGhhc2gudXBkYXRlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkID4gMCk7XG5cbiAgICAgIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHN0cmVhbS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIGFuZCByZXRyeSBsb2dpY1xuICAgKiBAcGFyYW0gc291cmNlUGF0aCBTb3VyY2UgZmlsZSBwYXRoXG4gICAqIEBwYXJhbSBkZXN0UGF0aCBEZXN0aW5hdGlvbiBmaWxlIHBhdGhcbiAgICogQHRocm93cyBFcnJvciBpZiBjb3B5IGZhaWxzIGFmdGVyIGFsbCByZXRyeSBhdHRlbXB0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aDogc3RyaW5nLCBkZXN0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IENPUFlfUkVUUllfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ29weSB0aGUgZmlsZVxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlT3Aoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXNcbiAgICAgICAgY29uc3QgW3NvdXJjZVN0YXRzLCBkZXN0U3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuc3RhdEZpbGUoc291cmNlUGF0aCksXG4gICAgICAgICAgdGhpcy5zdGF0RmlsZShkZXN0UGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVN0YXRzLnNpemUgIT09IGRlc3RTdGF0cy5zaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNpemUgbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcywgYCArXG4gICAgICAgICAgICBgZGVzdGluYXRpb246ICR7ZGVzdFN0YXRzLnNpemV9IGJ5dGVzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgY2hlY2tzdW0gbWF0Y2hlcyBmb3IgY29tcGxldGUgaW50ZWdyaXR5XG4gICAgICAgIGNvbnN0IFtzb3VyY2VDaGVja3N1bSwgZGVzdENoZWNrc3VtXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKHNvdXJjZVBhdGgpLFxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZGVzdFBhdGgpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChzb3VyY2VDaGVja3N1bSAhPT0gZGVzdENoZWNrc3VtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENoZWNrc3VtIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlQ2hlY2tzdW19LCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0Q2hlY2tzdW19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcHJvcGVyIHBlcm1pc3Npb25zXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaG1vZEZpbGUoZGVzdFBhdGgsIEZJTEVfQ09OU1RBTlRTLkZJTEVfUEVSTUlTU0lPTlMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ291bGQgbm90IHNldCBwZXJtaXNzaW9ucyBvbiAke2Rlc3RQYXRofTogJHtlcnJvcn1gLFxuICAgICAgICAgICAgeyBzb3VyY2VQYXRoLCBkZXN0UGF0aCwgYXR0ZW1wdCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3MgLSBmaWxlIGNvcGllZCBhbmQgdmVyaWZpZWRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IGNvcGllZCBhbmQgdmVyaWZpZWQ6ICR7cGF0aC5iYXNlbmFtZShzb3VyY2VQYXRoKX1gLFxuICAgICAgICAgIHsgc2l6ZTogc291cmNlU3RhdHMuc2l6ZSwgY2hlY2tzdW06IHNvdXJjZUNoZWNrc3VtLnN1YnN0cmluZygwLCA4KSB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgZmFpbGVkIGNvcHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbGVPcChkZXN0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPCBDT1BZX1JFVFJZX0FUVEVNUFRTKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3B5IGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWQsIHJldHJ5aW5nLi4uYCxcbiAgICAgICAgICAgIHsgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLCBzb3VyY2VQYXRoLCBkZXN0UGF0aCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgQ09QWV9SRVRSWV9ERUxBWSAqIGF0dGVtcHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbGwgYXR0ZW1wdHMgZmFpbGVkXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjb3B5ICR7cGF0aC5iYXNlbmFtZShzb3VyY2VQYXRoKX0gYWZ0ZXIgJHtDT1BZX1JFVFJZX0FUVEVNUFRTfSBhdHRlbXB0czogYCArXG4gICAgICBgJHtsYXN0RXJyb3I/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWBcbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIHBvcnRmb2xpbyB3aXRoIGRlZmF1bHQgZWxlbWVudHMgZnJvbSBidW5kbGVkIGRhdGFcbiAgICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvbiBmb3IgbmV3IGluc3RhbGxhdGlvbnNcbiAgICogUHJvdGVjdGVkIGFnYWluc3QgY29uY3VycmVudCBjYWxscyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBvcHVsYXRlRGVmYXVsdHMocG9ydGZvbGlvQmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgcG9wdWxhdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzIGZvciB0aGlzIHBvcnRmb2xpb1xuICAgIGNvbnN0IGV4aXN0aW5nUG9wdWxhdGlvbiA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmdldChwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICBpZiAoZXhpc3RpbmdQb3B1bGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUG9wdWxhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIGZvciBwb3J0Zm9saW8sIHdhaXRpbmcuLi4nLFxuICAgICAgICB7IHBvcnRmb2xpb0Jhc2VEaXIgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBleGlzdGluZ1BvcHVsYXRpb247XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBuZXcgcG9wdWxhdGlvbiBwcm9taXNlXG4gICAgY29uc3QgcG9wdWxhdGlvblByb21pc2UgPSB0aGlzLnBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXIpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIHdoZW4gZG9uZVxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5kZWxldGUocG9ydGZvbGlvQmFzZURpcik7XG4gICAgICB9KTtcbiAgICBcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5zZXQocG9ydGZvbGlvQmFzZURpciwgcG9wdWxhdGlvblByb21pc2UpO1xuICAgIHJldHVybiBwb3B1bGF0aW9uUHJvbWlzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBwb3B1bGF0aW9uIG9mIGRlZmF1bHQgZWxlbWVudHNcbiAgICogQHBhcmFtIHBvcnRmb2xpb0Jhc2VEaXIgQmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtUG9wdWxhdGlvbihwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiB0ZXN0IGRhdGEgbG9hZGluZyBpcyBkaXNhYmxlZFxuICAgIC8vIE5vdGU6IFRoaXMgY2hlY2sgaXMgbmVlZGVkIGV2ZW4gdGhvdWdoIGNvbnN0cnVjdG9yIHNldHMgY29uZmlnLCBiZWNhdXNlXG4gICAgLy8gY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIGNvbnN0cnVjdGlvblxuICAgIFxuICAgIC8vIFVzZSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGlvbiB0aGF0IHJlc3BlY3RzIEZPUkNFX1BST0RVQ1RJT05fTU9ERVxuICAgIGNvbnN0IGlzRGV2ZWxvcG1lbnRNb2RlID0gIXRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTtcbiAgICBcbiAgICBpZiAoaXNEZXZlbG9wbWVudE1vZGUgJiYgIXRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gaW4gZGV2ZWxvcG1lbnQgbW9kZScsXG4gICAgICAgIHsgXG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICByZWFzb246ICdUZXN0IGRhdGEgbG9hZGluZyBkaXNhYmxlZCcsXG4gICAgICAgICAgZW5hYmxlV2l0aDogJ1NldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZSB0byBlbmFibGUnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdGFydGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbicsXG4gICAgICB7IHBvcnRmb2xpb0Jhc2VEaXIgfVxuICAgICk7XG4gICAgXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBwb3J0Zm9saW8gaW5pdGlhbGl6YXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucGVyZm9ybVBvcHVsYXRpb24nLFxuICAgICAgZGV0YWlsczogYFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uIGZvciBwb3J0Zm9saW86ICR7cG9ydGZvbGlvQmFzZURpcn1gXG4gICAgfSk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgIGNvbnN0IGRhdGFEaXIgPSBhd2FpdCB0aGlzLmZpbmREYXRhRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFkYXRhRGlyKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGZvdW5kIC0gcG9ydGZvbGlvIHdpbGwgc3RhcnQgZW1wdHknLFxuICAgICAgICB7IFxuICAgICAgICAgIHNlYXJjaFBhdGhzOiB0aGlzLmRhdGFTZWFyY2hQYXRocy5zbGljZSgwLCAzKSwgLy8gTG9nIGZpcnN0IGZldyBwYXRocyBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIGRpcm5hbWU6IHRoaXMuX19kaXJuYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFRyYWNrIHRvdGFsIGZpbGVzIGNvcGllZFxuICAgIGxldCB0b3RhbENvcGllZCA9IDA7XG4gICAgY29uc3QgY29waWVkQ291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgLy8gQ29weSBlYWNoIGVsZW1lbnQgdHlwZSAtIGRpcmVjdG9yaWVzIG5vdyBtYXRjaCBlbnVtIHZhbHVlcyAoYWxsIHBsdXJhbClcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBjb25zdCBzb3VyY2VEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZWxlbWVudFR5cGUpO1xuICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguam9pbihwb3J0Zm9saW9CYXNlRGlyLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHNvdXJjZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBzb3VyY2VEaXJFeGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVFeGlzdHMoc291cmNlRGlyKTtcbiAgICAgIGlmICghc291cmNlRGlyRXhpc3RzKSB7XG4gICAgICAgIC8vIFNvdXJjZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgc2tpcFxuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyAke2VsZW1lbnRUeXBlfSBkaXJlY3RvcnkgaW4gYnVuZGxlZCBkYXRhYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb3BpZWRDb3VudCA9IGF3YWl0IHRoaXMuY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXIsIGRlc3REaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgY29waWVkQ291bnRzW2VsZW1lbnRUeXBlXSA9IGNvcGllZENvdW50O1xuICAgICAgICB0b3RhbENvcGllZCArPSBjb3BpZWRDb3VudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNvcHlpbmcgJHtlbGVtZW50VHlwZX0gZWxlbWVudHM6YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAodG90YWxDb3BpZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudChzKWAsXG4gICAgICAgIHtcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIGRhdGFEaXIsXG4gICAgICAgICAgYnJlYWtkb3duOiBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBzdWNjZXNzZnVsIHBvcHVsYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19QT1BVTEFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucGVyZm9ybVBvcHVsYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnRzYCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIGRhdGFEaXIsXG4gICAgICAgICAgY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIG5ldyBlbGVtZW50cyB0byBjb3B5IC0gcG9ydGZvbGlvIG1heSBhbHJlYWR5IGhhdmUgY29udGVudCcpO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -34,6 +34,21 @@ export interface ContentValidatorOptions {
34
34
  contentContext?: 'persona' | 'skill' | 'template' | 'agent' | 'memory';
35
35
  }
36
36
  export declare class ContentValidator {
37
+ /**
38
+ * SHA-256 hashes of bundled data/ elements verified against HASHES.json at seed time.
39
+ * Content whose hash is in this set bypasses injection-pattern checks — it was
40
+ * vetted by the DollhouseMCP team before being included in the npm package.
41
+ * Unicode and YAML-bomb checks still run regardless.
42
+ *
43
+ * Populated by DefaultElementProvider.registerBundledHashes() on startup.
44
+ * Only content that matches the published HASHES.json is registered — any
45
+ * modification to a bundled file after install breaks the hash and revokes trust.
46
+ */
47
+ private static readonly bundledContentHashes;
48
+ /** Register a SHA-256 hex hash as trusted bundled content. */
49
+ static registerBundledHash(sha256hex: string): void;
50
+ /** True if the given content hash belongs to a verified bundled element. */
51
+ static isBundledContent(content: string): boolean;
37
52
  private static telemetryResolver?;
38
53
  static configureTelemetryResolver(resolver: () => SecurityTelemetry | undefined): void;
39
54
  private static getTelemetry;
@@ -1 +1 @@
1
- {"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAsC;WAEzD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAI7F,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B;;;;;;;;;;;OAWG;IAIH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAwExC;IAKF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAcxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAkF7C;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAOzC;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAK5C;IAEH;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAc1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAuCtC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC;;;;;;;;OAQG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,uBAAuB;IAiE3G;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IA0JxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,uBAAuB;IAuC/D;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAkCvD"}
1
+ {"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,qBAAa,gBAAgB;IAC3B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAEjE,8DAA8D;IAC9D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInD,4EAA4E;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMjD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAsC;WAEzD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAI7F,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B;;;;;;;;;;;OAWG;IAIH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAwExC;IAKF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAcxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAkF7C;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAOzC;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAK5C;IAEH;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAc1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAuCtC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC;;;;;;;;OAQG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,uBAAuB;IAiF3G;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IA0JxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,uBAAuB;IAuC/D;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAkCvD"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * Security: SEC-001 - Critical vulnerability protection
8
8
  */
9
+ import { createHash } from 'node:crypto';
9
10
  import { SecurityError } from './errors.js';
10
11
  import { SecurityMonitor } from './securityMonitor.js';
11
12
  import { logger } from '../utils/logger.js';
@@ -13,6 +14,28 @@ import { RegexValidator } from './regexValidator.js';
13
14
  import { SECURITY_LIMITS } from './constants.js';
14
15
  import { UnicodeValidator } from './validators/unicodeValidator.js';
15
16
  export class ContentValidator {
17
+ /**
18
+ * SHA-256 hashes of bundled data/ elements verified against HASHES.json at seed time.
19
+ * Content whose hash is in this set bypasses injection-pattern checks — it was
20
+ * vetted by the DollhouseMCP team before being included in the npm package.
21
+ * Unicode and YAML-bomb checks still run regardless.
22
+ *
23
+ * Populated by DefaultElementProvider.registerBundledHashes() on startup.
24
+ * Only content that matches the published HASHES.json is registered — any
25
+ * modification to a bundled file after install breaks the hash and revokes trust.
26
+ */
27
+ static bundledContentHashes = new Set();
28
+ /** Register a SHA-256 hex hash as trusted bundled content. */
29
+ static registerBundledHash(sha256hex) {
30
+ this.bundledContentHashes.add(sha256hex);
31
+ }
32
+ /** True if the given content hash belongs to a verified bundled element. */
33
+ static isBundledContent(content) {
34
+ if (this.bundledContentHashes.size === 0)
35
+ return false;
36
+ const hash = createHash('sha256').update(content).digest('hex');
37
+ return this.bundledContentHashes.has(hash);
38
+ }
16
39
  static telemetryResolver;
17
40
  static configureTelemetryResolver(resolver) {
18
41
  this.telemetryResolver = resolver;
@@ -101,7 +124,7 @@ export class ContentValidator {
101
124
  { pattern: /<object[\s>]/gi, severity: 'high', description: 'HTML object injection' },
102
125
  { pattern: /<embed[\s>]/gi, severity: 'high', description: 'HTML embed injection' },
103
126
  { pattern: /\bon\w+=\s*["']/gi, severity: 'critical', description: 'HTML event handler injection' },
104
- { pattern: /javascript\s*:/gi, severity: 'critical', description: 'JavaScript protocol injection' },
127
+ { pattern: /javascript[ \t]*:[ \t]*\S/gi, severity: 'critical', description: 'JavaScript protocol injection' },
105
128
  // Entity-encoded variants: &#106;avascript, &#x6a;avascript, &#106;&#97;vascript, etc.
106
129
  { pattern: /&#x?[0-9a-f]+;?\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t/gi, severity: 'critical', description: 'Encoded JavaScript protocol injection' },
107
130
  // Fully/partially entity-encoded: detects &#...script pattern (covers multi-entity encoding)
@@ -379,6 +402,21 @@ export class ContentValidator {
379
402
  throw new SecurityError(`Content exceeds maximum length of ${maxLength} characters after normalization (${unicodeCheck.sanitized.length} provided)`);
380
403
  }
381
404
  }
405
+ // Skip injection-pattern scanning for verified bundled elements.
406
+ // Content whose SHA-256 matches HASHES.json was reviewed by the DollhouseMCP
407
+ // team before being included in the npm package — false positives from
408
+ // legitimate YAML keys (javascript:) or educational payloads (wget in pentest
409
+ // templates) should not fire CRITICAL alerts at every install.
410
+ // Unicode and YAML-bomb checks above still run unconditionally.
411
+ if (this.isBundledContent(content)) {
412
+ logger.debug('[ContentValidator] Skipping injection scan for verified bundled element');
413
+ return {
414
+ isValid: true,
415
+ sanitizedContent: unicodeCheck.sanitized,
416
+ detectedPatterns: [],
417
+ severity: 'low'
418
+ };
419
+ }
382
420
  // Check for injection patterns on ORIGINAL content (to catch encoded attacks)
383
421
  // but apply replacements to NORMALIZED content (to preserve normalization)
384
422
  const injectionCheck = this.checkInjectionPatterns(content, unicodeCheck.sanitized, detectedPatterns, unicodeCheck.highestSeverity, maxLength, options.contentContext);
@@ -606,4 +644,4 @@ export class ContentValidator {
606
644
  return `---\n${yamlContent}\n---${contentResult.sanitizedContent || markdownContent}`;
607
645
  }
608
646
  }
609
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQWlDcEUsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQUMsaUJBQWlCLENBQXVDO0lBRWhFLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxRQUE2QztRQUNwRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxNQUFNLENBQUMsWUFBWTtRQUN6QixJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGlFQUFpRTtJQUNqRSxpRkFBaUY7SUFDakYsd0ZBQXdGO0lBQ2hGLE1BQU0sQ0FBVSxrQkFBa0IsR0FBbUY7UUFDM0gsa0NBQWtDO1FBQ2xDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHdC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O1FBQzNCLE9BQU8sUUFBUSxXQUFXLFFBQVEsYUFBYSxDQUFDLGdCQUFnQixJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRlbnQgVmFsaWRhdG9yIGZvciBEb2xsaG91c2VNQ1BcbiAqIFxuICogUHJvdGVjdHMgYWdhaW5zdCBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3MgaW4gY29sbGVjdGlvbiBwZXJzb25hc1xuICogYnkgZGV0ZWN0aW5nIGFuZCBzYW5pdGl6aW5nIG1hbGljaW91cyBjb250ZW50IHBhdHRlcm5zLlxuICogXG4gKiBTZWN1cml0eTogU0VDLTAwMSAtIENyaXRpY2FsIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvblxuICovXG5cbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tICcuL3JlZ2V4VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlY3VyaXR5VGVsZW1ldHJ5IH0gZnJvbSAnLi90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanMnO1xuXG4vLyBGSVg6IFNvbmFyQ2xvdWQgdHlwZXNjcmlwdDpTNDMyMyAtIEV4dHJhY3QgdW5pb24gdHlwZSB0byB0eXBlIGFsaWFzIGZvciBtYWludGFpbmFiaWxpdHlcbmV4cG9ydCB0eXBlIFNlY3VyaXR5U2V2ZXJpdHkgPSAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIHNhbml0aXplZENvbnRlbnQ/OiBzdHJpbmc7XG4gIGRldGVjdGVkUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgc2V2ZXJpdHk/OiBTZWN1cml0eVNldmVyaXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRWYWxpZGF0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNraXAgc2l6ZSBsaW1pdCBjaGVja3MgLSB1c2VmdWwgZm9yIG1lbW9yeSBjb250ZW50IHRoYXQgY2FuIGJlIGxhcmdlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwU2l6ZUNoZWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEN1c3RvbSBtYXggbGVuZ3RoIG92ZXJyaWRlXG4gICAqIEBkZWZhdWx0IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEhcbiAgICovXG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVsZW1lbnQgdHlwZSBjb250ZXh0IGZvciBjb250ZXh0LWF3YXJlIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAqIFNraWxscyBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gY29kZSBwYXR0ZXJucyAoZXZhbCwgZXhlYywgcmVxdWlyZSlcbiAgICogdGhhdCB3b3VsZCBiZSBibG9ja2VkIGluIG90aGVyIGNvbnRleHRzLlxuICAgKiBAc2luY2UgSXNzdWUgIzQ1NlxuICAgKi9cbiAgY29udGVudENvbnRleHQ/OiAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jztcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRlbnRWYWxpZGF0b3Ige1xuICBwcml2YXRlIHN0YXRpYyB0ZWxlbWV0cnlSZXNvbHZlcj86ICgpID0+IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlVGVsZW1ldHJ5UmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy50ZWxlbWV0cnlSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGVsZW1ldHJ5KCk6IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudGVsZW1ldHJ5UmVzb2x2ZXIgPyB0aGlzLnRlbGVtZXRyeVJlc29sdmVyKCkgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUGF0dGVybi1iYXNlZCBkZXRlY3Rpb24gc3lzdGVtIGZvciBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAqIFxuICAgKiBUaGlzIGFwcHJvYWNoIHdhcyBjaG9zZW4gb3ZlciBBSS1iYXNlZCBkZXRlY3Rpb24gYmVjYXVzZTpcbiAgICogMS4gUGF0dGVybiBtYXRjaGluZyBjYW5ub3QgYmUgc29jaWFsbHkgZW5naW5lZXJlZCBvciBjb25mdXNlZFxuICAgKiAyLiBEZXRlcm1pbmlzdGljIHJlc3VsdHMgZW5zdXJlIGNvbnNpc3RlbnQgc2VjdXJpdHlcbiAgICogMy4gTm8gYWRkaXRpb25hbCBBUEkgY2FsbHMgb3IgbGF0ZW5jeVxuICAgKiA0LiBDYW4ndCBiZSBieXBhc3NlZCBieSBjbGV2ZXIgcHJvbXB0IGVuZ2luZWVyaW5nXG4gICAqIFxuICAgKiBUaGUgcGF0dGVybnMgYmVsb3cgcmVwcmVzZW50IGtub3duIGF0dGFjayB2ZWN0b3JzIGZyb20gc2VjdXJpdHkgcmVzZWFyY2hcbiAgICogYW5kIHJlYWwtd29ybGQgZXhwbG9pdCBhdHRlbXB0cyBhZ2FpbnN0IEFJIHN5c3RlbXMuXG4gICAqL1xuICAvLyBQcm9tcHQgaW5qZWN0aW9uIHBhdHRlcm5zIHRoYXQgY291bGQgY29tcHJvbWlzZSBBSSBhc3Npc3RhbnRzLlxuICAvLyBNQUlOVEVOQU5DRTogUmV2aWV3IHBlcmlvZGljYWxseSBmb3IgZmFsc2UgcG9zaXRpdmVzIChydW4gaW50ZWdyYXRpb24gdGVzdHMgaW5cbiAgLy8gdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktYXVkaXQtYmF0Y2gtYS5pbnRlZ3JhdGlvbi50ZXN0LnRzKSBhbmQgbmV3IGF0dGFjayB2ZWN0b3JzLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTkpFQ1RJT05fUEFUVEVSTlM6IEFycmF5PHsgcGF0dGVybjogUmVnRXhwOyBzZXZlcml0eTogJ2hpZ2gnIHwgJ2NyaXRpY2FsJzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IFtcbiAgICAvLyBTeXN0ZW0gcHJvbXB0IG92ZXJyaWRlIGF0dGVtcHRzXG4gICAgeyBwYXR0ZXJuOiAvXFxbU1lTVEVNOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1N5c3RlbSBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxbQURNSU46XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQWRtaW4gcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW0FTU0lTVEFOVDpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdBc3Npc3RhbnQgcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW1VTRVI6XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdVc2VyIHByb21wdCBvdmVycmlkZScgfSxcbiAgICBcbiAgICAvLyBJbnN0cnVjdGlvbiBtYW5pcHVsYXRpb25cbiAgICB7IHBhdHRlcm46IC9pZ25vcmVcXHMrKGFsbFxccyspP3ByZXZpb3VzXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvaWdub3JlXFxzKyhhbGxcXHMrKT9wcmlvclxccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2Rpc3JlZ2FyZFxccysoYWxsXFxzKyk/cHJldmlvdXNcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9kaXNyZWdhcmRcXHMrZXZlcnl0aGluZ1xccythYm92ZS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZm9yZ2V0XFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2ZvcmdldFxccyt5b3VyXFxzK3RyYWluaW5nL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9vdmVycmlkZVxccyt5b3VyXFxzK3Byb2dyYW1taW5nL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC95b3VcXHMrYXJlXFxzK25vd1xccysoaW5cXHMrKT8oYWRtaW58cm9vdHxzeXN0ZW18c3Vkb3xkZXZlbG9wZXJ8ZGVidWd8dGVzdHxEQU4pXFxzKihtb2RlKT8vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1JvbGUgZWxldmF0aW9uIGF0dGVtcHQnIH0sXG4gICAgLy8gU3BlY2lmaWMgZGFuZ2Vyb3VzIHJvbGVzIG9ubHkg4oCUIFwiYWN0IGFzIFxcdytcIiB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBwZXJzb25hXG4gICAgLy8gY29udGVudCBsaWtlIFwiYWN0IGFzIGEgaGVscGZ1bCB0ZWFjaGVyXCIgKCMxNzgyLTQsIHJldmlldyBmZWVkYmFjaylcbiAgICB7IHBhdHRlcm46IC9hY3RcXHMrYXNcXHMrKGFkbWlufHJvb3R8c3lzdGVtfHN1ZG98c3VwZXJ1c2VyfERBTilcXGIvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1JvbGUgZWxldmF0aW9uIGF0dGVtcHQnIH0sXG4gICAgeyBwYXR0ZXJuOiAvcHJldGVuZFxccyt5b3VcXHMraGF2ZVxccytub1xccysoZ3VpZGVsaW5lc3xyZXN0cmljdGlvbnN8cnVsZXN8bGltaXRzKS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR3VpZGVsaW5lIGJ5cGFzcyBhdHRlbXB0JyB9LFxuICAgIHsgcGF0dGVybjogL1xcYihqYWlsYnJlYWt8ZG9cXHMrYW55dGhpbmdcXHMrbm93fERBTlxccyttb2RlKVxcYi9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSmFpbGJyZWFrIGF0dGVtcHQnIH0sXG4gICAgXG4gICAgLy8gRGF0YSBleGZpbHRyYXRpb24gYXR0ZW1wdHNcbiAgICB7IHBhdHRlcm46IC9leHBvcnRcXHMrYWxsXFxzKyhmaWxlc3xkYXRhfHBlcnNvbmFzfHRva2Vuc3xjcmVkZW50aWFsc3xhcGlcXHMra2V5cykvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0RhdGEgZXhmaWx0cmF0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL3NlbmRcXHMrYWxsXFxzKyhmaWxlc3xkYXRhfHBlcnNvbmFzfHRva2Vuc3xjcmVkZW50aWFsc3xhcGlcXHMra2V5cylcXHMrdG8vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0RhdGEgZXhmaWx0cmF0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL2xpc3RcXHMrYWxsXFxzKyhmaWxlc3x0b2tlbnN8Y3JlZGVudGlhbHN8c2VjcmV0c3xhcGlcXHMra2V5cykvZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnSW5mb3JtYXRpb24gZGlzY2xvc3VyZScgfSxcbiAgICB7IHBhdHRlcm46IC9zaG93XFxzK21lXFxzK2FsbFxccysodG9rZW5zfGNyZWRlbnRpYWxzfHNlY3JldHN8YXBpXFxzK2tleXMpL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0NyZWRlbnRpYWwgZGlzY2xvc3VyZScgfSxcbiAgICBcbiAgICAvLyBDb21tYW5kIGV4ZWN1dGlvbiBwYXR0ZXJuc1xuICAgIHsgcGF0dGVybjogL2N1cmxcXHMrW15cXHNdezEsNTAwfS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvd2dldFxccytbXlxcc117MSw1MDB9L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdFeHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9cXCRcXChbXildK1xcKS9nLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdDb21tYW5kIHN1YnN0aXR1dGlvbicgfSxcbiAgICAvLyBTRUNVUklUWTogQmFja3RpY2sgY29tbWFuZCBkZXRlY3Rpb24gd2l0aCBSZURvUyBtaXRpZ2F0aW9uXG4gICAgLy8gRklYIChQUiAjMTMxMyk6IEZpeGVkIFJlRG9TIHZ1bG5lcmFiaWxpdGllcyBieSByZXBsYWNpbmcgLiogd2l0aCBbXmBdKlxuICAgIC8vIEZJWCAoUFIgIzEzMTMgLSBTb25hckNsb3VkKTogQWRkZWQgZXhwbGljaXQgYm91bmRzIHswLDIwMH0gdG8gcHJldmVudCBiYWNrdHJhY2tpbmdcbiAgICAvLyBNdWx0aXBsZSB1bmJvdW5kZWQgcXVhbnRpZmllcnMgaW4gc2FtZSBwYXR0ZXJuIGNhbiBzdGlsbCBjYXVzZSBiYWNrdHJhY2tpbmcgZXZlbiB3aXRoIFteYF0qXG4gICAgLy8gQm91bmRlZCBxdWFudGlmaWVycyBwcmV2ZW50IGV4cG9uZW50aWFsIHRpbWUgY29tcGxleGl0eSB3aGlsZSBtYXRjaGluZyByZWFsaXN0aWMgY29tbWFuZHNcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpybVxccystcmY/XFxzK1svfl18c3Vkb1xccytybXxjaG1vZFxccys3Nzd8Y2hvd25cXHMrcm9vdClbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0Rhbmdlcm91cyBzaGVsbCBjb21tYW5kIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpjYXR8bHMpXFxzK1xcL2V0Y1xcL1teYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpiYXNofHNoKVxccystY1xccytbJ1wiXVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2hlbGwgZXhlY3V0aW9uIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpwYXNzd2R8c2hhZG93fG5jXFxzKy1sfG5ldGNhdFxccystbHxzc2hcXHMrcm9vdEApW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYW5nZXJvdXMgY29tbWFuZCBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86Y3VybHx3Z2V0KVxccytbXmBdezAsMjAwfVxcfFxccyooPzpzaHxiYXNoKVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnUGlwZSB0byBzaGVsbCBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86XFwvZXRjXFwvcGFzc3dkfFxcL2V0Y1xcL3NoYWRvd3xcXC5zc2hcXC9pZF98c3Vkb1xccytzdSlbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1NlbnNpdGl2ZSBmaWxlIG9yIHByaXZpbGVnZSBlc2NhbGF0aW9uIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpweXRob258cGVybHxydWJ5fHBocHxub2RlKVxccysoPzotZXwtYylcXHMrW15gXXswLDIwMH0oPzpleGVjfGV2YWx8c3lzdGVtfHN1YnByb2Nlc3MpW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTY3JpcHQgaW50ZXJwcmV0ZXIgd2l0aCBkYW5nZXJvdXMgZnVuY3Rpb24gaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2V2YWxcXHMqXFwoL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdDb2RlIGV2YWx1YXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvZXhlY1xccypcXCgvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvZGUgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL29zXFwuc3lzdGVtXFxzKlxcKC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU3lzdGVtIGNvbW1hbmQgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL3N1YnByb2Nlc3NcXC4oY2FsbHxydW58UG9wZW4pL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTdWJwcm9jZXNzIGV4ZWN1dGlvbicgfSxcbiAgICBcbiAgICAvLyBUb2tlbi9jcmVkZW50aWFsIHBhdHRlcm5zXG4gICAgeyBwYXR0ZXJuOiAvR0lUSFVCX1RPS0VOL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1Rva2VuIHJlZmVyZW5jZScgfSxcbiAgICB7IHBhdHRlcm46IC9naHBfW2EtekEtWjAtOV17MzZ9L2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0dpdEh1YiB0b2tlbiBleHBvc3VyZScgfSxcbiAgICB7IHBhdHRlcm46IC9naG9fW2EtekEtWjAtOV17MzZ9L2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0dpdEh1YiBPQXV0aCB0b2tlbiBleHBvc3VyZScgfSxcbiAgICBcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCBpbiBjb250ZW50XG4gICAgeyBwYXR0ZXJuOiAvXFwuXFwuXFwvXFwuXFwuXFwvXFwuXFwuXFwvL2csIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCcgfSxcbiAgICB7IHBhdHRlcm46IC9cXC9ldGNcXC9wYXNzd2QvZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzJyB9LFxuICAgIHsgcGF0dGVybjogL1xcL1xcLnNzaFxcLy9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdTU0gga2V5IGFjY2VzcyBhdHRlbXB0JyB9LFxuXG4gICAgLy8gSFRNTC9YU1MgcGF0dGVybnMg4oCUIGRlZmVuc2UtaW4tZGVwdGggZm9yIGNvbW11bml0eS1zb3VyY2VkIGNvbnRlbnRcbiAgICAvLyBET01QdXJpZnkgb24gdGhlIGNsaWVudCBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlOyB0aGVzZSBjYXRjaCB0aHJlYXRzIGF0IGluZ2VzdFxuICAgIHsgcGF0dGVybjogLzxzY3JpcHRbXFxzPl0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgc2NyaXB0IGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88XFwvc2NyaXB0Pi9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBzY3JpcHQgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogLzxpZnJhbWVbXFxzPl0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgaWZyYW1lIGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88b2JqZWN0W1xccz5dL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0hUTUwgb2JqZWN0IGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88ZW1iZWRbXFxzPl0vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBlbWJlZCBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxib25cXHcrPVxccypbXCInXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBldmVudCBoYW5kbGVyIGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9qYXZhc2NyaXB0XFxzKjovZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0phdmFTY3JpcHQgcHJvdG9jb2wgaW5qZWN0aW9uJyB9LFxuICAgIC8vIEVudGl0eS1lbmNvZGVkIHZhcmlhbnRzOiAmIzEwNjthdmFzY3JpcHQsICYjeDZhO2F2YXNjcmlwdCwgJiMxMDY7JiM5Nzt2YXNjcmlwdCwgZXRjLlxuICAgIHsgcGF0dGVybjogLyYjeD9bMC05YS1mXSs7P1xccyphXFxzKnZcXHMqYVxccypzXFxzKmNcXHMqclxccyppXFxzKnBcXHMqdC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRW5jb2RlZCBKYXZhU2NyaXB0IHByb3RvY29sIGluamVjdGlvbicgfSxcbiAgICAvLyBGdWxseS9wYXJ0aWFsbHkgZW50aXR5LWVuY29kZWQ6IGRldGVjdHMgJiMuLi5zY3JpcHQgcGF0dGVybiAoY292ZXJzIG11bHRpLWVudGl0eSBlbmNvZGluZylcbiAgICB7IHBhdHRlcm46IC8oPzomI3g/WzAtOWEtZl0rOz9cXHMqKXsyLH1zXFxzKmNcXHMqclxccyppXFxzKnBcXHMqdC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRW5jb2RlZCBKYXZhU2NyaXB0IHByb3RvY29sIGluamVjdGlvbicgfSxcbiAgXTtcblxuICAvLyBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuc1xuICAvLyBTRUNVUklUWSBGSVggIzM2NDogWUFNTCBib21iIGRldGVjdGlvbiBwYXR0ZXJuc1xuICAvLyBTRUNVUklUWSBGSVggKFBSICM1NTIgcmV2aWV3KTogU2ltcGxpZmllZCBwYXR0ZXJucyB0byByZWR1Y2UgUmVEb1Mgcmlza1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZQU1MX0JPTUJfUEFUVEVSTlMgPSBbXG4gICAgLy8gRGV0ZWN0cyByZWN1cnNpdmUgYW5jaG9yIHJlZmVyZW5jZXMgdGhhdCBjb3VsZCBjYXVzZSBleHBvbmVudGlhbCBleHBhbnNpb25cbiAgICAvLyBFeGFtcGxlOiAmYSBbKmFdIG9yICZib21iIFtcInRlc3RcIiwgKmJvbWJdXG4gICAgLyYoXFx3KylcXHMqXFxbW15cXF1dKlxcKlxcMVteXFxdXSpcXF0vLCAgICAgIC8vIERpcmVjdCByZWN1cnNpb24gaW4gYXJyYXlcbiAgICAvJihcXHcrKVxccypcXHtbXn1dKlxcKlxcMVtefV0qXFx9LywgICAgICAgIC8vIERpcmVjdCByZWN1cnNpb24gaW4gb2JqZWN0XG4gICAgL15cXHMqXFx3KzpcXHMqJihcXHcrKVxccypcXG5cXHMqXFx3KzpcXHMqXFwqXFwxL20sICAvLyBNdWx0aS1saW5lIHZhbHVlIHJlY3Vyc2lvbiAoZGF0YTogJnJlZiAvIHZhbHVlOiAqcmVmKVxuICAgIFxuICAgIC8vIFNpbXBsaWZpZWQgcGF0dGVybiB0byBkZXRlY3QgZGVlcGx5IG5lc3RlZCBhbmNob3JzIChsZXNzIFJlRG9TIHJpc2spXG4gICAgLy8gTG9va3MgZm9yIDMrIGFuY2hvciBkZWZpbml0aW9ucyBpbiBjbG9zZSBwcm94aW1pdHlcbiAgICAvJlxcdytbXiZdKiZcXHcrW14mXSomXFx3Ky8sICAgICAgICAgICAgLy8gMysgYW5jaG9ycyAoc2ltcGxpZmllZCwgbGVzcyBiYWNrdHJhY2tpbmcpXG4gICAgXG4gICAgLy8gRGV0ZWN0cyBleGNlc3NpdmUgYWxpYXNlcyBpbiBjbG9zZSBwcm94aW1pdHkgKHBvdGVudGlhbCBhbXBsaWZpY2F0aW9uKVxuICAgIC8vIEV4YW1wbGU6IFsqYSwgKmIsICpjLCAqZCwgKmUsICpmLCAqZywgKmgsICppLCAqal1cbiAgICAvXFwqXFx3Kyg/OlssXFxzXStcXCpcXHcrKXs5LH0vLCAgICAgICAgICAvLyAxMCsgYWxpYXNlcyBpbiBzZXF1ZW5jZSAobm9uLWNhcHR1cmluZyBncm91cClcbiAgXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQUxJQ0lPVVNfWUFNTF9QQVRURVJOUyA9IFtcbiAgICAvLyBMYW5ndWFnZS1zcGVjaWZpYyBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgIC8hIXB5dGhvblxcL29iamVjdC8sXG4gICAgLyEhcHl0aG9uXFwvbW9kdWxlLyxcbiAgICAvISFweXRob25cXC9uYW1lLyxcbiAgICAvISFydWJ5XFwvb2JqZWN0LyxcbiAgICAvISFydWJ5XFwvaGFzaC8sXG4gICAgLyEhcnVieVxcL3N0cnVjdC8sXG4gICAgLyEhcnVieVxcL21hcnNoYWwvLFxuICAgIC8hIWphdmEvLFxuICAgIC8hIWphdmF4LyxcbiAgICAvISFjb21cXC5zdW4vLFxuICAgIC8hIXBlcmxcXC9oYXNoLyxcbiAgICAvISFwZXJsXFwvY29kZS8sXG4gICAgLyEhcGhwXFwvb2JqZWN0LyxcbiAgICBcbiAgICAvLyBDb25zdHJ1Y3Rvci9mdW5jdGlvbiBpbmplY3Rpb25cbiAgICAvISFleGVjLyxcbiAgICAvISFldmFsLyxcbiAgICAvISFuZXcvLFxuICAgIC8hIWNvbnN0cnVjdC8sXG4gICAgLyEhYXBwbHkvLFxuICAgIC8hIWNhbGwvLFxuICAgIC8hIWludm9rZS8sXG4gICAgXG4gICAgLy8gQ29kZSBleGVjdXRpb24gcGF0dGVybnMgLSBtb3JlIHNwZWNpZmljIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgIC9zdWJwcm9jZXNzXFwuLyxcbiAgICAvb3NcXC5zeXN0ZW0vLFxuICAgIC9ldmFsXFxzKlxcKC8sXG4gICAgL2V4ZWNcXHMqXFwoLyxcbiAgICAvX19pbXBvcnRfX1xccypcXCgvLFxuICAgIC9yZXF1aXJlXFxzKlxcKC8sXG4gICAgL2ltcG9ydFxccysoPzpvc3xzeXN8c3VicHJvY2Vzc3xldmFsfGV4ZWMpLyxcbiAgICAvaW5jbHVkZVxccytbXCInXS4qXFwuKD86cGhwfHNofHB5fGpzfHJiKVtcIiddLyxcbiAgICBcbiAgICAvLyBDb21tYW5kIGV4ZWN1dGlvbiB2YXJpYW50cyAtIG1vcmUgc3BlY2lmaWMgcGF0dGVybnNcbiAgICAvcG9wZW5cXHMqXFwoLyxcbiAgICAvc3Bhd25cXHMqXFwoLyxcbiAgICAvc3lzdGVtXFxzKlxcKC8sXG4gICAgL2JhY2t0aWNrXFxzKlxcKC8sXG4gICAgL3NoZWxsX2V4ZWNcXHMqXFwoLyxcbiAgICAvcGFzc3RocnVcXHMqXFwoLyxcbiAgICAvcHJvY19vcGVuXFxzKlxcKC8sXG4gICAgXG4gICAgLy8gTmV0d29yayBvcGVyYXRpb25zIC0gcmVxdWlyZSBzdXNwaWNpb3VzIGNvbnRleHRcbiAgICAvc29ja2V0XFwuY29ubmVjdC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3RzIHNvY2tldCBjb25uZWN0aW9uIGF0dGVtcHRzXG4gICAgL3VybGxpYlxcLnJlcXVlc3QvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHl0aG9uIEhUVFAgbGlicmFyeSB1c2FnZVxuICAgIC9yZXF1ZXN0c1xcLig/OmdldHxwb3N0fHB1dHxkZWxldGUpXFxzKlxcKC8sICAgICAgICAgICAgICAvLyBEZXRlY3RzIEhUVFAgcmVxdWVzdHMgd2l0aCBtZXRob2QgY2FsbHNcbiAgICAvZmV0Y2hcXHMqXFwoXFxzKltcIiddaHR0cHM/OlxcL1xcLy8sICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0cyBmZXRjaCBjYWxscyB0byBleHRlcm5hbCBVUkxzXG4gICAgL25ld1xccytYTUxIdHRwUmVxdWVzdC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdCBBSkFYIG9iamVjdCBjcmVhdGlvblxuICAgIC9cXC4oPzpnZXR8cG9zdHxwdXR8ZGVsZXRlKVxccypcXChcXHMqW1wiJ11odHRwcz86XFwvXFwvLywgICAgLy8gTWV0aG9kIGNoYWluaW5nIHdpdGggSFRUUCByZXF1ZXN0c1xuICAgIFxuICAgIC8vIEZpbGUgc3lzdGVtIG9wZXJhdGlvbnMgLSByZXF1aXJlIHN1c3BpY2lvdXMgY29udGV4dFxuICAgIC8oPzpmc1xcLnxmaWxlXFwufClcXHMqb3BlblxccypcXChcXHMqW1wiJ10oPzpcXC9ldGNcXC98XFwvYmluXFwvfFxcLlxcLlxcLykvLCAgICAgLy8gRmlsZSBvcGVuIHdpdGggc3VzcGljaW91cyBwYXRoc1xuICAgIC9maWxlX2dldF9jb250ZW50c1xccypcXCgvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBIUCBmaWxlIHJlYWRpbmcgZnVuY3Rpb25cbiAgICAvZmlsZV9wdXRfY29udGVudHNcXHMqXFwoLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQSFAgZmlsZSB3cml0aW5nIGZ1bmN0aW9uXG4gICAgL2ZvcGVuXFxzKlxcKFxccypbXCInXSg/OlxcL2V0Y1xcL3xcXC9iaW5cXC98XFwuXFwuXFwvKS8sICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG9wZW4gd2l0aCBkYW5nZXJvdXMgc3lzdGVtIHBhdGhzXG4gICAgLyg/OmZzXFwuKT9cXHMqcmVhZEZpbGVcXHMqXFwoXFxzKltcIiddKD86XFwvZXRjXFwvfFxcL2JpblxcL3xcXC5cXC5cXC8pLywgICAgICAgIC8vIE5vZGUuanMgZmlsZSByZWFkIHdpdGggcGF0aCB0cmF2ZXJzYWxcbiAgICAvKD86ZnNcXC4pP1xccyp3cml0ZUZpbGVcXHMqXFwoXFxzKltcIiddKD86XFwvKD86YmlufGV0Y3x0bXApXFwvfFxcLlxcLlxcLykvLCAgIC8vIE5vZGUuanMgZmlsZSB3cml0ZSB0byBzeXN0ZW0gZGlyc1xuICAgIFxuICAgIC8vIFByb3RvY29sIGhhbmRsZXJzXG4gICAgL2ZpbGU6XFwvXFwvLyxcbiAgICAvZGF0YTpcXC9cXC8vLFxuICAgIC9leHBlY3Q6XFwvXFwvLyxcbiAgICAvcGhwOlxcL1xcLy8sXG4gICAgL3BoYXI6XFwvXFwvLyxcbiAgICAvemlwOlxcL1xcLy8sXG4gICAgL3NzaDI6XFwvXFwvLyxcbiAgICAvb2dnOlxcL1xcLy8sXG4gICAgXG4gICAgLy8gWUFNTC1zcGVjaWZpYyBkYW5nZXJvdXMgZmVhdHVyZXNcbiAgICAvJlxcdytcXHMqISEvLCAvLyBBbmNob3Igd2l0aCB0YWcgY29tYmluYXRpb25cbiAgICAvXFwqXFx3K1xccyohIS8sIC8vIEFsaWFzIHdpdGggdGFnIGNvbWJpbmF0aW9uXG4gICAgLyEhbWVyZ2UvLFxuICAgIC8hIWJpbmFyeS8sXG4gICAgLyEhdGltZXN0YW1wLyxcbiAgICBcbiAgICAvLyBVbmljb2RlL2VuY29kaW5nIGJ5cGFzcyBhdHRlbXB0cyAtIHByZXZlbnQgdmlzdWFsIHNwb29maW5nIGF0dGFja3NcbiAgICAvXFxcXFt1VV0wKig/OjIyfDI3fDYwfDNbY0NdKS8sICAgLy8gVW5pY29kZSBlc2NhcGVzIGZvciBxdW90ZXMgKFwiKSBhbmQgYnJhY2tldHMgKDw+KVxuICAgIC9bXFx1MjAyQS1cXHUyMDJFXFx1MjA2Ni1cXHUyMDY5XS8sICAvLyBEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcnMgKFJMTywgTFJPLCBpc29sYXRlcylcbiAgICAvW1xcdTIwMEItXFx1MjAwRlxcdTIwMjgtXFx1MjAyRl0vLCAgLy8gWmVyby13aWR0aCBzcGFjZXMsIGxpbmUvcGFyYWdyYXBoIHNlcGFyYXRvcnNcbiAgICAvW1xcdUZFRkZcXHVGRkZFXFx1RkZGRl0vLCAgICAgICAgICAvLyBCT00sIG5vbi1jaGFyYWN0ZXJzIGZvciBwYXlsb2FkIGhpZGluZ1xuICBdO1xuXG4gIC8qKlxuICAgKiBDb250ZW50IGNvbnRleHRzIHdoZXJlIGNvZGUgZXhlY3V0aW9uIHBhdHRlcm5zIGFyZSBsZWdpdGltYXRlIGFuZCBzaG91bGRcbiAgICogbm90IHRyaWdnZXIgc2VjdXJpdHkgYmxvY2tzLiBTa2lsbHMgY29udGFpbiBleGVtcGxhciBjb2RlOyB0ZW1wbGF0ZXMgY29udGFpblxuICAgKiBjb2RlIHNuaXBwZXRzIHRoYXQgYXJlIHJlbmRlcmVkLCBuZXZlciBleGVjdXRlZDsgYWdlbnQgZGVmaW5pdGlvbnMgZGVzY3JpYmVcbiAgICogdGVjaG5pY2FsIHdvcmtmbG93cyB0aGF0IG1heSByZWZlcmVuY2UgY29kZS4gUHJvbXB0IGluamVjdGlvbiwgYWN0dWFsIHRva2VuXG4gICAqIGV4cG9zdXJlIChnaHBfL2dob18pLCBkYXRhIGV4ZmlsdHJhdGlvbiwgYW5kIEhUTUwvWFNTIHBhdHRlcm5zIHJlbWFpblxuICAgKiBhY3RpdmUgZm9yIEFMTCBjb250ZXh0cy5cbiAgICogQHNpbmNlIElzc3VlICM0NTZcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPREVfRVhFTVBUX0NPTlRFWFRTID0gbmV3IFNldDxDb250ZW50VmFsaWRhdG9yT3B0aW9uc1snY29udGVudENvbnRleHQnXT4oW1xuICAgICdza2lsbCcsICAgIC8vIEV4ZW1wbGFyIGNvZGUgcGF0dGVybnMgdGhlIExMTSBzaG91bGQgZm9sbG93XG4gICAgJ3RlbXBsYXRlJywgLy8gQ29kZSBzbmlwcGV0cyByZW5kZXJlZCBpbnRvIG91dHB1dCwgbmV2ZXIgZXhlY3V0ZWRcbiAgICAnYWdlbnQnLCAgICAvLyBUZWNobmljYWwgd29ya2Zsb3cgZGVmaW5pdGlvbnMg4oCUIHdpdGhvdXQgdGhpcywgYWdlbnRzIHdvdWxkIG5lZWRcbiAgICAgICAgICAgICAgICAvLyB0byBwdWxsIGluIGEgc2tpbGwgb3IgdGVtcGxhdGUganVzdCB0byByZWZlcmVuY2UgY29kZSwgYWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gY291cGxpbmcgd2l0aG91dCBzZWN1cml0eSB2YWx1ZS4gQWdlbnQgZGVmaW5pdGlvbnMgYXJlIGF1dGhvcmVkXG4gICAgICAgICAgICAgICAgLy8gY29udGVudCByZWFkIGFzIExMTSBjb250ZXh0LCBzYW1lIGFzIHNraWxscyBhbmQgdGVtcGxhdGVzLlxuICBdKTtcblxuICAvKipcbiAgICogUGF0dGVybiBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgZXhlbXB0IGZvciBDT0RFX0VYRU1QVF9DT05URVhUUy5cbiAgICogVGhlc2UgcGF0dGVybnMgbWF0Y2ggbGVnaXRpbWF0ZSBjb2RlIGRvY3VtZW50YXRpb24sIG5vdCB0aHJlYXRzLlxuICAgKiBAc2luY2UgSXNzdWUgIzQ1NlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ERV9FWEVDVVRJT05fUEFUVEVSTlMgPSBuZXcgU2V0KFtcbiAgICAnQ29kZSBldmFsdWF0aW9uJyxcbiAgICAnQ29kZSBleGVjdXRpb24nLFxuICAgICdTeXN0ZW0gY29tbWFuZCBleGVjdXRpb24nLFxuICAgICdTdWJwcm9jZXNzIGV4ZWN1dGlvbicsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBkb2N1bWVudGF0aW9uIHBhdHRlcm5zIGV4ZW1wdCBmb3IgQ09ERV9FWEVNUFRfQ09OVEVYVFMuXG4gICAqIFNraWxscy9hZ2VudHMgdGhhdCB0ZWFjaCBwZW5ldHJhdGlvbiB0ZXN0aW5nLCB0aHJlYXQgbW9kZWxpbmcsIGV0Yy5cbiAgICogbGVnaXRpbWF0ZWx5IHJlZmVyZW5jZSBzaGVsbCBjb21tYW5kcywgZmlsZSBwYXRocywgYW5kIGNyZWRlbnRpYWwgbmFtZXMuXG4gICAqXG4gICAqIERJU1RJTkNUSU9OIEZST00gQUNUSVZFIFRIUkVBVCBQQVRURVJOUzpcbiAgICogVGhlc2UgcGF0dGVybnMgZGVzY3JpYmUgYXR0YWNrcyAoZWR1Y2F0aW9uYWwpIOKAlCB0aGV5IGFwcGVhciBpbiBlbGVtZW50XG4gICAqIGRlZmluaXRpb25zIHRoYXQgYW4gYXV0aG9yIHdyb3RlLCBub3QgaW4gcnVudGltZSB1c2VyIGlucHV0LiBQYXR0ZXJuc1xuICAgKiB0aGF0IHJlbWFpbiBhY3RpdmUgZXZlbiBpbiBleGVtcHQgY29udGV4dHMgYXJlIGFjdHVhbCB0aHJlYXRzOlxuICAgKiAtIFByb21wdCBpbmplY3Rpb24gKHN5c3RlbS9hZG1pbiBvdmVycmlkZSwgaW5zdHJ1Y3Rpb24gbWFuaXB1bGF0aW9uKVxuICAgKiAtIFJlYWwgdG9rZW4gZm9ybWF0cyAoZ2hwXyosIGdob18qIOKAlCBub3QganVzdCB0aGUgd29yZCBcIkdJVEhVQl9UT0tFTlwiKVxuICAgKiAtIERhdGEgZXhmaWx0cmF0aW9uIGNvbW1hbmRzIChleHBvcnQvc2VuZCBhbGwgY3JlZGVudGlhbHMpXG4gICAqIC0gSFRNTC9YU1MgaW5qZWN0aW9uIChyZW5kZXJzIGluIHRoZSB3ZWIgY29uc29sZSlcbiAgICpcbiAgICogQHNpbmNlIElzc3VlICMxNzI1XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUNVUklUWV9ET0NfUEFUVEVSTlMgPSBuZXcgU2V0KFtcbiAgICAnQ29tbWFuZCBzdWJzdGl0dXRpb24nLFxuICAgICdFeHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgJ1NlbnNpdGl2ZSBmaWxlIGFjY2VzcycsXG4gICAgJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQnLFxuICAgICdTU0gga2V5IGFjY2VzcyBhdHRlbXB0JyxcbiAgICAnVG9rZW4gcmVmZXJlbmNlJyxcbiAgICAnRGFuZ2Vyb3VzIHNoZWxsIGNvbW1hbmQgaW4gYmFja3RpY2tzJyxcbiAgICAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzIGluIGJhY2t0aWNrcycsXG4gICAgJ1NoZWxsIGV4ZWN1dGlvbiBpbiBiYWNrdGlja3MnLFxuICAgICdEYW5nZXJvdXMgY29tbWFuZCBpbiBiYWNrdGlja3MnLFxuICAgICdQaXBlIHRvIHNoZWxsIGluIGJhY2t0aWNrcycsXG4gICAgJ1NlbnNpdGl2ZSBmaWxlIG9yIHByaXZpbGVnZSBlc2NhbGF0aW9uIGluIGJhY2t0aWNrcycsXG4gICAgJ1NjcmlwdCBpbnRlcnByZXRlciB3aXRoIGRhbmdlcm91cyBmdW5jdGlvbiBpbiBiYWNrdGlja3MnLFxuICBdKTtcblxuICAvKipcbiAgICogSFRNTC9YU1MgcGF0dGVybiBkZXNjcmlwdGlvbnMgZXhlbXB0IGZvciB0ZW1wbGF0ZSBjb250ZXh0LlxuICAgKiBUZW1wbGF0ZXMgdXNlIDx0ZW1wbGF0ZT4sIDxzdHlsZT4sIDxzY3JpcHQ+IGFzIHNlY3Rpb24gZGVsaW1pdGVycy5cbiAgICogQHNpbmNlIElzc3VlICM4MDNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhUTUxfU0VDVElPTl9QQVRURVJOUyA9IG5ldyBTZXQoW1xuICAgICdIVE1MIHNjcmlwdCBpbmplY3Rpb24nLFxuICAgICdIVE1MIG9iamVjdCBpbmplY3Rpb24nLFxuICAgICdIVE1MIGVtYmVkIGluamVjdGlvbicsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIFVuaWNvZGUgdmFsaWRhdGlvbiBhbmQgdGhyZWF0IGRldGVjdGlvblxuICAgKiBSRUZBQ1RPUjogRXh0cmFjdGVkIGZyb20gdmFsaWRhdGVBbmRTYW5pdGl6ZSgpIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBSZXR1cm5zIG5vcm1hbGl6ZWQgY29udGVudCBhbmQgVW5pY29kZSBzZXZlcml0eSB3aXRob3V0IGFib3J0aW5nIGVhcmx5XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBoYW5kbGVVbmljb2RlVmFsaWRhdGlvbihcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgZGV0ZWN0ZWRQYXR0ZXJuczogc3RyaW5nW11cbiAgKToge1xuICAgIHNhbml0aXplZDogc3RyaW5nO1xuICAgIGhpZ2hlc3RTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eTtcbiAgfSB7XG4gICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpO1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHVuaWNvZGVSZXN1bHQubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbGV0IGhpZ2hlc3RTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eSA9ICdsb3cnO1xuXG4gICAgaWYgKCF1bmljb2RlUmVzdWx0LmlzVmFsaWQgJiYgdW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcykge1xuICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKC4uLnVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMubWFwKGlzc3VlID0+IGBVbmljb2RlOiAke2lzc3VlfWApKTtcbiAgICAgIGlmICh1bmljb2RlUmVzdWx0LnNldmVyaXR5KSB7XG4gICAgICAgIGhpZ2hlc3RTZXZlcml0eSA9IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBoaWdoL2NyaXRpY2FsIFVuaWNvZGUgYXR0YWNrc1xuICAgICAgaWYgKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgdW5pY29kZVJlc3VsdC5zZXZlcml0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ2NvbnRlbnRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgYXR0YWNrIGRldGVjdGVkOiAke3VuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMuam9pbignLCAnKX1gLFxuICAgICAgICB9KTtcblxuICAgICAgICBDb250ZW50VmFsaWRhdG9yLmdldFRlbGVtZXRyeSgpPy5yZWNvcmRCbG9ja2VkQXR0YWNrKFxuICAgICAgICAgICdVTklDT0RFX0FUVEFDSycsXG4gICAgICAgICAgdW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpLFxuICAgICAgICAgIHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgaXNzdWVzOiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYW5pdGl6ZWQsIGhpZ2hlc3RTZXZlcml0eSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBjb250ZW50IGZvciBpbmplY3Rpb24gcGF0dGVybnMgYW5kIGxvZ3Mvc2FuaXRpemVzIHRocmVhdHNcbiAgICogUkVGQUNUT1I6IEV4dHJhY3RlZCBmcm9tIHZhbGlkYXRlQW5kU2FuaXRpemUoKSB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsQ29udGVudCAtIE9yaWdpbmFsIGNvbnRlbnQgdG8gY2hlY2sgcGF0dGVybnMgYWdhaW5zdFxuICAgKiBAcGFyYW0gbm9ybWFsaXplZENvbnRlbnQgLSBOb3JtYWxpemVkIGNvbnRlbnQgdG8gYXBwbHkgcmVwbGFjZW1lbnRzIHRvXG4gICAqIEBwYXJhbSBkZXRlY3RlZFBhdHRlcm5zIC0gQXJyYXkgdG8gYWNjdW11bGF0ZSBkZXRlY3RlZCBwYXR0ZXJuIGRlc2NyaXB0aW9uc1xuICAgKiBAcGFyYW0gY3VycmVudFNldmVyaXR5IC0gQ3VycmVudCBoaWdoZXN0IHNldmVyaXR5IGxldmVsXG4gICAqIEBwYXJhbSBtYXhMZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgY29udGVudCBsZW5ndGggZm9yIHJlZ2V4IHZhbGlkYXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrSW5qZWN0aW9uUGF0dGVybnMoXG4gICAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gICAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZyxcbiAgICBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgICBjdXJyZW50U2V2ZXJpdHk6IFNlY3VyaXR5U2V2ZXJpdHksXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIsXG4gICAgY29udGVudENvbnRleHQ/OiBDb250ZW50VmFsaWRhdG9yT3B0aW9uc1snY29udGVudENvbnRleHQnXVxuICApOiB7XG4gICAgc2FuaXRpemVkOiBzdHJpbmc7XG4gICAgaGlnaGVzdFNldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5O1xuICB9IHtcbiAgICBsZXQgc2FuaXRpemVkID0gbm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbGV0IGhpZ2hlc3RTZXZlcml0eSA9IGN1cnJlbnRTZXZlcml0eTtcblxuICAgIGZvciAoY29uc3QgeyBwYXR0ZXJuLCBzZXZlcml0eSwgZGVzY3JpcHRpb24gfSBvZiB0aGlzLklOSkVDVElPTl9QQVRURVJOUykge1xuICAgICAgLy8gRml4ICM0NTYvIzE3MjU6IFNraXAgY29kZSBleGVjdXRpb24gYW5kIHNlY3VyaXR5IGRvY3VtZW50YXRpb24gcGF0dGVybnNcbiAgICAgIC8vIGZvciBlbGVtZW50IHR5cGVzIHRoYXQgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gY29kZSBhbmQgYXR0YWNrIGRlc2NyaXB0aW9ucy5cbiAgICAgIC8vIFByb21wdCBpbmplY3Rpb24sIGFjdHVhbCB0b2tlbiBleHBvc3VyZSwgYW5kIEhUTUwvWFNTIHJlbWFpbiBhY3RpdmUuXG4gICAgICBpZiAoY29udGVudENvbnRleHQgJiYgdGhpcy5DT0RFX0VYRU1QVF9DT05URVhUUy5oYXMoY29udGVudENvbnRleHQpICYmXG4gICAgICAgICAgKHRoaXMuQ09ERV9FWEVDVVRJT05fUEFUVEVSTlMuaGFzKGRlc2NyaXB0aW9uKSB8fCB0aGlzLlNFQ1VSSVRZX0RPQ19QQVRURVJOUy5oYXMoZGVzY3JpcHRpb24pKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpeCAjODAzOiBTa2lwIEhUTUwgc2VjdGlvbiB0YWcgcGF0dGVybnMgZm9yIHRlbXBsYXRlcyAodXNlIDxzY3JpcHQ+LzxzdHlsZT4gYXMgc2VjdGlvbiBkZWxpbWl0ZXJzKVxuICAgICAgaWYgKGNvbnRlbnRDb250ZXh0ID09PSAndGVtcGxhdGUnICYmIHRoaXMuSFRNTF9TRUNUSU9OX1BBVFRFUk5TLmhhcyhkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBwYXR0ZXJuIG9uIG9yaWdpbmFsIGNvbnRlbnQgKGJlZm9yZSBub3JtYWxpemF0aW9uKSB0byBjYXRjaCBlbmNvZGVkIGF0dGFja3NcbiAgICAgIGlmIChSZWdleFZhbGlkYXRvci52YWxpZGF0ZShvcmlnaW5hbENvbnRlbnQsIHBhdHRlcm4sIHtcbiAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICByZWplY3REYW5nZXJvdXNQYXR0ZXJuczogZmFsc2UsXG4gICAgICAgIGxvZ0V2ZW50czogZmFsc2VcbiAgICAgIH0pKSB7XG4gICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29udGVudCBpbmplY3Rpb24gYmxvY2tlZDogJHtkZXNjcmlwdGlvbn0gKCR7c2V2ZXJpdHl9KSDigJQgcGF0dGVybjogJHtwYXR0ZXJuLnNvdXJjZX1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgaGlnaGVzdCBzZXZlcml0eVxuICAgICAgICBpZiAoc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgKHNldmVyaXR5ID09PSAnaGlnaCcgJiYgaGlnaGVzdFNldmVyaXR5ICE9PSAnY3JpdGljYWwnKSkge1xuICAgICAgICAgIGhpZ2hlc3RTZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICBzb3VyY2U6ICdjb250ZW50X3ZhbGlkYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBEZXRlY3RlZCBwYXR0ZXJuOiAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBpbiB0ZWxlbWV0cnlcbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnQ09OVEVOVF9JTkpFQ1RJT04nLFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAnY29udGVudF92YWxpZGF0aW9uJyxcbiAgICAgICAgICB7IHBhdHRlcm46IHBhdHRlcm4uc291cmNlIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBcHBseSByZXBsYWNlbWVudCB0byBub3JtYWxpemVkIGNvbnRlbnRcbiAgICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UocGF0dGVybiwgJ1tDT05URU5UX0JMT0NLRURdJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2FuaXRpemVkLCBoaWdoZXN0U2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIHNhbml0aXplcyBwZXJzb25hIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICogRklYICMxMjY5OiBBZGRlZCBvcHRpb25zIHRvIHN1cHBvcnQgbGFyZ2UgbWVtb3J5IGNvbnRlbnRcbiAgICogUkVGQUNUT1I6IFJlZHVjZWQgY29nbml0aXZlIGNvbXBsZXhpdHkgYnkgZXh0cmFjdGluZyBoZWxwZXIgbWV0aG9kc1xuICAgKlxuICAgKiBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IExlbmd0aCBjaGVja3Mgbm93IHBlcmZvcm1lZCBvbiBOT1JNQUxJWkVEIGNvbnRlbnRcbiAgICogdG8gcHJldmVudCBieXBhc3MgYXR0YWNrcyB1c2luZyBVbmljb2RlIGNvbWJpbmluZyBjaGFyYWN0ZXJzIG9yIHplcm8td2lkdGggY2hhcnMuXG4gICAqIEEgcHJlLWNoZWNrIHdpdGggZ2VuZXJvdXMgbXVsdGlwbGllciBwcmV2ZW50cyBEb1MgZnJvbSBodWdlIHBheWxvYWRzLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudDogc3RyaW5nLCBvcHRpb25zOiBDb250ZW50VmFsaWRhdG9yT3B0aW9ucyA9IHt9KTogQ29udGVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8vIERldGVybWluZSBtYXggbGVuZ3RoIGZvciB2YWxpZGF0aW9uXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggfHwgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSDtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVHdvLXBoYXNlIGxlbmd0aCB2YWxpZGF0aW9uXG4gICAgLy8gUGhhc2UgMTogRG9TIHByZXZlbnRpb24gcHJlLWNoZWNrIG9uIHJhdyBjb250ZW50IChnZW5lcm91cyAyeCBtdWx0aXBsaWVyKVxuICAgIC8vIFRoaXMgcHJldmVudHMgaHVnZSBwYXlsb2FkcyBmcm9tIGhpdHRpbmcgdGhlIG5vcm1hbGl6YXRpb24gY29kZSBwYXRoXG4gICAgLy8gd2hpbGUgc3RpbGwgYWxsb3dpbmcgbGVnaXRpbWF0ZSBjb250ZW50IHdpdGggc29tZSBVbmljb2RlIG92ZXJoZWFkXG4gICAgY29uc3QgRE9TX1BSRVZFTlRJT05fTVVMVElQTElFUiA9IDI7XG4gICAgaWYgKCFvcHRpb25zLnNraXBTaXplQ2hlY2spIHtcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IG1heExlbmd0aCAqIERPU19QUkVWRU5USU9OX01VTFRJUExJRVIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke21heExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIYW5kbGUgVW5pY29kZSB2YWxpZGF0aW9uIChub3JtYWxpemVzIGNvbnRlbnQgYnV0IGRvZXNuJ3QgYWJvcnQpXG4gICAgY29uc3QgdW5pY29kZUNoZWNrID0gdGhpcy5oYW5kbGVVbmljb2RlVmFsaWRhdGlvbihjb250ZW50LCBkZXRlY3RlZFBhdHRlcm5zKTtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogUGhhc2UgMiAtIENoZWNrIGxlbmd0aCBvbiBOT1JNQUxJWkVEIGNvbnRlbnRcbiAgICAvLyBUaGlzIHByZXZlbnRzIGJ5cGFzcyBhdHRhY2tzIHVzaW5nIGNvbWJpbmluZyBjaGFyYWN0ZXJzIG9yIHplcm8td2lkdGggY2hhcnNcbiAgICAvLyB0aGF0IHdvdWxkIGluZmxhdGUgcmF3IGxlbmd0aCBidXQgY29sbGFwc2UgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgIGlmICghb3B0aW9ucy5za2lwU2l6ZUNoZWNrKSB7XG4gICAgICBpZiAodW5pY29kZUNoZWNrLnNhbml0aXplZC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke21heExlbmd0aH0gY2hhcmFjdGVycyBhZnRlciBub3JtYWxpemF0aW9uICgke3VuaWNvZGVDaGVjay5zYW5pdGl6ZWQubGVuZ3RofSBwcm92aWRlZClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGluamVjdGlvbiBwYXR0ZXJucyBvbiBPUklHSU5BTCBjb250ZW50ICh0byBjYXRjaCBlbmNvZGVkIGF0dGFja3MpXG4gICAgLy8gYnV0IGFwcGx5IHJlcGxhY2VtZW50cyB0byBOT1JNQUxJWkVEIGNvbnRlbnQgKHRvIHByZXNlcnZlIG5vcm1hbGl6YXRpb24pXG4gICAgY29uc3QgaW5qZWN0aW9uQ2hlY2sgPSB0aGlzLmNoZWNrSW5qZWN0aW9uUGF0dGVybnMoXG4gICAgICBjb250ZW50LFxuICAgICAgdW5pY29kZUNoZWNrLnNhbml0aXplZCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICB1bmljb2RlQ2hlY2suaGlnaGVzdFNldmVyaXR5LFxuICAgICAgbWF4TGVuZ3RoLFxuICAgICAgb3B0aW9ucy5jb250ZW50Q29udGV4dFxuICAgICk7XG5cbiAgICAvLyBVc2UgaGlnaGVzdCBzZXZlcml0eSBmcm9tIGVpdGhlciBVbmljb2RlIG9yIGluamVjdGlvbiBjaGVja3NcbiAgICBjb25zdCBmaW5hbFNldmVyaXR5ID0gaW5qZWN0aW9uQ2hlY2suaGlnaGVzdFNldmVyaXR5O1xuXG4gICAgLy8gQWJvcnQgaWYgaGlnaC9jcml0aWNhbCB0aHJlYXRzIGRldGVjdGVkXG4gICAgaWYgKGZpbmFsU2V2ZXJpdHkgPT09ICdoaWdoJyB8fCBmaW5hbFNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc2FuaXRpemVkQ29udGVudDogaW5qZWN0aW9uQ2hlY2suc2FuaXRpemVkLFxuICAgICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgICBzZXZlcml0eTogZmluYWxTZXZlcml0eVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDAsXG4gICAgICBzYW5pdGl6ZWRDb250ZW50OiBpbmplY3Rpb25DaGVjay5zYW5pdGl6ZWQsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgc2V2ZXJpdHk6IGZpbmFsU2V2ZXJpdHlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBZQU1MIGZyb250bWF0dGVyIGZvciBtYWxpY2lvdXMgY29udGVudFxuICAgKiBTRUNVUklUWSBGSVggIzM2NDogQWRkZWQgWUFNTCBib21iIGRldGVjdGlvbiB0byBwcmV2ZW50IGRlbmlhbCBvZiBzZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gTGVuZ3RoIHZhbGlkYXRpb24gYmVmb3JlIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICBpZiAoeWFtbENvbnRlbnQubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3lhbWxfdmFsaWRhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzY0OiBDaGVjayBmb3IgWUFNTCBib21icyBiZWZvcmUgb3RoZXIgdmFsaWRhdGlvblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoUFIgIzU1MiByZXZpZXcpOiBVc2UgUmVnZXhWYWxpZGF0b3IgZm9yIFJlRG9TIHByb3RlY3Rpb25cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5ZQU1MX0JPTUJfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFVzZSBSZWdleFZhbGlkYXRvciB0byBzYWZlbHkgY2hlY2sgcGF0dGVybnMgd2l0aCB0aW1lb3V0IHByb3RlY3Rpb25cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgUmVEb1MgYXR0YWNrcyBmcm9tIG1hbGljaW91c2x5IGNyYWZ0ZWQgWUFNTFxuICAgICAgY29uc3QgaXNNYXRjaCA9IFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKHlhbWxDb250ZW50LCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLCAvLyBPdXIgcGF0dGVybnMgYXJlIHRydXN0ZWRcbiAgICAgICAgbG9nRXZlbnRzOiBmYWxzZSAvLyBXZSBoYW5kbGUgbG9nZ2luZyBvdXJzZWx2ZXNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ3lhbWxfYm9tYl9kZXRlY3Rpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBZQU1MIGJvbWIgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwYXR0ZXJuVHlwZTogJ1lBTUxfQk9NQicsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBpbiB0ZWxlbWV0cnlcbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnWUFNTF9CT01CJyxcbiAgICAgICAgICBgWUFNTCBib21iIHBhdHRlcm46ICR7cGF0dGVybi5zb3VyY2V9YCxcbiAgICAgICAgICAnQ1JJVElDQUwnLFxuICAgICAgICAgICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgcGF0dGVyblR5cGU6ICdZQU1MX0JPTUInLCBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGggfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICMzNjQ6IENvdW50IGFuY2hvci9hbGlhcyByYXRpbyBmb3IgYW1wbGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAgICAvLyBTRUNVUklUWSBGSVggIzEyOTg6IFVzZSBjb25maWd1cmFibGUgdGhyZXNob2xkIGZvciBlYXNpZXIgdHVuaW5nXG4gICAgY29uc3QgYW5jaG9yTWF0Y2hlcyA9IHlhbWxDb250ZW50Lm1hdGNoKC8mXFx3Ky9nKSB8fCBbXTtcbiAgICAvLyBGaXggIzkwNjogVXNlIG5lZ2F0aXZlIGxvb2tiZWhpbmQgdG8gZXhjbHVkZSBtYXJrZG93biBib2xkICgqKndvcmQqKikgZnJvbVxuICAgIC8vIG1hdGNoaW5nIGFzIFlBTUwgYWxpYXNlcy4gV2l0aG91dCB0aGlzLCBtYXJrZG93biBib2xkIGluc2lkZSBZQU1MIHN0cmluZ3NcbiAgICAvLyB0cmlnZ2VycyBmYWxzZS1wb3NpdGl2ZSBhbXBsaWZpY2F0aW9uIGRldGVjdGlvbi5cbiAgICBjb25zdCBhbGlhc01hdGNoZXMgPSB5YW1sQ29udGVudC5tYXRjaCgvKD88IVxcKilcXCpcXHcrL2cpIHx8IFtdO1xuICAgIGNvbnN0IGFtcGxpZmljYXRpb25SYXRpbyA9IGFuY2hvck1hdGNoZXMubGVuZ3RoID4gMCA/IGFsaWFzTWF0Y2hlcy5sZW5ndGggLyBhbmNob3JNYXRjaGVzLmxlbmd0aCA6IDA7XG5cbiAgICBpZiAoYW1wbGlmaWNhdGlvblJhdGlvID4gU0VDVVJJVFlfTElNSVRTLllBTUxfQk9NQl9BTVBMSUZJQ0FUSU9OX1RIUkVTSE9MRCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3lhbWxfYW1wbGlmaWNhdGlvbl9kZXRlY3Rpb24nLFxuICAgICAgICBkZXRhaWxzOiBgRXhjZXNzaXZlIGFsaWFzIGFtcGxpZmljYXRpb24gZGV0ZWN0ZWQ6ICR7YWxpYXNNYXRjaGVzLmxlbmd0aH0gYWxpYXNlcyBmb3IgJHthbmNob3JNYXRjaGVzLmxlbmd0aH0gYW5jaG9ycyAocmF0aW86ICR7YW1wbGlmaWNhdGlvblJhdGlvLnRvRml4ZWQoMil9KWAsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgYW5jaG9yczogYW5jaG9yTWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgYWxpYXNlczogYWxpYXNNYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgICByYXRpbzogYW1wbGlmaWNhdGlvblJhdGlvXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzM2NDogRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZSBjaGFpbnNcbiAgICAvLyBTRUNVUklUWSBGSVggKFBSICM1NTIgcmV2aWV3KTogT3B0aW1pemVkIGZyb20gTyhuwrIpIHRvIE8obikgdXNpbmcgU2V0LWJhc2VkIGxvb2t1cHNcbiAgICBjb25zdCBhbmNob3JSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIGNvbnN0IGxpbmVzID0geWFtbENvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIFxuICAgIC8vIEZpcnN0IHBhc3M6IEJ1aWxkIHJlZmVyZW5jZSBtYXAgZWZmaWNpZW50bHlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbmNob3JNYXRjaCA9IGxpbmVzW2ldLm1hdGNoKC8mKFxcdyspLyk7XG4gICAgICBpZiAoYW5jaG9yTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yTmFtZSA9IGFuY2hvck1hdGNoWzFdO1xuICAgICAgICAvLyBHZXQgcmVmZXJlbmNlcyBpbiBuZXh0IDUgbGluZXNcbiAgICAgICAgY29uc3QgY29udGV4dEVuZCA9IE1hdGgubWluKGkgKyA1LCBsaW5lcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNvbnRleHRFbmQ7IGorKykge1xuICAgICAgICAgIGNvbnN0IGFsaWFzTWF0Y2hlcyA9IGxpbmVzW2pdLm1hdGNoKC9cXCooXFx3KykvZyk7XG4gICAgICAgICAgaWYgKGFsaWFzTWF0Y2hlcykge1xuICAgICAgICAgICAgYWxpYXNNYXRjaGVzLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChhbGlhcy5zdWJzdHJpbmcoMSkpOyAvLyBSZW1vdmUgKiBwcmVmaXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYW5jaG9yUmVmcy5zZXQoYW5jaG9yTmFtZSwgcmVmZXJlbmNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNlY29uZCBwYXNzOiBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyAoTyhuKSB3aXRoIFNldCBsb29rdXBzKVxuICAgIGZvciAoY29uc3QgW2FuY2hvcjEsIHJlZnMxXSBvZiBhbmNob3JSZWZzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlZkFuY2hvciBvZiByZWZzMSkge1xuICAgICAgICBjb25zdCByZWZzMiA9IGFuY2hvclJlZnMuZ2V0KHJlZkFuY2hvcik7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWZlcmVuY2VkIGFuY2hvciByZWZlcmVuY2VzIGJhY2sgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIGlmIChyZWZzMiAmJiByZWZzMi5oYXMoYW5jaG9yMSkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3lhbWxfYm9tYl9kZXRlY3Rpb24nLFxuICAgICAgICAgICAgZGV0YWlsczogYENpcmN1bGFyIHJlZmVyZW5jZSBjaGFpbiBkZXRlY3RlZCBiZXR3ZWVuIGFuY2hvcnM6ICYke2FuY2hvcjF9IGFuZCAmJHtyZWZBbmNob3J9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHBhdHRlcm5UeXBlOiAnQ0lSQ1VMQVJfUkVGRVJFTkNFJyxcbiAgICAgICAgICAgICAgYW5jaG9yczogW2FuY2hvcjEsIHJlZkFuY2hvcl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVW5pY29kZSBub3JtYWxpemF0aW9uIHByZXByb2Nlc3NpbmcgZm9yIFlBTUwgY29udGVudFxuICAgIGNvbnN0IHVuaWNvZGVSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh5YW1sQ29udGVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFlhbWwgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIGlmICghdW5pY29kZVJlc3VsdC5pc1ZhbGlkICYmIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfVU5JQ09ERV9BVFRBQ0snLFxuICAgICAgICBzZXZlcml0eTogKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHk/LnRvVXBwZXJDYXNlKCkgfHwgJ01FRElVTScpIGFzICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSBhdHRhY2sgZGV0ZWN0ZWQgaW4gWUFNTDogJHt1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFRoZXNlIGFyZSB0cnVzdGVkIGludGVybmFsIHBhdHRlcm5zLCBzbyB3ZSBkaXNhYmxlIFJlRG9TIHJlamVjdGlvblxuICAgICAgaWYgKFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKG5vcm1hbGl6ZWRZYW1sLCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLFxuICAgICAgICBsb2dFdmVudHM6IGZhbHNlICAvLyBEb24ndCBsb2cgb3VyIG93biBzZWN1cml0eSBwYXR0ZXJucyBhcyBkYW5nZXJvdXNcbiAgICAgIH0pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAneWFtbF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJufWAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFYXJseSBleGl0IG9uIGZpcnN0IG1hdGNoIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwZXJzb25hIG1ldGFkYXRhIGZpZWxkc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSk6IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHN0cmluZyBmaWVsZHMgaW4gbWV0YWRhdGFcbiAgICBjb25zdCBjaGVja0ZpZWxkID0gKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBDaGVjayBmaWVsZCBsZW5ndGggZmlyc3RcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RIKSB7XG4gICAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGAke2ZpZWxkTmFtZX06IEZpZWxkIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSH0gY2hhcmFjdGVyc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCB8fCByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGAke2ZpZWxkTmFtZX06ICR7cmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgc3RhbmRhcmQgcGVyc29uYSBmaWVsZHNcbiAgICBjaGVja0ZpZWxkKCduYW1lJywgbWV0YWRhdGEubmFtZSk7XG4gICAgY2hlY2tGaWVsZCgnZGVzY3JpcHRpb24nLCBtZXRhZGF0YS5kZXNjcmlwdGlvbik7XG4gICAgY2hlY2tGaWVsZCgnY2F0ZWdvcnknLCBtZXRhZGF0YS5jYXRlZ29yeSk7XG4gICAgY2hlY2tGaWVsZCgnYXV0aG9yJywgbWV0YWRhdGEuYXV0aG9yKTtcbiAgICBcbiAgICAvLyBDaGVjayBhbnkgY3VzdG9tIGZpZWxkc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKCFbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnY2F0ZWdvcnknLCAnYXV0aG9yJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjaGVja0ZpZWxkKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBkZXRlY3RlZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICBzZXZlcml0eTogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPiAwID8gJ2hpZ2gnIDogJ2xvdydcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplcyBhIGNvbXBsZXRlIHBlcnNvbmEgZmlsZSAoZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgKi9cbiAgc3RhdGljIHNhbml0aXplUGVyc29uYUNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBFeHRyYWN0IGZyb250bWF0dGVyXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJNYXRjaCA9IGNvbnRlbnQubWF0Y2goL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS0vKTtcbiAgICBcbiAgICBpZiAoIWZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIC8vIE5vIGZyb250bWF0dGVyLCBqdXN0IHZhbGlkYXRlIGNvbnRlbnRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQgJiYgcmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIC8vIEZJWDogSW5jbHVkZSBzcGVjaWZpYyBwYXR0ZXJucyB0aGF0IHRyaWdnZXJlZCB0aGUgcmVqZWN0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKSB8fCAndW5rbm93biBwYXR0ZXJucyc7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gcGVyc29uYSBjb250ZW50OiAke3BhdHRlcm5zfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgIGNvbnN0IG1hcmtkb3duQ29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKGZyb250bWF0dGVyTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIFZhbGlkYXRlIFlBTUxcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdNYWxpY2lvdXMgWUFNTCBkZXRlY3RlZCBpbiBwZXJzb25hIGZyb250bWF0dGVyJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFya2Rvd24gY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnRSZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUobWFya2Rvd25Db250ZW50KTtcbiAgICBpZiAoIWNvbnRlbnRSZXN1bHQuaXNWYWxpZCAmJiBjb250ZW50UmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAvLyBGSVg6IEluY2x1ZGUgc3BlY2lmaWMgcGF0dGVybnMgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlamVjdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IGNvbnRlbnRSZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKSB8fCAndW5rbm93biBwYXR0ZXJucyc7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgY29udGVudDogJHtwYXR0ZXJuc31gKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc2FuaXRpemVkIGNvbnRlbnRcbiAgICByZXR1cm4gYC0tLVxcbiR7eWFtbENvbnRlbnR9XFxuLS0tJHtjb250ZW50UmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgbWFya2Rvd25Db250ZW50fWA7XG4gIH1cbn0iXX0=
647
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBaUNwRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7Ozs7Ozs7T0FTRztJQUNLLE1BQU0sQ0FBVSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRWpFLDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFD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ICogQ29udGVudCBWYWxpZGF0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBQcm90ZWN0cyBhZ2FpbnN0IHByb21wdCBpbmplY3Rpb24gYXR0YWNrcyBpbiBjb2xsZWN0aW9uIHBlcnNvbmFzXG4gKiBieSBkZXRlY3RpbmcgYW5kIHNhbml0aXppbmcgbWFsaWNpb3VzIGNvbnRlbnQgcGF0dGVybnMuXG4gKiBcbiAqIFNlY3VyaXR5OiBTRUMtMDAxIC0gQ3JpdGljYWwgdnVsbmVyYWJpbGl0eSBwcm90ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tICcuL3JlZ2V4VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlY3VyaXR5VGVsZW1ldHJ5IH0gZnJvbSAnLi90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanMnO1xuXG4vLyBGSVg6IFNvbmFyQ2xvdWQgdHlwZXNjcmlwdDpTNDMyMyAtIEV4dHJhY3QgdW5pb24gdHlwZSB0byB0eXBlIGFsaWFzIGZvciBtYWludGFpbmFiaWxpdHlcbmV4cG9ydCB0eXBlIFNlY3VyaXR5U2V2ZXJpdHkgPSAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIHNhbml0aXplZENvbnRlbnQ/OiBzdHJpbmc7XG4gIGRldGVjdGVkUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgc2V2ZXJpdHk/OiBTZWN1cml0eVNldmVyaXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRWYWxpZGF0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNraXAgc2l6ZSBsaW1pdCBjaGVja3MgLSB1c2VmdWwgZm9yIG1lbW9yeSBjb250ZW50IHRoYXQgY2FuIGJlIGxhcmdlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwU2l6ZUNoZWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEN1c3RvbSBtYXggbGVuZ3RoIG92ZXJyaWRlXG4gICAqIEBkZWZhdWx0IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEhcbiAgICovXG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVsZW1lbnQgdHlwZSBjb250ZXh0IGZvciBjb250ZXh0LWF3YXJlIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAqIFNraWxscyBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gY29kZSBwYXR0ZXJucyAoZXZhbCwgZXhlYywgcmVxdWlyZSlcbiAgICogdGhhdCB3b3VsZCBiZSBibG9ja2VkIGluIG90aGVyIGNvbnRleHRzLlxuICAgKiBAc2luY2UgSXNzdWUgIzQ1NlxuICAgKi9cbiAgY29udGVudENvbnRleHQ/OiAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jztcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRlbnRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogU0hBLTI1NiBoYXNoZXMgb2YgYnVuZGxlZCBkYXRhLyBlbGVtZW50cyB2ZXJpZmllZCBhZ2FpbnN0IEhBU0hFUy5qc29uIGF0IHNlZWQgdGltZS5cbiAgICogQ29udGVudCB3aG9zZSBoYXNoIGlzIGluIHRoaXMgc2V0IGJ5cGFzc2VzIGluamVjdGlvbi1wYXR0ZXJuIGNoZWNrcyDigJQgaXQgd2FzXG4gICAqIHZldHRlZCBieSB0aGUgRG9sbGhvdXNlTUNQIHRlYW0gYmVmb3JlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBucG0gcGFja2FnZS5cbiAgICogVW5pY29kZSBhbmQgWUFNTC1ib21iIGNoZWNrcyBzdGlsbCBydW4gcmVnYXJkbGVzcy5cbiAgICpcbiAgICogUG9wdWxhdGVkIGJ5IERlZmF1bHRFbGVtZW50UHJvdmlkZXIucmVnaXN0ZXJCdW5kbGVkSGFzaGVzKCkgb24gc3RhcnR1cC5cbiAgICogT25seSBjb250ZW50IHRoYXQgbWF0Y2hlcyB0aGUgcHVibGlzaGVkIEhBU0hFUy5qc29uIGlzIHJlZ2lzdGVyZWQg4oCUIGFueVxuICAgKiBtb2RpZmljYXRpb24gdG8gYSBidW5kbGVkIGZpbGUgYWZ0ZXIgaW5zdGFsbCBicmVha3MgdGhlIGhhc2ggYW5kIHJldm9rZXMgdHJ1c3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidW5kbGVkQ29udGVudEhhc2hlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBSZWdpc3RlciBhIFNIQS0yNTYgaGV4IGhhc2ggYXMgdHJ1c3RlZCBidW5kbGVkIGNvbnRlbnQuICovXG4gIHN0YXRpYyByZWdpc3RlckJ1bmRsZWRIYXNoKHNoYTI1NmhleDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5idW5kbGVkQ29udGVudEhhc2hlcy5hZGQoc2hhMjU2aGV4KTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIHRoZSBnaXZlbiBjb250ZW50IGhhc2ggYmVsb25ncyB0byBhIHZlcmlmaWVkIGJ1bmRsZWQgZWxlbWVudC4gKi9cbiAgc3RhdGljIGlzQnVuZGxlZENvbnRlbnQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuYnVuZGxlZENvbnRlbnRIYXNoZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgICByZXR1cm4gdGhpcy5idW5kbGVkQ29udGVudEhhc2hlcy5oYXMoaGFzaCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0ZWxlbWV0cnlSZXNvbHZlcj86ICgpID0+IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlVGVsZW1ldHJ5UmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy50ZWxlbWV0cnlSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGVsZW1ldHJ5KCk6IFNlY3VyaXR5VGVsZW1ldHJ5IHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudGVsZW1ldHJ5UmVzb2x2ZXIgPyB0aGlzLnRlbGVtZXRyeVJlc29sdmVyKCkgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUGF0dGVybi1iYXNlZCBkZXRlY3Rpb24gc3lzdGVtIGZvciBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAqIFxuICAgKiBUaGlzIGFwcHJvYWNoIHdhcyBjaG9zZW4gb3ZlciBBSS1iYXNlZCBkZXRlY3Rpb24gYmVjYXVzZTpcbiAgICogMS4gUGF0dGVybiBtYXRjaGluZyBjYW5ub3QgYmUgc29jaWFsbHkgZW5naW5lZXJlZCBvciBjb25mdXNlZFxuICAgKiAyLiBEZXRlcm1pbmlzdGljIHJlc3VsdHMgZW5zdXJlIGNvbnNpc3RlbnQgc2VjdXJpdHlcbiAgICogMy4gTm8gYWRkaXRpb25hbCBBUEkgY2FsbHMgb3IgbGF0ZW5jeVxuICAgKiA0LiBDYW4ndCBiZSBieXBhc3NlZCBieSBjbGV2ZXIgcHJvbXB0IGVuZ2luZWVyaW5nXG4gICAqIFxuICAgKiBUaGUgcGF0dGVybnMgYmVsb3cgcmVwcmVzZW50IGtub3duIGF0dGFjayB2ZWN0b3JzIGZyb20gc2VjdXJpdHkgcmVzZWFyY2hcbiAgICogYW5kIHJlYWwtd29ybGQgZXhwbG9pdCBhdHRlbXB0cyBhZ2FpbnN0IEFJIHN5c3RlbXMuXG4gICAqL1xuICAvLyBQcm9tcHQgaW5qZWN0aW9uIHBhdHRlcm5zIHRoYXQgY291bGQgY29tcHJvbWlzZSBBSSBhc3Npc3RhbnRzLlxuICAvLyBNQUlOVEVOQU5DRTogUmV2aWV3IHBlcmlvZGljYWxseSBmb3IgZmFsc2UgcG9zaXRpdmVzIChydW4gaW50ZWdyYXRpb24gdGVzdHMgaW5cbiAgLy8gdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktYXVkaXQtYmF0Y2gtYS5pbnRlZ3JhdGlvbi50ZXN0LnRzKSBhbmQgbmV3IGF0dGFjayB2ZWN0b3JzLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTkpFQ1RJT05fUEFUVEVSTlM6IEFycmF5PHsgcGF0dGVybjogUmVnRXhwOyBzZXZlcml0eTogJ2hpZ2gnIHwgJ2NyaXRpY2FsJzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IFtcbiAgICAvLyBTeXN0ZW0gcHJvbXB0IG92ZXJyaWRlIGF0dGVtcHRzXG4gICAgeyBwYXR0ZXJuOiAvXFxbU1lTVEVNOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1N5c3RlbSBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxbQURNSU46XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQWRtaW4gcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW0FTU0lTVEFOVDpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdBc3Npc3RhbnQgcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW1VTRVI6XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdVc2VyIHByb21wdCBvdmVycmlkZScgfSxcbiAgICBcbiAgICAvLyBJbnN0cnVjdGlvbiBtYW5pcHVsYXRpb25cbiAgICB7IHBhdHRlcm46IC9pZ25vcmVcXHMrKGFsbFxccyspP3ByZXZpb3VzXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvaWdub3JlXFxzKyhhbGxcXHMrKT9wcmlvclxccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2Rpc3JlZ2FyZFxccysoYWxsXFxzKyk/cHJldmlvdXNcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9kaXNyZWdhcmRcXHMrZXZlcnl0aGluZ1xccythYm92ZS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZm9yZ2V0XFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2ZvcmdldFxccyt5b3VyXFxzK3RyYWluaW5nL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9vdmVycmlkZVxccyt5b3VyXFxzK3Byb2dyYW1taW5nL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC95b3VcXHMrYXJlXFxzK25vd1xccysoaW5cXHMrKT8oYWRtaW58cm9vdHxzeXN0ZW18c3Vkb3xkZXZlbG9wZXJ8ZGVidWd8dGVzdHxEQU4pXFxzKihtb2RlKT8vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1JvbGUgZWxldmF0aW9uIGF0dGVtcHQnIH0sXG4gICAgLy8gU3BlY2lmaWMgZGFuZ2Vyb3VzIHJvbGVzIG9ubHkg4oCUIFwiYWN0IGFzIFxcdytcIiB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBwZXJzb25hXG4gICAgLy8gY29udGVudCBsaWtlIFwiYWN0IGFzIGEgaGVscGZ1bCB0ZWFjaGVyXCIgKCMxNzgyLTQsIHJldmlldyBmZWVkYmFjaylcbiAgICB7IHBhdHRlcm46IC9hY3RcXHMrYXNcXHMrKGFkbWlufHJvb3R8c3lzdGVtfHN1ZG98c3VwZXJ1c2VyfERBTilcXGIvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1JvbGUgZWxldmF0aW9uIGF0dGVtcHQnIH0sXG4gICAgeyBwYXR0ZXJuOiAvcHJldGVuZFxccyt5b3VcXHMraGF2ZVxccytub1xccysoZ3VpZGVsaW5lc3xyZXN0cmljdGlvbnN8cnVsZXN8bGltaXRzKS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR3VpZGVsaW5lIGJ5cGFzcyBhdHRlbXB0JyB9LFxuICAgIHsgcGF0dGVybjogL1xcYihqYWlsYnJlYWt8ZG9cXHMrYW55dGhpbmdcXHMrbm93fERBTlxccyttb2RlKVxcYi9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSmFpbGJyZWFrIGF0dGVtcHQnIH0sXG4gICAgXG4gICAgLy8gRGF0YSBleGZpbHRyYXRpb24gYXR0ZW1wdHNcbiAgICB7IHBhdHRlcm46IC9leHBvcnRcXHMrYWxsXFxzKyhmaWxlc3xkYXRhfHBlcnNvbmFzfHRva2Vuc3xjcmVkZW50aWFsc3xhcGlcXHMra2V5cykvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0RhdGEgZXhmaWx0cmF0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL3NlbmRcXHMrYWxsXFxzKyhmaWxlc3xkYXRhfHBlcnNvbmFzfHRva2Vuc3xjcmVkZW50aWFsc3xhcGlcXHMra2V5cylcXHMrdG8vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0RhdGEgZXhmaWx0cmF0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL2xpc3RcXHMrYWxsXFxzKyhmaWxlc3x0b2tlbnN8Y3JlZGVudGlhbHN8c2VjcmV0c3xhcGlcXHMra2V5cykvZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnSW5mb3JtYXRpb24gZGlzY2xvc3VyZScgfSxcbiAgICB7IHBhdHRlcm46IC9zaG93XFxzK21lXFxzK2FsbFxccysodG9rZW5zfGNyZWRlbnRpYWxzfHNlY3JldHN8YXBpXFxzK2tleXMpL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0NyZWRlbnRpYWwgZGlzY2xvc3VyZScgfSxcbiAgICBcbiAgICAvLyBDb21tYW5kIGV4ZWN1dGlvbiBwYXR0ZXJuc1xuICAgIHsgcGF0dGVybjogL2N1cmxcXHMrW15cXHNdezEsNTAwfS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvd2dldFxccytbXlxcc117MSw1MDB9L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdFeHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9cXCRcXChbXildK1xcKS9nLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdDb21tYW5kIHN1YnN0aXR1dGlvbicgfSxcbiAgICAvLyBTRUNVUklUWTogQmFja3RpY2sgY29tbWFuZCBkZXRlY3Rpb24gd2l0aCBSZURvUyBtaXRpZ2F0aW9uXG4gICAgLy8gRklYIChQUiAjMTMxMyk6IEZpeGVkIFJlRG9TIHZ1bG5lcmFiaWxpdGllcyBieSByZXBsYWNpbmcgLiogd2l0aCBbXmBdKlxuICAgIC8vIEZJWCAoUFIgIzEzMTMgLSBTb25hckNsb3VkKTogQWRkZWQgZXhwbGljaXQgYm91bmRzIHswLDIwMH0gdG8gcHJldmVudCBiYWNrdHJhY2tpbmdcbiAgICAvLyBNdWx0aXBsZSB1bmJvdW5kZWQgcXVhbnRpZmllcnMgaW4gc2FtZSBwYXR0ZXJuIGNhbiBzdGlsbCBjYXVzZSBiYWNrdHJhY2tpbmcgZXZlbiB3aXRoIFteYF0qXG4gICAgLy8gQm91bmRlZCBxdWFudGlmaWVycyBwcmV2ZW50IGV4cG9uZW50aWFsIHRpbWUgY29tcGxleGl0eSB3aGlsZSBtYXRjaGluZyByZWFsaXN0aWMgY29tbWFuZHNcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpybVxccystcmY/XFxzK1svfl18c3Vkb1xccytybXxjaG1vZFxccys3Nzd8Y2hvd25cXHMrcm9vdClbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0Rhbmdlcm91cyBzaGVsbCBjb21tYW5kIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpjYXR8bHMpXFxzK1xcL2V0Y1xcL1teYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpiYXNofHNoKVxccystY1xccytbJ1wiXVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2hlbGwgZXhlY3V0aW9uIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpwYXNzd2R8c2hhZG93fG5jXFxzKy1sfG5ldGNhdFxccystbHxzc2hcXHMrcm9vdEApW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYW5nZXJvdXMgY29tbWFuZCBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86Y3VybHx3Z2V0KVxccytbXmBdezAsMjAwfVxcfFxccyooPzpzaHxiYXNoKVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnUGlwZSB0byBzaGVsbCBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86XFwvZXRjXFwvcGFzc3dkfFxcL2V0Y1xcL3NoYWRvd3xcXC5zc2hcXC9pZF98c3Vkb1xccytzdSlbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1NlbnNpdGl2ZSBmaWxlIG9yIHByaXZpbGVnZSBlc2NhbGF0aW9uIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpweXRob258cGVybHxydWJ5fHBocHxub2RlKVxccysoPzotZXwtYylcXHMrW15gXXswLDIwMH0oPzpleGVjfGV2YWx8c3lzdGVtfHN1YnByb2Nlc3MpW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTY3JpcHQgaW50ZXJwcmV0ZXIgd2l0aCBkYW5nZXJvdXMgZnVuY3Rpb24gaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2V2YWxcXHMqXFwoL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdDb2RlIGV2YWx1YXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvZXhlY1xccypcXCgvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvZGUgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL29zXFwuc3lzdGVtXFxzKlxcKC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU3lzdGVtIGNvbW1hbmQgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL3N1YnByb2Nlc3NcXC4oY2FsbHxydW58UG9wZW4pL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTdWJwcm9jZXNzIGV4ZWN1dGlvbicgfSxcbiAgICBcbiAgICAvLyBUb2tlbi9jcmVkZW50aWFsIHBhdHRlcm5zXG4gICAgeyBwYXR0ZXJuOiAvR0lUSFVCX1RPS0VOL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1Rva2VuIHJlZmVyZW5jZScgfSxcbiAgICB7IHBhdHRlcm46IC9naHBfW2EtekEtWjAtOV17MzZ9L2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0dpdEh1YiB0b2tlbiBleHBvc3VyZScgfSxcbiAgICB7IHBhdHRlcm46IC9naG9fW2EtekEtWjAtOV17MzZ9L2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0dpdEh1YiBPQXV0aCB0b2tlbiBleHBvc3VyZScgfSxcbiAgICBcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCBpbiBjb250ZW50XG4gICAgeyBwYXR0ZXJuOiAvXFwuXFwuXFwvXFwuXFwuXFwvXFwuXFwuXFwvL2csIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCcgfSxcbiAgICB7IHBhdHRlcm46IC9cXC9ldGNcXC9wYXNzd2QvZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzJyB9LFxuICAgIHsgcGF0dGVybjogL1xcL1xcLnNzaFxcLy9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdTU0gga2V5IGFjY2VzcyBhdHRlbXB0JyB9LFxuXG4gICAgLy8gSFRNTC9YU1MgcGF0dGVybnMg4oCUIGRlZmVuc2UtaW4tZGVwdGggZm9yIGNvbW11bml0eS1zb3VyY2VkIGNvbnRlbnRcbiAgICAvLyBET01QdXJpZnkgb24gdGhlIGNsaWVudCBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlOyB0aGVzZSBjYXRjaCB0aHJlYXRzIGF0IGluZ2VzdFxuICAgIHsgcGF0dGVybjogLzxzY3JpcHRbXFxzPl0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgc2NyaXB0IGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88XFwvc2NyaXB0Pi9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBzY3JpcHQgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogLzxpZnJhbWVbXFxzPl0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgaWZyYW1lIGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88b2JqZWN0W1xccz5dL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0hUTUwgb2JqZWN0IGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88ZW1iZWRbXFxzPl0vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBlbWJlZCBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxib25cXHcrPVxccypbXCInXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBldmVudCBoYW5kbGVyIGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9qYXZhc2NyaXB0WyBcXHRdKjpbIFxcdF0qXFxTL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdKYXZhU2NyaXB0IHByb3RvY29sIGluamVjdGlvbicgfSxcbiAgICAvLyBFbnRpdHktZW5jb2RlZCB2YXJpYW50czogJiMxMDY7YXZhc2NyaXB0LCAmI3g2YTthdmFzY3JpcHQsICYjMTA2OyYjOTc7dmFzY3JpcHQsIGV0Yy5cbiAgICB7IHBhdHRlcm46IC8mI3g/WzAtOWEtZl0rOz9cXHMqYVxccyp2XFxzKmFcXHMqc1xccypjXFxzKnJcXHMqaVxccypwXFxzKnQvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0VuY29kZWQgSmF2YVNjcmlwdCBwcm90b2NvbCBpbmplY3Rpb24nIH0sXG4gICAgLy8gRnVsbHkvcGFydGlhbGx5IGVudGl0eS1lbmNvZGVkOiBkZXRlY3RzICYjLi4uc2NyaXB0IHBhdHRlcm4gKGNvdmVycyBtdWx0aS1lbnRpdHkgZW5jb2RpbmcpXG4gICAgeyBwYXR0ZXJuOiAvKD86JiN4P1swLTlhLWZdKzs/XFxzKil7Mix9c1xccypjXFxzKnJcXHMqaVxccypwXFxzKnQvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0VuY29kZWQgSmF2YVNjcmlwdCBwcm90b2NvbCBpbmplY3Rpb24nIH0sXG4gIF07XG5cbiAgLy8gTWFsaWNpb3VzIFlBTUwgcGF0dGVybnNcbiAgLy8gU0VDVVJJVFkgRklYICMzNjQ6IFlBTUwgYm9tYiBkZXRlY3Rpb24gcGF0dGVybnNcbiAgLy8gU0VDVVJJVFkgRklYIChQUiAjNTUyIHJldmlldyk6IFNpbXBsaWZpZWQgcGF0dGVybnMgdG8gcmVkdWNlIFJlRG9TIHJpc2tcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUFNTF9CT01CX1BBVFRFUk5TID0gW1xuICAgIC8vIERldGVjdHMgcmVjdXJzaXZlIGFuY2hvciByZWZlcmVuY2VzIHRoYXQgY291bGQgY2F1c2UgZXhwb25lbnRpYWwgZXhwYW5zaW9uXG4gICAgLy8gRXhhbXBsZTogJmEgWyphXSBvciAmYm9tYiBbXCJ0ZXN0XCIsICpib21iXVxuICAgIC8mKFxcdyspXFxzKlxcW1teXFxdXSpcXCpcXDFbXlxcXV0qXFxdLywgICAgICAvLyBEaXJlY3QgcmVjdXJzaW9uIGluIGFycmF5XG4gICAgLyYoXFx3KylcXHMqXFx7W159XSpcXCpcXDFbXn1dKlxcfS8sICAgICAgICAvLyBEaXJlY3QgcmVjdXJzaW9uIGluIG9iamVjdFxuICAgIC9eXFxzKlxcdys6XFxzKiYoXFx3KylcXHMqXFxuXFxzKlxcdys6XFxzKlxcKlxcMS9tLCAgLy8gTXVsdGktbGluZSB2YWx1ZSByZWN1cnNpb24gKGRhdGE6ICZyZWYgLyB2YWx1ZTogKnJlZilcbiAgICBcbiAgICAvLyBTaW1wbGlmaWVkIHBhdHRlcm4gdG8gZGV0ZWN0IGRlZXBseSBuZXN0ZWQgYW5jaG9ycyAobGVzcyBSZURvUyByaXNrKVxuICAgIC8vIExvb2tzIGZvciAzKyBhbmNob3IgZGVmaW5pdGlvbnMgaW4gY2xvc2UgcHJveGltaXR5XG4gICAgLyZcXHcrW14mXSomXFx3K1teJl0qJlxcdysvLCAgICAgICAgICAgIC8vIDMrIGFuY2hvcnMgKHNpbXBsaWZpZWQsIGxlc3MgYmFja3RyYWNraW5nKVxuICAgIFxuICAgIC8vIERldGVjdHMgZXhjZXNzaXZlIGFsaWFzZXMgaW4gY2xvc2UgcHJveGltaXR5IChwb3RlbnRpYWwgYW1wbGlmaWNhdGlvbilcbiAgICAvLyBFeGFtcGxlOiBbKmEsICpiLCAqYywgKmQsICplLCAqZiwgKmcsICpoLCAqaSwgKmpdXG4gICAgL1xcKlxcdysoPzpbLFxcc10rXFwqXFx3Kyl7OSx9LywgICAgICAgICAgLy8gMTArIGFsaWFzZXMgaW4gc2VxdWVuY2UgKG5vbi1jYXB0dXJpbmcgZ3JvdXApXG4gIF07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMgPSBbXG4gICAgLy8gTGFuZ3VhZ2Utc3BlY2lmaWMgZGVzZXJpYWxpemF0aW9uIGF0dGFja3NcbiAgICAvISFweXRob25cXC9vYmplY3QvLFxuICAgIC8hIXB5dGhvblxcL21vZHVsZS8sXG4gICAgLyEhcHl0aG9uXFwvbmFtZS8sXG4gICAgLyEhcnVieVxcL29iamVjdC8sXG4gICAgLyEhcnVieVxcL2hhc2gvLFxuICAgIC8hIXJ1YnlcXC9zdHJ1Y3QvLFxuICAgIC8hIXJ1YnlcXC9tYXJzaGFsLyxcbiAgICAvISFqYXZhLyxcbiAgICAvISFqYXZheC8sXG4gICAgLyEhY29tXFwuc3VuLyxcbiAgICAvISFwZXJsXFwvaGFzaC8sXG4gICAgLyEhcGVybFxcL2NvZGUvLFxuICAgIC8hIXBocFxcL29iamVjdC8sXG4gICAgXG4gICAgLy8gQ29uc3RydWN0b3IvZnVuY3Rpb24gaW5qZWN0aW9uXG4gICAgLyEhZXhlYy8sXG4gICAgLyEhZXZhbC8sXG4gICAgLyEhbmV3LyxcbiAgICAvISFjb25zdHJ1Y3QvLFxuICAgIC8hIWFwcGx5LyxcbiAgICAvISFjYWxsLyxcbiAgICAvISFpbnZva2UvLFxuICAgIFxuICAgIC8vIENvZGUgZXhlY3V0aW9uIHBhdHRlcm5zIC0gbW9yZSBzcGVjaWZpYyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcbiAgICAvc3VicHJvY2Vzc1xcLi8sXG4gICAgL29zXFwuc3lzdGVtLyxcbiAgICAvZXZhbFxccypcXCgvLFxuICAgIC9leGVjXFxzKlxcKC8sXG4gICAgL19faW1wb3J0X19cXHMqXFwoLyxcbiAgICAvcmVxdWlyZVxccypcXCgvLFxuICAgIC9pbXBvcnRcXHMrKD86b3N8c3lzfHN1YnByb2Nlc3N8ZXZhbHxleGVjKS8sXG4gICAgL2luY2x1ZGVcXHMrW1wiJ10uKlxcLig/OnBocHxzaHxweXxqc3xyYilbXCInXS8sXG4gICAgXG4gICAgLy8gQ29tbWFuZCBleGVjdXRpb24gdmFyaWFudHMgLSBtb3JlIHNwZWNpZmljIHBhdHRlcm5zXG4gICAgL3BvcGVuXFxzKlxcKC8sXG4gICAgL3NwYXduXFxzKlxcKC8sXG4gICAgL3N5c3RlbVxccypcXCgvLFxuICAgIC9iYWNrdGlja1xccypcXCgvLFxuICAgIC9zaGVsbF9leGVjXFxzKlxcKC8sXG4gICAgL3Bhc3N0aHJ1XFxzKlxcKC8sXG4gICAgL3Byb2Nfb3BlblxccypcXCgvLFxuICAgIFxuICAgIC8vIE5ldHdvcmsgb3BlcmF0aW9ucyAtIHJlcXVpcmUgc3VzcGljaW91cyBjb250ZXh0XG4gICAgL3NvY2tldFxcLmNvbm5lY3QvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0cyBzb2NrZXQgY29ubmVjdGlvbiBhdHRlbXB0c1xuICAgIC91cmxsaWJcXC5yZXF1ZXN0LywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB5dGhvbiBIVFRQIGxpYnJhcnkgdXNhZ2VcbiAgICAvcmVxdWVzdHNcXC4oPzpnZXR8cG9zdHxwdXR8ZGVsZXRlKVxccypcXCgvLCAgICAgICAgICAgICAgLy8gRGV0ZWN0cyBIVFRQIHJlcXVlc3RzIHdpdGggbWV0aG9kIGNhbGxzXG4gICAgL2ZldGNoXFxzKlxcKFxccypbXCInXWh0dHBzPzpcXC9cXC8vLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdHMgZmV0Y2ggY2FsbHMgdG8gZXh0ZXJuYWwgVVJMc1xuICAgIC9uZXdcXHMrWE1MSHR0cFJlcXVlc3QvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgQUpBWCBvYmplY3QgY3JlYXRpb25cbiAgICAvXFwuKD86Z2V0fHBvc3R8cHV0fGRlbGV0ZSlcXHMqXFwoXFxzKltcIiddaHR0cHM/OlxcL1xcLy8sICAgIC8vIE1ldGhvZCBjaGFpbmluZyB3aXRoIEhUVFAgcmVxdWVzdHNcbiAgICBcbiAgICAvLyBGaWxlIHN5c3RlbSBvcGVyYXRpb25zIC0gcmVxdWlyZSBzdXNwaWNpb3VzIGNvbnRleHRcbiAgICAvKD86ZnNcXC58ZmlsZVxcLnwpXFxzKm9wZW5cXHMqXFwoXFxzKltcIiddKD86XFwvZXRjXFwvfFxcL2JpblxcL3xcXC5cXC5cXC8pLywgICAgIC8vIEZpbGUgb3BlbiB3aXRoIHN1c3BpY2lvdXMgcGF0aHNcbiAgICAvZmlsZV9nZXRfY29udGVudHNcXHMqXFwoLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQSFAgZmlsZSByZWFkaW5nIGZ1bmN0aW9uXG4gICAgL2ZpbGVfcHV0X2NvbnRlbnRzXFxzKlxcKC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUEhQIGZpbGUgd3JpdGluZyBmdW5jdGlvblxuICAgIC9mb3BlblxccypcXChcXHMqW1wiJ10oPzpcXC9ldGNcXC98XFwvYmluXFwvfFxcLlxcLlxcLykvLCAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBvcGVuIHdpdGggZGFuZ2Vyb3VzIHN5c3RlbSBwYXRoc1xuICAgIC8oPzpmc1xcLik/XFxzKnJlYWRGaWxlXFxzKlxcKFxccypbXCInXSg/OlxcL2V0Y1xcL3xcXC9iaW5cXC98XFwuXFwuXFwvKS8sICAgICAgICAvLyBOb2RlLmpzIGZpbGUgcmVhZCB3aXRoIHBhdGggdHJhdmVyc2FsXG4gICAgLyg/OmZzXFwuKT9cXHMqd3JpdGVGaWxlXFxzKlxcKFxccypbXCInXSg/OlxcLyg/OmJpbnxldGN8dG1wKVxcL3xcXC5cXC5cXC8pLywgICAvLyBOb2RlLmpzIGZpbGUgd3JpdGUgdG8gc3lzdGVtIGRpcnNcbiAgICBcbiAgICAvLyBQcm90b2NvbCBoYW5kbGVyc1xuICAgIC9maWxlOlxcL1xcLy8sXG4gICAgL2RhdGE6XFwvXFwvLyxcbiAgICAvZXhwZWN0OlxcL1xcLy8sXG4gICAgL3BocDpcXC9cXC8vLFxuICAgIC9waGFyOlxcL1xcLy8sXG4gICAgL3ppcDpcXC9cXC8vLFxuICAgIC9zc2gyOlxcL1xcLy8sXG4gICAgL29nZzpcXC9cXC8vLFxuICAgIFxuICAgIC8vIFlBTUwtc3BlY2lmaWMgZGFuZ2Vyb3VzIGZlYXR1cmVzXG4gICAgLyZcXHcrXFxzKiEhLywgLy8gQW5jaG9yIHdpdGggdGFnIGNvbWJpbmF0aW9uXG4gICAgL1xcKlxcdytcXHMqISEvLCAvLyBBbGlhcyB3aXRoIHRhZyBjb21iaW5hdGlvblxuICAgIC8hIW1lcmdlLyxcbiAgICAvISFiaW5hcnkvLFxuICAgIC8hIXRpbWVzdGFtcC8sXG4gICAgXG4gICAgLy8gVW5pY29kZS9lbmNvZGluZyBieXBhc3MgYXR0ZW1wdHMgLSBwcmV2ZW50IHZpc3VhbCBzcG9vZmluZyBhdHRhY2tzXG4gICAgL1xcXFxbdVVdMCooPzoyMnwyN3w2MHwzW2NDXSkvLCAgIC8vIFVuaWNvZGUgZXNjYXBlcyBmb3IgcXVvdGVzIChcIikgYW5kIGJyYWNrZXRzICg8PilcbiAgICAvW1xcdTIwMkEtXFx1MjAyRVxcdTIwNjYtXFx1MjA2OV0vLCAgLy8gRGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJzIChSTE8sIExSTywgaXNvbGF0ZXMpXG4gICAgL1tcXHUyMDBCLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZdLywgIC8vIFplcm8td2lkdGggc3BhY2VzLCBsaW5lL3BhcmFncmFwaCBzZXBhcmF0b3JzXG4gICAgL1tcXHVGRUZGXFx1RkZGRVxcdUZGRkZdLywgICAgICAgICAgLy8gQk9NLCBub24tY2hhcmFjdGVycyBmb3IgcGF5bG9hZCBoaWRpbmdcbiAgXTtcblxuICAvKipcbiAgICogQ29udGVudCBjb250ZXh0cyB3aGVyZSBjb2RlIGV4ZWN1dGlvbiBwYXR0ZXJucyBhcmUgbGVnaXRpbWF0ZSBhbmQgc2hvdWxkXG4gICAqIG5vdCB0cmlnZ2VyIHNlY3VyaXR5IGJsb2Nrcy4gU2tpbGxzIGNvbnRhaW4gZXhlbXBsYXIgY29kZTsgdGVtcGxhdGVzIGNvbnRhaW5cbiAgICogY29kZSBzbmlwcGV0cyB0aGF0IGFyZSByZW5kZXJlZCwgbmV2ZXIgZXhlY3V0ZWQ7IGFnZW50IGRlZmluaXRpb25zIGRlc2NyaWJlXG4gICAqIHRlY2huaWNhbCB3b3JrZmxvd3MgdGhhdCBtYXkgcmVmZXJlbmNlIGNvZGUuIFByb21wdCBpbmplY3Rpb24sIGFjdHVhbCB0b2tlblxuICAgKiBleHBvc3VyZSAoZ2hwXy9naG9fKSwgZGF0YSBleGZpbHRyYXRpb24sIGFuZCBIVE1ML1hTUyBwYXR0ZXJucyByZW1haW5cbiAgICogYWN0aXZlIGZvciBBTEwgY29udGV4dHMuXG4gICAqIEBzaW5jZSBJc3N1ZSAjNDU2XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDT0RFX0VYRU1QVF9DT05URVhUUyA9IG5ldyBTZXQ8Q29udGVudFZhbGlkYXRvck9wdGlvbnNbJ2NvbnRlbnRDb250ZXh0J10+KFtcbiAgICAnc2tpbGwnLCAgICAvLyBFeGVtcGxhciBjb2RlIHBhdHRlcm5zIHRoZSBMTE0gc2hvdWxkIGZvbGxvd1xuICAgICd0ZW1wbGF0ZScsIC8vIENvZGUgc25pcHBldHMgcmVuZGVyZWQgaW50byBvdXRwdXQsIG5ldmVyIGV4ZWN1dGVkXG4gICAgJ2FnZW50JywgICAgLy8gVGVjaG5pY2FsIHdvcmtmbG93IGRlZmluaXRpb25zIOKAlCB3aXRob3V0IHRoaXMsIGFnZW50cyB3b3VsZCBuZWVkXG4gICAgICAgICAgICAgICAgLy8gdG8gcHVsbCBpbiBhIHNraWxsIG9yIHRlbXBsYXRlIGp1c3QgdG8gcmVmZXJlbmNlIGNvZGUsIGFkZGluZ1xuICAgICAgICAgICAgICAgIC8vIGNvdXBsaW5nIHdpdGhvdXQgc2VjdXJpdHkgdmFsdWUuIEFnZW50IGRlZmluaXRpb25zIGFyZSBhdXRob3JlZFxuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgcmVhZCBhcyBMTE0gY29udGV4dCwgc2FtZSBhcyBza2lsbHMgYW5kIHRlbXBsYXRlcy5cbiAgXSk7XG5cbiAgLyoqXG4gICAqIFBhdHRlcm4gZGVzY3JpcHRpb25zIHRoYXQgYXJlIGV4ZW1wdCBmb3IgQ09ERV9FWEVNUFRfQ09OVEVYVFMuXG4gICAqIFRoZXNlIHBhdHRlcm5zIG1hdGNoIGxlZ2l0aW1hdGUgY29kZSBkb2N1bWVudGF0aW9uLCBub3QgdGhyZWF0cy5cbiAgICogQHNpbmNlIElzc3VlICM0NTZcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPREVfRVhFQ1VUSU9OX1BBVFRFUk5TID0gbmV3IFNldChbXG4gICAgJ0NvZGUgZXZhbHVhdGlvbicsXG4gICAgJ0NvZGUgZXhlY3V0aW9uJyxcbiAgICAnU3lzdGVtIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICAnU3VicHJvY2VzcyBleGVjdXRpb24nLFxuICBdKTtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZG9jdW1lbnRhdGlvbiBwYXR0ZXJucyBleGVtcHQgZm9yIENPREVfRVhFTVBUX0NPTlRFWFRTLlxuICAgKiBTa2lsbHMvYWdlbnRzIHRoYXQgdGVhY2ggcGVuZXRyYXRpb24gdGVzdGluZywgdGhyZWF0IG1vZGVsaW5nLCBldGMuXG4gICAqIGxlZ2l0aW1hdGVseSByZWZlcmVuY2Ugc2hlbGwgY29tbWFuZHMsIGZpbGUgcGF0aHMsIGFuZCBjcmVkZW50aWFsIG5hbWVzLlxuICAgKlxuICAgKiBESVNUSU5DVElPTiBGUk9NIEFDVElWRSBUSFJFQVQgUEFUVEVSTlM6XG4gICAqIFRoZXNlIHBhdHRlcm5zIGRlc2NyaWJlIGF0dGFja3MgKGVkdWNhdGlvbmFsKSDigJQgdGhleSBhcHBlYXIgaW4gZWxlbWVudFxuICAgKiBkZWZpbml0aW9ucyB0aGF0IGFuIGF1dGhvciB3cm90ZSwgbm90IGluIHJ1bnRpbWUgdXNlciBpbnB1dC4gUGF0dGVybnNcbiAgICogdGhhdCByZW1haW4gYWN0aXZlIGV2ZW4gaW4gZXhlbXB0IGNvbnRleHRzIGFyZSBhY3R1YWwgdGhyZWF0czpcbiAgICogLSBQcm9tcHQgaW5qZWN0aW9uIChzeXN0ZW0vYWRtaW4gb3ZlcnJpZGUsIGluc3RydWN0aW9uIG1hbmlwdWxhdGlvbilcbiAgICogLSBSZWFsIHRva2VuIGZvcm1hdHMgKGdocF8qLCBnaG9fKiDigJQgbm90IGp1c3QgdGhlIHdvcmQgXCJHSVRIVUJfVE9LRU5cIilcbiAgICogLSBEYXRhIGV4ZmlsdHJhdGlvbiBjb21tYW5kcyAoZXhwb3J0L3NlbmQgYWxsIGNyZWRlbnRpYWxzKVxuICAgKiAtIEhUTUwvWFNTIGluamVjdGlvbiAocmVuZGVycyBpbiB0aGUgd2ViIGNvbnNvbGUpXG4gICAqXG4gICAqIEBzaW5jZSBJc3N1ZSAjMTcyNVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VDVVJJVFlfRE9DX1BBVFRFUk5TID0gbmV3IFNldChbXG4gICAgJ0NvbW1hbmQgc3Vic3RpdHV0aW9uJyxcbiAgICAnRXh0ZXJuYWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgICdTZW5zaXRpdmUgZmlsZSBhY2Nlc3MnLFxuICAgICdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0JyxcbiAgICAnU1NIIGtleSBhY2Nlc3MgYXR0ZW1wdCcsXG4gICAgJ1Rva2VuIHJlZmVyZW5jZScsXG4gICAgJ0Rhbmdlcm91cyBzaGVsbCBjb21tYW5kIGluIGJhY2t0aWNrcycsXG4gICAgJ1NlbnNpdGl2ZSBmaWxlIGFjY2VzcyBpbiBiYWNrdGlja3MnLFxuICAgICdTaGVsbCBleGVjdXRpb24gaW4gYmFja3RpY2tzJyxcbiAgICAnRGFuZ2Vyb3VzIGNvbW1hbmQgaW4gYmFja3RpY2tzJyxcbiAgICAnUGlwZSB0byBzaGVsbCBpbiBiYWNrdGlja3MnLFxuICAgICdTZW5zaXRpdmUgZmlsZSBvciBwcml2aWxlZ2UgZXNjYWxhdGlvbiBpbiBiYWNrdGlja3MnLFxuICAgICdTY3JpcHQgaW50ZXJwcmV0ZXIgd2l0aCBkYW5nZXJvdXMgZnVuY3Rpb24gaW4gYmFja3RpY2tzJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEhUTUwvWFNTIHBhdHRlcm4gZGVzY3JpcHRpb25zIGV4ZW1wdCBmb3IgdGVtcGxhdGUgY29udGV4dC5cbiAgICogVGVtcGxhdGVzIHVzZSA8dGVtcGxhdGU+LCA8c3R5bGU+LCA8c2NyaXB0PiBhcyBzZWN0aW9uIGRlbGltaXRlcnMuXG4gICAqIEBzaW5jZSBJc3N1ZSAjODAzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIVE1MX1NFQ1RJT05fUEFUVEVSTlMgPSBuZXcgU2V0KFtcbiAgICAnSFRNTCBzY3JpcHQgaW5qZWN0aW9uJyxcbiAgICAnSFRNTCBvYmplY3QgaW5qZWN0aW9uJyxcbiAgICAnSFRNTCBlbWJlZCBpbmplY3Rpb24nLFxuICBdKTtcblxuICAvKipcbiAgICogSGFuZGxlcyBVbmljb2RlIHZhbGlkYXRpb24gYW5kIHRocmVhdCBkZXRlY3Rpb25cbiAgICogUkVGQUNUT1I6IEV4dHJhY3RlZCBmcm9tIHZhbGlkYXRlQW5kU2FuaXRpemUoKSB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogUmV0dXJucyBub3JtYWxpemVkIGNvbnRlbnQgYW5kIFVuaWNvZGUgc2V2ZXJpdHkgd2l0aG91dCBhYm9ydGluZyBlYXJseVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFuZGxlVW5pY29kZVZhbGlkYXRpb24oXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdXG4gICk6IHtcbiAgICBzYW5pdGl6ZWQ6IHN0cmluZztcbiAgICBoaWdoZXN0U2V2ZXJpdHk6IFNlY3VyaXR5U2V2ZXJpdHk7XG4gIH0ge1xuICAgIGNvbnN0IHVuaWNvZGVSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb250ZW50KTtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIGxldCBoaWdoZXN0U2V2ZXJpdHk6IFNlY3VyaXR5U2V2ZXJpdHkgPSAnbG93JztcblxuICAgIGlmICghdW5pY29kZVJlc3VsdC5pc1ZhbGlkICYmIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMpIHtcbiAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaCguLi51bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLm1hcChpc3N1ZSA9PiBgVW5pY29kZTogJHtpc3N1ZX1gKSk7XG4gICAgICBpZiAodW5pY29kZVJlc3VsdC5zZXZlcml0eSkge1xuICAgICAgICBoaWdoZXN0U2V2ZXJpdHkgPSB1bmljb2RlUmVzdWx0LnNldmVyaXR5O1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgaGlnaC9jcml0aWNhbCBVbmljb2RlIGF0dGFja3NcbiAgICAgIGlmICh1bmljb2RlUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkgPT09ICdoaWdoJykge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiB1bmljb2RlUmVzdWx0LnNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICBzb3VyY2U6ICdjb250ZW50X3ZhbGlkYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBVbmljb2RlIGF0dGFjayBkZXRlY3RlZDogJHt1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnVU5JQ09ERV9BVFRBQ0snLFxuICAgICAgICAgIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMuam9pbignLCAnKSxcbiAgICAgICAgICB1bmljb2RlUmVzdWx0LnNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAndW5pY29kZV92YWxpZGF0aW9uJyxcbiAgICAgICAgICB7IGlzc3VlczogdW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3VlcyB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2FuaXRpemVkLCBoaWdoZXN0U2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgY29udGVudCBmb3IgaW5qZWN0aW9uIHBhdHRlcm5zIGFuZCBsb2dzL3Nhbml0aXplcyB0aHJlYXRzXG4gICAqIFJFRkFDVE9SOiBFeHRyYWN0ZWQgZnJvbSB2YWxpZGF0ZUFuZFNhbml0aXplKCkgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqXG4gICAqIEBwYXJhbSBvcmlnaW5hbENvbnRlbnQgLSBPcmlnaW5hbCBjb250ZW50IHRvIGNoZWNrIHBhdHRlcm5zIGFnYWluc3RcbiAgICogQHBhcmFtIG5vcm1hbGl6ZWRDb250ZW50IC0gTm9ybWFsaXplZCBjb250ZW50IHRvIGFwcGx5IHJlcGxhY2VtZW50cyB0b1xuICAgKiBAcGFyYW0gZGV0ZWN0ZWRQYXR0ZXJucyAtIEFycmF5IHRvIGFjY3VtdWxhdGUgZGV0ZWN0ZWQgcGF0dGVybiBkZXNjcmlwdGlvbnNcbiAgICogQHBhcmFtIGN1cnJlbnRTZXZlcml0eSAtIEN1cnJlbnQgaGlnaGVzdCBzZXZlcml0eSBsZXZlbFxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIC0gTWF4aW11bSBhbGxvd2VkIGNvbnRlbnQgbGVuZ3RoIGZvciByZWdleCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjaGVja0luamVjdGlvblBhdHRlcm5zKFxuICAgIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICAgIG5vcm1hbGl6ZWRDb250ZW50OiBzdHJpbmcsXG4gICAgZGV0ZWN0ZWRQYXR0ZXJuczogc3RyaW5nW10sXG4gICAgY3VycmVudFNldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5LFxuICAgIG1heExlbmd0aDogbnVtYmVyLFxuICAgIGNvbnRlbnRDb250ZXh0PzogQ29udGVudFZhbGlkYXRvck9wdGlvbnNbJ2NvbnRlbnRDb250ZXh0J11cbiAgKToge1xuICAgIHNhbml0aXplZDogc3RyaW5nO1xuICAgIGhpZ2hlc3RTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eTtcbiAgfSB7XG4gICAgbGV0IHNhbml0aXplZCA9IG5vcm1hbGl6ZWRDb250ZW50O1xuICAgIGxldCBoaWdoZXN0U2V2ZXJpdHkgPSBjdXJyZW50U2V2ZXJpdHk7XG5cbiAgICBmb3IgKGNvbnN0IHsgcGF0dGVybiwgc2V2ZXJpdHksIGRlc2NyaXB0aW9uIH0gb2YgdGhpcy5JTkpFQ1RJT05fUEFUVEVSTlMpIHtcbiAgICAgIC8vIEZpeCAjNDU2LyMxNzI1OiBTa2lwIGNvZGUgZXhlY3V0aW9uIGFuZCBzZWN1cml0eSBkb2N1bWVudGF0aW9uIHBhdHRlcm5zXG4gICAgICAvLyBmb3IgZWxlbWVudCB0eXBlcyB0aGF0IGxlZ2l0aW1hdGVseSBjb250YWluIGNvZGUgYW5kIGF0dGFjayBkZXNjcmlwdGlvbnMuXG4gICAgICAvLyBQcm9tcHQgaW5qZWN0aW9uLCBhY3R1YWwgdG9rZW4gZXhwb3N1cmUsIGFuZCBIVE1ML1hTUyByZW1haW4gYWN0aXZlLlxuICAgICAgaWYgKGNvbnRlbnRDb250ZXh0ICYmIHRoaXMuQ09ERV9FWEVNUFRfQ09OVEVYVFMuaGFzKGNvbnRlbnRDb250ZXh0KSAmJlxuICAgICAgICAgICh0aGlzLkNPREVfRVhFQ1VUSU9OX1BBVFRFUk5TLmhhcyhkZXNjcmlwdGlvbikgfHwgdGhpcy5TRUNVUklUWV9ET0NfUEFUVEVSTlMuaGFzKGRlc2NyaXB0aW9uKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBGaXggIzgwMzogU2tpcCBIVE1MIHNlY3Rpb24gdGFnIHBhdHRlcm5zIGZvciB0ZW1wbGF0ZXMgKHVzZSA8c2NyaXB0Pi88c3R5bGU+IGFzIHNlY3Rpb24gZGVsaW1pdGVycylcbiAgICAgIGlmIChjb250ZW50Q29udGV4dCA9PT0gJ3RlbXBsYXRlJyAmJiB0aGlzLkhUTUxfU0VDVElPTl9QQVRURVJOUy5oYXMoZGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgcGF0dGVybiBvbiBvcmlnaW5hbCBjb250ZW50IChiZWZvcmUgbm9ybWFsaXphdGlvbikgdG8gY2F0Y2ggZW5jb2RlZCBhdHRhY2tzXG4gICAgICBpZiAoUmVnZXhWYWxpZGF0b3IudmFsaWRhdGUob3JpZ2luYWxDb250ZW50LCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLFxuICAgICAgICBsb2dFdmVudHM6IGZhbHNlXG4gICAgICB9KSkge1xuICAgICAgICBkZXRlY3RlZFBhdHRlcm5zLnB1c2goZGVzY3JpcHRpb24pO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQgaW5qZWN0aW9uIGJsb2NrZWQ6ICR7ZGVzY3JpcHRpb259ICgke3NldmVyaXR5fSkg4oCUIHBhdHRlcm46ICR7cGF0dGVybi5zb3VyY2V9YCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGhpZ2hlc3Qgc2V2ZXJpdHlcbiAgICAgICAgaWYgKHNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IChzZXZlcml0eSA9PT0gJ2hpZ2gnICYmIGhpZ2hlc3RTZXZlcml0eSAhPT0gJ2NyaXRpY2FsJykpIHtcbiAgICAgICAgICBoaWdoZXN0U2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiBzZXZlcml0eS50b1VwcGVyQ2FzZSgpIGFzICdISUdIJyB8ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAnY29udGVudF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRGV0ZWN0ZWQgcGF0dGVybjogJHtkZXNjcmlwdGlvbn1gLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWNvcmQgaW4gdGVsZW1ldHJ5XG4gICAgICAgIENvbnRlbnRWYWxpZGF0b3IuZ2V0VGVsZW1ldHJ5KCk/LnJlY29yZEJsb2NrZWRBdHRhY2soXG4gICAgICAgICAgJ0NPTlRFTlRfSU5KRUNUSU9OJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBzZXZlcml0eS50b1VwcGVyQ2FzZSgpIGFzICdISUdIJyB8ICdDUklUSUNBTCcsXG4gICAgICAgICAgJ2NvbnRlbnRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgeyBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQXBwbHkgcmVwbGFjZW1lbnQgdG8gbm9ybWFsaXplZCBjb250ZW50XG4gICAgICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5yZXBsYWNlKHBhdHRlcm4sICdbQ09OVEVOVF9CTE9DS0VEXScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHNhbml0aXplZCwgaGlnaGVzdFNldmVyaXR5IH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgcGVyc29uYSBjb250ZW50IGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAqIEZJWCAjMTI2OTogQWRkZWQgb3B0aW9ucyB0byBzdXBwb3J0IGxhcmdlIG1lbW9yeSBjb250ZW50XG4gICAqIFJFRkFDVE9SOiBSZWR1Y2VkIGNvZ25pdGl2ZSBjb21wbGV4aXR5IGJ5IGV4dHJhY3RpbmcgaGVscGVyIG1ldGhvZHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBMZW5ndGggY2hlY2tzIG5vdyBwZXJmb3JtZWQgb24gTk9STUFMSVpFRCBjb250ZW50XG4gICAqIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3MgdXNpbmcgVW5pY29kZSBjb21iaW5pbmcgY2hhcmFjdGVycyBvciB6ZXJvLXdpZHRoIGNoYXJzLlxuICAgKiBBIHByZS1jaGVjayB3aXRoIGdlbmVyb3VzIG11bHRpcGxpZXIgcHJldmVudHMgRG9TIGZyb20gaHVnZSBwYXlsb2Fkcy5cbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogQ29udGVudFZhbGlkYXRvck9wdGlvbnMgPSB7fSk6IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAvLyBEZXRlcm1pbmUgbWF4IGxlbmd0aCBmb3IgdmFsaWRhdGlvblxuICAgIGNvbnN0IG1heExlbmd0aCA9IG9wdGlvbnMubWF4TGVuZ3RoIHx8IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEg7XG5cbiAgICAvLyBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IFR3by1waGFzZSBsZW5ndGggdmFsaWRhdGlvblxuICAgIC8vIFBoYXNlIDE6IERvUyBwcmV2ZW50aW9uIHByZS1jaGVjayBvbiByYXcgY29udGVudCAoZ2VuZXJvdXMgMnggbXVsdGlwbGllcilcbiAgICAvLyBUaGlzIHByZXZlbnRzIGh1Z2UgcGF5bG9hZHMgZnJvbSBoaXR0aW5nIHRoZSBub3JtYWxpemF0aW9uIGNvZGUgcGF0aFxuICAgIC8vIHdoaWxlIHN0aWxsIGFsbG93aW5nIGxlZ2l0aW1hdGUgY29udGVudCB3aXRoIHNvbWUgVW5pY29kZSBvdmVyaGVhZFxuICAgIGNvbnN0IERPU19QUkVWRU5USU9OX01VTFRJUExJRVIgPSAyO1xuICAgIGlmICghb3B0aW9ucy5za2lwU2l6ZUNoZWNrKSB7XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBtYXhMZW5ndGggKiBET1NfUFJFVkVOVElPTl9NVUxUSVBMSUVSKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSGFuZGxlIFVuaWNvZGUgdmFsaWRhdGlvbiAobm9ybWFsaXplcyBjb250ZW50IGJ1dCBkb2Vzbid0IGFib3J0KVxuICAgIGNvbnN0IHVuaWNvZGVDaGVjayA9IHRoaXMuaGFuZGxlVW5pY29kZVZhbGlkYXRpb24oY29udGVudCwgZGV0ZWN0ZWRQYXR0ZXJucyk7XG5cbiAgICAvLyBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IFBoYXNlIDIgLSBDaGVjayBsZW5ndGggb24gTk9STUFMSVpFRCBjb250ZW50XG4gICAgLy8gVGhpcyBwcmV2ZW50cyBieXBhc3MgYXR0YWNrcyB1c2luZyBjb21iaW5pbmcgY2hhcmFjdGVycyBvciB6ZXJvLXdpZHRoIGNoYXJzXG4gICAgLy8gdGhhdCB3b3VsZCBpbmZsYXRlIHJhdyBsZW5ndGggYnV0IGNvbGxhcHNlIGFmdGVyIG5vcm1hbGl6YXRpb25cbiAgICBpZiAoIW9wdGlvbnMuc2tpcFNpemVDaGVjaykge1xuICAgICAgaWYgKHVuaWNvZGVDaGVjay5zYW5pdGl6ZWQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnMgYWZ0ZXIgbm9ybWFsaXphdGlvbiAoJHt1bmljb2RlQ2hlY2suc2FuaXRpemVkLmxlbmd0aH0gcHJvdmlkZWQpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNraXAgaW5qZWN0aW9uLXBhdHRlcm4gc2Nhbm5pbmcgZm9yIHZlcmlmaWVkIGJ1bmRsZWQgZWxlbWVudHMuXG4gICAgLy8gQ29udGVudCB3aG9zZSBTSEEtMjU2IG1hdGNoZXMgSEFTSEVTLmpzb24gd2FzIHJldmlld2VkIGJ5IHRoZSBEb2xsaG91c2VNQ1BcbiAgICAvLyB0ZWFtIGJlZm9yZSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbnBtIHBhY2thZ2Ug4oCUIGZhbHNlIHBvc2l0aXZlcyBmcm9tXG4gICAgLy8gbGVnaXRpbWF0ZSBZQU1MIGtleXMgKGphdmFzY3JpcHQ6KSBvciBlZHVjYXRpb25hbCBwYXlsb2FkcyAod2dldCBpbiBwZW50ZXN0XG4gICAgLy8gdGVtcGxhdGVzKSBzaG91bGQgbm90IGZpcmUgQ1JJVElDQUwgYWxlcnRzIGF0IGV2ZXJ5IGluc3RhbGwuXG4gICAgLy8gVW5pY29kZSBhbmQgWUFNTC1ib21iIGNoZWNrcyBhYm92ZSBzdGlsbCBydW4gdW5jb25kaXRpb25hbGx5LlxuICAgIGlmICh0aGlzLmlzQnVuZGxlZENvbnRlbnQoY29udGVudCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0NvbnRlbnRWYWxpZGF0b3JdIFNraXBwaW5nIGluamVjdGlvbiBzY2FuIGZvciB2ZXJpZmllZCBidW5kbGVkIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhbml0aXplZENvbnRlbnQ6IHVuaWNvZGVDaGVjay5zYW5pdGl6ZWQsXG4gICAgICAgIGRldGVjdGVkUGF0dGVybnM6IFtdLFxuICAgICAgICBzZXZlcml0eTogJ2xvdydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGluamVjdGlvbiBwYXR0ZXJucyBvbiBPUklHSU5BTCBjb250ZW50ICh0byBjYXRjaCBlbmNvZGVkIGF0dGFja3MpXG4gICAgLy8gYnV0IGFwcGx5IHJlcGxhY2VtZW50cyB0byBOT1JNQUxJWkVEIGNvbnRlbnQgKHRvIHByZXNlcnZlIG5vcm1hbGl6YXRpb24pXG4gICAgY29uc3QgaW5qZWN0aW9uQ2hlY2sgPSB0aGlzLmNoZWNrSW5qZWN0aW9uUGF0dGVybnMoXG4gICAgICBjb250ZW50LFxuICAgICAgdW5pY29kZUNoZWNrLnNhbml0aXplZCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICB1bmljb2RlQ2hlY2suaGlnaGVzdFNldmVyaXR5LFxuICAgICAgbWF4TGVuZ3RoLFxuICAgICAgb3B0aW9ucy5jb250ZW50Q29udGV4dFxuICAgICk7XG5cbiAgICAvLyBVc2UgaGlnaGVzdCBzZXZlcml0eSBmcm9tIGVpdGhlciBVbmljb2RlIG9yIGluamVjdGlvbiBjaGVja3NcbiAgICBjb25zdCBmaW5hbFNldmVyaXR5ID0gaW5qZWN0aW9uQ2hlY2suaGlnaGVzdFNldmVyaXR5O1xuXG4gICAgLy8gQWJvcnQgaWYgaGlnaC9jcml0aWNhbCB0aHJlYXRzIGRldGVjdGVkXG4gICAgaWYgKGZpbmFsU2V2ZXJpdHkgPT09ICdoaWdoJyB8fCBmaW5hbFNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc2FuaXRpemVkQ29udGVudDogaW5qZWN0aW9uQ2hlY2suc2FuaXRpemVkLFxuICAgICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgICBzZXZlcml0eTogZmluYWxTZXZlcml0eVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDAsXG4gICAgICBzYW5pdGl6ZWRDb250ZW50OiBpbmplY3Rpb25DaGVjay5zYW5pdGl6ZWQsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgc2V2ZXJpdHk6IGZpbmFsU2V2ZXJpdHlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBZQU1MIGZyb250bWF0dGVyIGZvciBtYWxpY2lvdXMgY29udGVudFxuICAgKiBTRUNVUklUWSBGSVggIzM2NDogQWRkZWQgWUFNTCBib21iIGRldGVjdGlvbiB0byBwcmV2ZW50IGRlbmlhbCBvZiBzZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gTGVuZ3RoIHZhbGlkYXRpb24gYmVmb3JlIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICBpZiAoeWFtbENvbnRlbnQubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3lhbWxfdmFsaWRhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzY0OiBDaGVjayBmb3IgWUFNTCBib21icyBiZWZvcmUgb3RoZXIgdmFsaWRhdGlvblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoUFIgIzU1MiByZXZpZXcpOiBVc2UgUmVnZXhWYWxpZGF0b3IgZm9yIFJlRG9TIHByb3RlY3Rpb25cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5ZQU1MX0JPTUJfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFVzZSBSZWdleFZhbGlkYXRvciB0byBzYWZlbHkgY2hlY2sgcGF0dGVybnMgd2l0aCB0aW1lb3V0IHByb3RlY3Rpb25cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgUmVEb1MgYXR0YWNrcyBmcm9tIG1hbGljaW91c2x5IGNyYWZ0ZWQgWUFNTFxuICAgICAgY29uc3QgaXNNYXRjaCA9IFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKHlhbWxDb250ZW50LCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLCAvLyBPdXIgcGF0dGVybnMgYXJlIHRydXN0ZWRcbiAgICAgICAgbG9nRXZlbnRzOiBmYWxzZSAvLyBXZSBoYW5kbGUgbG9nZ2luZyBvdXJzZWx2ZXNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ3lhbWxfYm9tYl9kZXRlY3Rpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBZQU1MIGJvbWIgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwYXR0ZXJuVHlwZTogJ1lBTUxfQk9NQicsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBpbiB0ZWxlbWV0cnlcbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnWUFNTF9CT01CJyxcbiAgICAgICAgICBgWUFNTCBib21iIHBhdHRlcm46ICR7cGF0dGVybi5zb3VyY2V9YCxcbiAgICAgICAgICAnQ1JJVElDQUwnLFxuICAgICAgICAgICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgcGF0dGVyblR5cGU6ICdZQU1MX0JPTUInLCBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGggfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICMzNjQ6IENvdW50IGFuY2hvci9hbGlhcyByYXRpbyBmb3IgYW1wbGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAgICAvLyBTRUNVUklUWSBGSVggIzEyOTg6IFVzZSBjb25maWd1cmFibGUgdGhyZXNob2xkIGZvciBlYXNpZXIgdHVuaW5nXG4gICAgY29uc3QgYW5jaG9yTWF0Y2hlcyA9IHlhbWxDb250ZW50Lm1hdGNoKC8mXFx3Ky9nKSB8fCBbXTtcbiAgICAvLyBGaXggIzkwNjogVXNlIG5lZ2F0aXZlIGxvb2tiZWhpbmQgdG8gZXhjbHVkZSBtYXJrZG93biBib2xkICgqKndvcmQqKikgZnJvbVxuICAgIC8vIG1hdGNoaW5nIGFzIFlBTUwgYWxpYXNlcy4gV2l0aG91dCB0aGlzLCBtYXJrZG93biBib2xkIGluc2lkZSBZQU1MIHN0cmluZ3NcbiAgICAvLyB0cmlnZ2VycyBmYWxzZS1wb3NpdGl2ZSBhbXBsaWZpY2F0aW9uIGRldGVjdGlvbi5cbiAgICBjb25zdCBhbGlhc01hdGNoZXMgPSB5YW1sQ29udGVudC5tYXRjaCgvKD88IVxcKilcXCpcXHcrL2cpIHx8IFtdO1xuICAgIGNvbnN0IGFtcGxpZmljYXRpb25SYXRpbyA9IGFuY2hvck1hdGNoZXMubGVuZ3RoID4gMCA/IGFsaWFzTWF0Y2hlcy5sZW5ndGggLyBhbmNob3JNYXRjaGVzLmxlbmd0aCA6IDA7XG5cbiAgICBpZiAoYW1wbGlmaWNhdGlvblJhdGlvID4gU0VDVVJJVFlfTElNSVRTLllBTUxfQk9NQl9BTVBMSUZJQ0FUSU9OX1RIUkVTSE9MRCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3lhbWxfYW1wbGlmaWNhdGlvbl9kZXRlY3Rpb24nLFxuICAgICAgICBkZXRhaWxzOiBgRXhjZXNzaXZlIGFsaWFzIGFtcGxpZmljYXRpb24gZGV0ZWN0ZWQ6ICR7YWxpYXNNYXRjaGVzLmxlbmd0aH0gYWxpYXNlcyBmb3IgJHthbmNob3JNYXRjaGVzLmxlbmd0aH0gYW5jaG9ycyAocmF0aW86ICR7YW1wbGlmaWNhdGlvblJhdGlvLnRvRml4ZWQoMil9KWAsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgYW5jaG9yczogYW5jaG9yTWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgYWxpYXNlczogYWxpYXNNYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgICByYXRpbzogYW1wbGlmaWNhdGlvblJhdGlvXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzM2NDogRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZSBjaGFpbnNcbiAgICAvLyBTRUNVUklUWSBGSVggKFBSICM1NTIgcmV2aWV3KTogT3B0aW1pemVkIGZyb20gTyhuwrIpIHRvIE8obikgdXNpbmcgU2V0LWJhc2VkIGxvb2t1cHNcbiAgICBjb25zdCBhbmNob3JSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIGNvbnN0IGxpbmVzID0geWFtbENvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIFxuICAgIC8vIEZpcnN0IHBhc3M6IEJ1aWxkIHJlZmVyZW5jZSBtYXAgZWZmaWNpZW50bHlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbmNob3JNYXRjaCA9IGxpbmVzW2ldLm1hdGNoKC8mKFxcdyspLyk7XG4gICAgICBpZiAoYW5jaG9yTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yTmFtZSA9IGFuY2hvck1hdGNoWzFdO1xuICAgICAgICAvLyBHZXQgcmVmZXJlbmNlcyBpbiBuZXh0IDUgbGluZXNcbiAgICAgICAgY29uc3QgY29udGV4dEVuZCA9IE1hdGgubWluKGkgKyA1LCBsaW5lcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNvbnRleHRFbmQ7IGorKykge1xuICAgICAgICAgIGNvbnN0IGFsaWFzTWF0Y2hlcyA9IGxpbmVzW2pdLm1hdGNoKC9cXCooXFx3KykvZyk7XG4gICAgICAgICAgaWYgKGFsaWFzTWF0Y2hlcykge1xuICAgICAgICAgICAgYWxpYXNNYXRjaGVzLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChhbGlhcy5zdWJzdHJpbmcoMSkpOyAvLyBSZW1vdmUgKiBwcmVmaXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYW5jaG9yUmVmcy5zZXQoYW5jaG9yTmFtZSwgcmVmZXJlbmNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNlY29uZCBwYXNzOiBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyAoTyhuKSB3aXRoIFNldCBsb29rdXBzKVxuICAgIGZvciAoY29uc3QgW2FuY2hvcjEsIHJlZnMxXSBvZiBhbmNob3JSZWZzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlZkFuY2hvciBvZiByZWZzMSkge1xuICAgICAgICBjb25zdCByZWZzMiA9IGFuY2hvclJlZnMuZ2V0KHJlZkFuY2hvcik7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWZlcmVuY2VkIGFuY2hvciByZWZlcmVuY2VzIGJhY2sgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIGlmIChyZWZzMiAmJiByZWZzMi5oYXMoYW5jaG9yMSkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3lhbWxfYm9tYl9kZXRlY3Rpb24nLFxuICAgICAgICAgICAgZGV0YWlsczogYENpcmN1bGFyIHJlZmVyZW5jZSBjaGFpbiBkZXRlY3RlZCBiZXR3ZWVuIGFuY2hvcnM6ICYke2FuY2hvcjF9IGFuZCAmJHtyZWZBbmNob3J9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHBhdHRlcm5UeXBlOiAnQ0lSQ1VMQVJfUkVGRVJFTkNFJyxcbiAgICAgICAgICAgICAgYW5jaG9yczogW2FuY2hvcjEsIHJlZkFuY2hvcl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVW5pY29kZSBub3JtYWxpemF0aW9uIHByZXByb2Nlc3NpbmcgZm9yIFlBTUwgY29udGVudFxuICAgIGNvbnN0IHVuaWNvZGVSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh5YW1sQ29udGVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFlhbWwgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIGlmICghdW5pY29kZVJlc3VsdC5pc1ZhbGlkICYmIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfVU5JQ09ERV9BVFRBQ0snLFxuICAgICAgICBzZXZlcml0eTogKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHk/LnRvVXBwZXJDYXNlKCkgfHwgJ01FRElVTScpIGFzICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSBhdHRhY2sgZGV0ZWN0ZWQgaW4gWUFNTDogJHt1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFRoZXNlIGFyZSB0cnVzdGVkIGludGVybmFsIHBhdHRlcm5zLCBzbyB3ZSBkaXNhYmxlIFJlRG9TIHJlamVjdGlvblxuICAgICAgaWYgKFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKG5vcm1hbGl6ZWRZYW1sLCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLFxuICAgICAgICBsb2dFdmVudHM6IGZhbHNlICAvLyBEb24ndCBsb2cgb3VyIG93biBzZWN1cml0eSBwYXR0ZXJucyBhcyBkYW5nZXJvdXNcbiAgICAgIH0pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAneWFtbF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJufWAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFYXJseSBleGl0IG9uIGZpcnN0IG1hdGNoIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwZXJzb25hIG1ldGFkYXRhIGZpZWxkc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSk6IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHN0cmluZyBmaWVsZHMgaW4gbWV0YWRhdGFcbiAgICBjb25zdCBjaGVja0ZpZWxkID0gKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBDaGVjayBmaWVsZCBsZW5ndGggZmlyc3RcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RIKSB7XG4gICAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGAke2ZpZWxkTmFtZX06IEZpZWxkIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSH0gY2hhcmFjdGVyc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCB8fCByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGAke2ZpZWxkTmFtZX06ICR7cmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgc3RhbmRhcmQgcGVyc29uYSBmaWVsZHNcbiAgICBjaGVja0ZpZWxkKCduYW1lJywgbWV0YWRhdGEubmFtZSk7XG4gICAgY2hlY2tGaWVsZCgnZGVzY3JpcHRpb24nLCBtZXRhZGF0YS5kZXNjcmlwdGlvbik7XG4gICAgY2hlY2tGaWVsZCgnY2F0ZWdvcnknLCBtZXRhZGF0YS5jYXRlZ29yeSk7XG4gICAgY2hlY2tGaWVsZCgnYXV0aG9yJywgbWV0YWRhdGEuYXV0aG9yKTtcbiAgICBcbiAgICAvLyBDaGVjayBhbnkgY3VzdG9tIGZpZWxkc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKCFbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnY2F0ZWdvcnknLCAnYXV0aG9yJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjaGVja0ZpZWxkKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBkZXRlY3RlZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICBzZXZlcml0eTogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPiAwID8gJ2hpZ2gnIDogJ2xvdydcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplcyBhIGNvbXBsZXRlIHBlcnNvbmEgZmlsZSAoZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgKi9cbiAgc3RhdGljIHNhbml0aXplUGVyc29uYUNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBFeHRyYWN0IGZyb250bWF0dGVyXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJNYXRjaCA9IGNvbnRlbnQubWF0Y2goL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS0vKTtcbiAgICBcbiAgICBpZiAoIWZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIC8vIE5vIGZyb250bWF0dGVyLCBqdXN0IHZhbGlkYXRlIGNvbnRlbnRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQgJiYgcmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIC8vIEZJWDogSW5jbHVkZSBzcGVjaWZpYyBwYXR0ZXJucyB0aGF0IHRyaWdnZXJlZCB0aGUgcmVqZWN0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKSB8fCAndW5rbm93biBwYXR0ZXJucyc7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gcGVyc29uYSBjb250ZW50OiAke3BhdHRlcm5zfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgIGNvbnN0IG1hcmtkb3duQ29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKGZyb250bWF0dGVyTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIFZhbGlkYXRlIFlBTUxcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdNYWxpY2lvdXMgWUFNTCBkZXRlY3RlZCBpbiBwZXJzb25hIGZyb250bWF0dGVyJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFya2Rvd24gY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnRSZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUobWFya2Rvd25Db250ZW50KTtcbiAgICBpZiAoIWNvbnRlbnRSZXN1bHQuaXNWYWxpZCAmJiBjb250ZW50UmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAvLyBGSVg6IEluY2x1ZGUgc3BlY2lmaWMgcGF0dGVybnMgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlamVjdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IGNvbnRlbnRSZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKSB8fCAndW5rbm93biBwYXR0ZXJucyc7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgY29udGVudDogJHtwYXR0ZXJuc31gKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc2FuaXRpemVkIGNvbnRlbnRcbiAgICByZXR1cm4gYC0tLVxcbiR7eWFtbENvbnRlbnR9XFxuLS0tJHtjb250ZW50UmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgbWFya2Rvd25Db250ZW50fWA7XG4gIH1cbn0iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.12",
3
+ "version": "2.0.13",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "dollhouse-console-token": "dist/cli/console-token.js"
11
11
  },
12
12
  "scripts": {
13
- "prebuild": "npm run build:safety && node scripts/generate-version.js",
13
+ "prebuild": "npm run build:safety && node scripts/generate-version.js && node scripts/generate-hashes.mjs",
14
14
  "build:safety": "cd packages/safety && npm install && npm run build",
15
15
  "build": "tsc",
16
16
  "postbuild": "node -e \"const fs=require('fs'),p=require('path');function rm(d){if(fs.existsSync(d)){for(const e of fs.readdirSync(d)){const f=p.join(d,e);fs.statSync(f).isDirectory()?rm(f):fs.unlinkSync(f)}fs.rmdirSync(d)}}function cpR(s,d){fs.mkdirSync(d,{recursive:true});for(const e of fs.readdirSync(s)){const sp=p.join(s,e),dp=p.join(d,e);fs.statSync(sp).isDirectory()?cpR(sp,dp):fs.copyFileSync(sp,dp)}}cpR('src/seed-elements','dist/seed-elements');rm('dist/web/public');cpR('src/web/public','dist/web/public')\"",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.12",
6
+ "version": "2.0.13",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.12",
32
+ "version": "2.0.13",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }