@dollhousemcp/mcp-server 1.6.11 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.github.md +1036 -0
- package/README.md +165 -1664
- package/README.md.backup +298 -0
- package/README.npm.md +298 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/index.d.ts +0 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -98
- package/dist/persona/export-import/index.d.ts +1 -3
- package/dist/persona/export-import/index.d.ts.map +1 -1
- package/dist/persona/export-import/index.js +2 -3
- package/dist/portfolio/PortfolioRepoManager.d.ts +1 -1
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +118 -33
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +36 -76
- package/dist/server/types.d.ts +0 -2
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -1
- package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -1
- package/package.json +9 -3
- package/dist/persona/export-import/PersonaSharer.d.ts +0 -81
- package/dist/persona/export-import/PersonaSharer.d.ts.map +0 -1
- package/dist/persona/export-import/PersonaSharer.js +0 -678
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Export all export/import
|
|
2
|
+
* Export all export/import modules
|
|
3
3
|
*/
|
|
4
4
|
export { PersonaExporter } from './PersonaExporter.js';
|
|
5
5
|
export { PersonaImporter } from './PersonaImporter.js';
|
|
6
|
-
export { PersonaSharer } from './PersonaSharer.js';
|
|
7
6
|
export type { ExportedPersona, ExportBundle } from './PersonaExporter.js';
|
|
8
7
|
export type { ImportResult } from './PersonaImporter.js';
|
|
9
|
-
export type { ShareResult } from './PersonaSharer.js';
|
|
10
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/persona/export-import/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/persona/export-import/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Export all export/import
|
|
2
|
+
* Export all export/import modules
|
|
3
3
|
*/
|
|
4
4
|
export { PersonaExporter } from './PersonaExporter.js';
|
|
5
5
|
export { PersonaImporter } from './PersonaImporter.js';
|
|
6
|
-
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVyc29uYS9leHBvcnQtaW1wb3J0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4cG9ydCBhbGwgZXhwb3J0L2ltcG9ydC9zaGFyaW5nIG1vZHVsZXNcbiAqL1xuXG5leHBvcnQgeyBQZXJzb25hRXhwb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5leHBvcnQgeyBQZXJzb25hSW1wb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFJbXBvcnRlci5qcyc7XG5leHBvcnQgeyBQZXJzb25hU2hhcmVyIH0gZnJvbSAnLi9QZXJzb25hU2hhcmVyLmpzJztcblxuZXhwb3J0IHR5cGUgeyBFeHBvcnRlZFBlcnNvbmEsIEV4cG9ydEJ1bmRsZSB9IGZyb20gJy4vUGVyc29uYUV4cG9ydGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgSW1wb3J0UmVzdWx0IH0gZnJvbSAnLi9QZXJzb25hSW1wb3J0ZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBTaGFyZVJlc3VsdCB9IGZyb20gJy4vUGVyc29uYVNoYXJlci5qcyc7Il19
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVyc29uYS9leHBvcnQtaW1wb3J0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwb3J0IGFsbCBleHBvcnQvaW1wb3J0IG1vZHVsZXNcbiAqL1xuXG5leHBvcnQgeyBQZXJzb25hRXhwb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5leHBvcnQgeyBQZXJzb25hSW1wb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFJbXBvcnRlci5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXhwb3J0ZWRQZXJzb25hLCBFeHBvcnRCdW5kbGUgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5leHBvcnQgdHlwZSB7IEltcG9ydFJlc3VsdCB9IGZyb20gJy4vUGVyc29uYUltcG9ydGVyLmpzJzsiXX0=
|
|
@@ -66,7 +66,7 @@ export declare class PortfolioRepoManager {
|
|
|
66
66
|
* SECURITY: Additional Unicode normalization for filenames
|
|
67
67
|
* SECURITY FIX: Fixed ReDoS vulnerability with input length limit and optimized regex
|
|
68
68
|
*/
|
|
69
|
-
|
|
69
|
+
static generateFileName(name: string): string;
|
|
70
70
|
/**
|
|
71
71
|
* Format element content for storage
|
|
72
72
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;OAEG;YACW,aAAa;
|
|
1
|
+
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;OAEG;YACW,aAAa;IA+E3B;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2OnF;;;OAGG;IACG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwBpD;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
|
|
@@ -77,31 +77,52 @@ export class PortfolioRepoManager {
|
|
|
77
77
|
options.body = JSON.stringify(body);
|
|
78
78
|
}
|
|
79
79
|
const response = await fetch(url, options);
|
|
80
|
+
// Check if response exists before accessing properties
|
|
81
|
+
if (!response) {
|
|
82
|
+
const error = new Error('No response received from GitHub API');
|
|
83
|
+
error.status = 0;
|
|
84
|
+
error.code = 'PORTFOLIO_SYNC_005';
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
80
87
|
if (response.status === 404) {
|
|
81
88
|
return null; // Not found is often expected
|
|
82
89
|
}
|
|
83
90
|
const data = await response.json();
|
|
84
91
|
if (!response.ok) {
|
|
85
|
-
//
|
|
92
|
+
// Create error with status code attached for better classification
|
|
86
93
|
let errorMessage = data.message || `GitHub API error: ${response.status}`;
|
|
94
|
+
let errorCode = 'PORTFOLIO_SYNC_005'; // Default
|
|
87
95
|
switch (response.status) {
|
|
88
|
-
case 422:
|
|
89
|
-
// Validation failed - often means repository already exists
|
|
90
|
-
errorMessage = `Repository validation failed: ${data.message || 'name already exists on this account'}`;
|
|
91
|
-
break;
|
|
92
96
|
case 401:
|
|
93
97
|
errorMessage = 'GitHub authentication failed. Please check your token.';
|
|
98
|
+
errorCode = 'PORTFOLIO_SYNC_001';
|
|
94
99
|
break;
|
|
95
100
|
case 403:
|
|
96
|
-
|
|
101
|
+
if (data.message?.includes('rate limit')) {
|
|
102
|
+
errorMessage = `GitHub API rate limit exceeded: ${data.message}`;
|
|
103
|
+
errorCode = 'PORTFOLIO_SYNC_006';
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
errorMessage = `GitHub API access forbidden: ${data.message || 'insufficient permissions'}`;
|
|
107
|
+
errorCode = 'PORTFOLIO_SYNC_001'; // Treat as auth issue
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case 422:
|
|
111
|
+
// Validation failed - often means repository already exists
|
|
112
|
+
errorMessage = `Repository validation failed: ${data.message || 'name already exists on this account'}`;
|
|
113
|
+
errorCode = 'PORTFOLIO_SYNC_003';
|
|
97
114
|
break;
|
|
98
115
|
case 500:
|
|
99
116
|
errorMessage = 'GitHub API server error. Please try again later.';
|
|
117
|
+
errorCode = 'PORTFOLIO_SYNC_005';
|
|
100
118
|
break;
|
|
101
119
|
default:
|
|
102
120
|
errorMessage = `GitHub API error (${response.status}): ${data.message || 'Unknown error'}`;
|
|
103
121
|
}
|
|
104
|
-
|
|
122
|
+
const error = new Error(errorMessage);
|
|
123
|
+
error.status = response.status;
|
|
124
|
+
error.code = errorCode;
|
|
125
|
+
throw error;
|
|
105
126
|
}
|
|
106
127
|
return data;
|
|
107
128
|
}
|
|
@@ -220,7 +241,7 @@ export class PortfolioRepoManager {
|
|
|
220
241
|
});
|
|
221
242
|
// Generate file path based on element type
|
|
222
243
|
// FIX: Don't add 's' - element.type is already plural (e.g., 'personas', 'skills')
|
|
223
|
-
const fileName =
|
|
244
|
+
const fileName = PortfolioRepoManager.generateFileName(element.metadata.name);
|
|
224
245
|
const filePath = `${element.type}/${fileName}.md`;
|
|
225
246
|
// Prepare content (could be markdown with frontmatter)
|
|
226
247
|
const content = this.formatElementContent(element);
|
|
@@ -231,7 +252,28 @@ export class PortfolioRepoManager {
|
|
|
231
252
|
// Save to GitHub
|
|
232
253
|
try {
|
|
233
254
|
// First, check if file exists to determine if this is create or update
|
|
234
|
-
|
|
255
|
+
let existingFile = null;
|
|
256
|
+
try {
|
|
257
|
+
existingFile = await this.githubRequest(`/repos/${username}/${PortfolioRepoManager.PORTFOLIO_REPO_NAME}/contents/${filePath}`);
|
|
258
|
+
}
|
|
259
|
+
catch (checkError) {
|
|
260
|
+
// IMPORTANT: Authentication and rate limit errors must be re-thrown!
|
|
261
|
+
// These are NOT "file doesn't exist" scenarios - they indicate we can't
|
|
262
|
+
// access the API at all. Only 404 (and similar) should be treated as
|
|
263
|
+
// "file doesn't exist". This ensures auth errors are properly reported
|
|
264
|
+
// with correct error codes (e.g., PORTFOLIO_SYNC_001 for auth failures).
|
|
265
|
+
// See PR #846 and test: portfolio-single-upload.qa.test.ts
|
|
266
|
+
if (checkError.status === 401 || checkError.code === 'PORTFOLIO_SYNC_001') {
|
|
267
|
+
throw checkError; // Authentication error - don't continue
|
|
268
|
+
}
|
|
269
|
+
if (checkError.status === 403 || checkError.code === 'PORTFOLIO_SYNC_006') {
|
|
270
|
+
throw checkError; // Rate limit or permission error - don't continue
|
|
271
|
+
}
|
|
272
|
+
// For other errors (like 404), assume file doesn't exist and continue
|
|
273
|
+
// with file creation. This is the expected flow for new files.
|
|
274
|
+
logger.debug(`File check returned error (likely doesn't exist): ${filePath}`);
|
|
275
|
+
existingFile = null;
|
|
276
|
+
}
|
|
235
277
|
// DUPLICATE DETECTION (Issue #792): Check if content is identical
|
|
236
278
|
if (existingFile && existingFile.content) {
|
|
237
279
|
// Decode existing content from base64
|
|
@@ -250,13 +292,19 @@ export class PortfolioRepoManager {
|
|
|
250
292
|
}
|
|
251
293
|
}
|
|
252
294
|
// Create or update the file (only if content is different)
|
|
253
|
-
|
|
295
|
+
// DEBUG: Log what we're about to send
|
|
296
|
+
logger.debug(`[DEBUG] Creating/updating file. existingFile: ${!!existingFile}, sha: ${existingFile?.sha}`);
|
|
297
|
+
const requestBody = {
|
|
254
298
|
message: existingFile ?
|
|
255
299
|
`Update ${element.metadata.name} in portfolio` :
|
|
256
300
|
`Add ${element.metadata.name} to portfolio`,
|
|
257
|
-
content: Buffer.from(content).toString('base64')
|
|
258
|
-
|
|
259
|
-
|
|
301
|
+
content: Buffer.from(content).toString('base64')
|
|
302
|
+
};
|
|
303
|
+
// Only include sha if we have an existing file with a sha
|
|
304
|
+
if (existingFile && existingFile.sha) {
|
|
305
|
+
requestBody.sha = existingFile.sha;
|
|
306
|
+
}
|
|
307
|
+
const result = await this.githubRequest(`/repos/${username}/${PortfolioRepoManager.PORTFOLIO_REPO_NAME}/contents/${filePath}`, 'PUT', requestBody);
|
|
260
308
|
// FIX: GitHub API response structure varies - handle all cases
|
|
261
309
|
// The response may have commit data at different levels or not at all
|
|
262
310
|
if (!result) {
|
|
@@ -300,40 +348,77 @@ export class PortfolioRepoManager {
|
|
|
300
348
|
return commitUrl;
|
|
301
349
|
}
|
|
302
350
|
catch (error) {
|
|
303
|
-
//
|
|
304
|
-
let errorCode = 'PORTFOLIO_SYNC_005'; // Default network error
|
|
351
|
+
// Use error code if already set by githubRequest
|
|
352
|
+
let errorCode = error.code || 'PORTFOLIO_SYNC_005'; // Default network error
|
|
305
353
|
let enhancedMessage = 'Failed to save element to portfolio';
|
|
306
|
-
// Check
|
|
307
|
-
if (error.
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
354
|
+
// Check error status first (more reliable than message parsing)
|
|
355
|
+
if (error.status) {
|
|
356
|
+
switch (error.status) {
|
|
357
|
+
case 401:
|
|
358
|
+
errorCode = 'PORTFOLIO_SYNC_001';
|
|
359
|
+
enhancedMessage = 'GitHub authentication failed. Please re-authenticate.';
|
|
360
|
+
break;
|
|
361
|
+
case 403:
|
|
362
|
+
if (error.message?.includes('rate limit')) {
|
|
363
|
+
errorCode = 'PORTFOLIO_SYNC_006';
|
|
364
|
+
enhancedMessage = 'GitHub API rate limit exceeded. Please try again later.';
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
errorCode = 'PORTFOLIO_SYNC_001';
|
|
368
|
+
enhancedMessage = 'GitHub API access forbidden. Check token permissions.';
|
|
369
|
+
}
|
|
370
|
+
break;
|
|
371
|
+
case 404:
|
|
372
|
+
errorCode = 'PORTFOLIO_SYNC_002';
|
|
373
|
+
enhancedMessage = 'GitHub portfolio repository not found. Please run init_portfolio first.';
|
|
374
|
+
break;
|
|
375
|
+
case 422:
|
|
376
|
+
errorCode = 'PORTFOLIO_SYNC_003';
|
|
377
|
+
enhancedMessage = 'Repository validation failed.';
|
|
378
|
+
break;
|
|
379
|
+
default:
|
|
380
|
+
// Keep the error code from githubRequest if set
|
|
381
|
+
if (!error.code) {
|
|
382
|
+
errorCode = 'PORTFOLIO_SYNC_005';
|
|
383
|
+
}
|
|
384
|
+
}
|
|
318
385
|
}
|
|
319
|
-
else if (error.
|
|
320
|
-
|
|
321
|
-
|
|
386
|
+
else if (!error.code) {
|
|
387
|
+
// Fall back to message parsing only if no status code available
|
|
388
|
+
if (error.message?.includes('401') || error.message?.includes('authentication')) {
|
|
389
|
+
errorCode = 'PORTFOLIO_SYNC_001';
|
|
390
|
+
enhancedMessage = 'GitHub authentication failed. Please re-authenticate.';
|
|
391
|
+
}
|
|
392
|
+
else if (error.message?.includes('404') || error.message?.includes('not found')) {
|
|
393
|
+
errorCode = 'PORTFOLIO_SYNC_002';
|
|
394
|
+
enhancedMessage = 'GitHub portfolio repository not found. Please run init_portfolio first.';
|
|
395
|
+
}
|
|
396
|
+
else if (error.message?.includes('403') || error.message?.includes('rate limit')) {
|
|
397
|
+
errorCode = 'PORTFOLIO_SYNC_006';
|
|
398
|
+
enhancedMessage = 'GitHub API rate limit exceeded. Please try again later.';
|
|
399
|
+
}
|
|
400
|
+
else if (error.message?.includes('Cannot read properties')) {
|
|
401
|
+
errorCode = 'PORTFOLIO_SYNC_004';
|
|
402
|
+
enhancedMessage = `GitHub API response parsing error: ${error.message}`;
|
|
403
|
+
}
|
|
322
404
|
}
|
|
323
405
|
logger.error(`[${errorCode}] ${enhancedMessage}`, {
|
|
324
406
|
elementId: element.id,
|
|
325
407
|
username,
|
|
326
408
|
originalError: error.message,
|
|
409
|
+
errorStatus: error.status,
|
|
327
410
|
stack: error.stack
|
|
328
411
|
});
|
|
329
412
|
ErrorHandler.logError('PortfolioRepoManager.saveElementToRepo', error, {
|
|
330
413
|
elementId: element.id,
|
|
331
414
|
username,
|
|
332
|
-
errorCode
|
|
415
|
+
errorCode,
|
|
416
|
+
errorStatus: error.status
|
|
333
417
|
});
|
|
334
418
|
// Throw error with code for better handling upstream
|
|
335
419
|
const wrappedError = ErrorHandler.wrapError(error, `[${errorCode}] ${enhancedMessage}`, ErrorCategory.NETWORK_ERROR);
|
|
336
420
|
wrappedError.code = errorCode;
|
|
421
|
+
wrappedError.status = error.status;
|
|
337
422
|
throw wrappedError;
|
|
338
423
|
}
|
|
339
424
|
}
|
|
@@ -396,7 +481,7 @@ These elements can be imported into your DollhouseMCP installation.
|
|
|
396
481
|
* SECURITY: Additional Unicode normalization for filenames
|
|
397
482
|
* SECURITY FIX: Fixed ReDoS vulnerability with input length limit and optimized regex
|
|
398
483
|
*/
|
|
399
|
-
generateFileName(name) {
|
|
484
|
+
static generateFileName(name) {
|
|
400
485
|
// SECURITY FIX: Limit input length to prevent ReDoS attacks
|
|
401
486
|
// Even with optimized regex, very long inputs could cause performance issues
|
|
402
487
|
const MAX_FILENAME_LENGTH = 255; // Common filesystem limit
|
|
@@ -427,4 +512,4 @@ These elements can be imported into your DollhouseMCP installation.
|
|
|
427
512
|
return `# ${element.metadata.name}\n\n${element.metadata.description || ''}`;
|
|
428
513
|
}
|
|
429
514
|
}
|
|
430
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFcEM7UUFDRSxzQ0FBc0M7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELG9F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QWlCO1FBQzVDLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW9SZXBvTWFuYWdlciAtIE1hbmFnZXMgR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3JpZXMgZm9yIGVsZW1lbnQgc3RvcmFnZVxuICogXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEVYUExJQ0lUIENPTlNFTlQgcmVxdWlyZWQgZm9yIGFsbCBvcGVyYXRpb25zXG4gKiAtIENyZWF0ZXMgcG9ydGZvbGlvIHJlcG9zaXRvcmllcyBpbiB1c2VyJ3MgR2l0SHViIGFjY291bnRcbiAqIC0gU2F2ZXMgZWxlbWVudHMgdG8gYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXNcbiAqIC0gSGFuZGxlcyBBUEkgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICogLSBQcm92aWRlcyBhdWRpdCBsb2dnaW5nIGZvciBjb25zZW50IGRlY2lzaW9uc1xuICovXG5cbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRmb2xpb1JlcG9PcHRpb25zIHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGU/OiBib29sZWFuO1xuICBhdXRvX2luaXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUG9ydGZvbGlvUmVwb01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1JURk9MSU9fUkVQT19OQU1FID0gJ2RvbGxob3VzZS1wb3J0Zm9saW8nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RFU0NSSVBUSU9OID0gJ015IERvbGxob3VzZU1DUCBlbGVtZW50IHBvcnRmb2xpbyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdJVEhVQl9BUElfQkFTRSA9ICdodHRwczovL2FwaS5naXRodWIuY29tJztcbiAgXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRva2VuIHdpbGwgYmUgcmV0cmlldmVkIHdoZW4gbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxsc1xuICAgKiBVc2VkIHdoZW4gdG9rZW4gaXMgYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBUb2tlbk1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxscyB3aXRoIHZhbGlkYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCB0b2tlbiB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdG9rZW4gdmFsaWRhdGlvbiBieXBhc3MgKERNQ1AtU0VDLTAwMilcbiAgICogTWV0aG9kIG5hbWUgaW5jbHVkZXMgJ3ZhbGlkYXRlJyB0byBzYXRpc2Z5IHNlY3VyaXR5IHNjYW5uZXIgcGF0dGVyblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRUb2tlbkFuZFZhbGlkYXRlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLnRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdGhpcy50b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4gUGxlYXNlIHVzZSBzZXR1cF9naXRodWJfYXV0aCBmaXJzdC4nKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBWYWxpZGF0ZSB0b2tlbiBiZWZvcmUgdXNlIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICAgIC8vIFVzaW5nIHZhbGlkYXRlVG9rZW5TY29wZXMgd2l0aCBtaW5pbWFsIHJlcXVpcmVkIHNjb3BlcyBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlblNjb3Blcyh0aGlzLnRva2VuLCB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gLy8gTWluaW11bSBzY29wZSBuZWVkZWQgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvciBleHBpcmVkIEdpdEh1YiB0b2tlbjogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yIHx8ICdQbGVhc2UgcmUtYXV0aGVudGljYXRlLid9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExPVyBGSVg6IEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBvcGVyYXRpb25zIChETUNQLVNFQy0wMDYpXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmdldFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucydcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGF1dGhlbnRpY2F0ZWQgR2l0SHViIEFQSSByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdpdGh1YlJlcXVlc3QoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1ldGhvZDogc3RyaW5nID0gJ0dFVCcsXG4gICAgYm9keT86IGFueVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbkFuZFZhbGlkYXRlKCk7XG4gICAgY29uc3QgdXJsID0gYCR7UG9ydGZvbGlvUmVwb01hbmFnZXIuR0lUSFVCX0FQSV9CQVNFfSR7cGF0aH1gO1xuICAgIFxuICAgIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kIGlzIG9mdGVuIGV4cGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIFByb3ZpZGUgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIHN0YXR1cyBjb2Rlc1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZSB8fCBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YDtcbiAgICAgIFxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsZWQgLSBvZnRlbiBtZWFucyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYFJlcG9zaXRvcnkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZGF0YS5tZXNzYWdlIHx8ICduYW1lIGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgYWNjb3VudCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW46ICR7ZGF0YS5tZXNzYWdlIHx8ICdpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgb3IgcmF0ZSBsaW1pdCBleGNlZWRlZCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBBUEkgc2VydmVyIGVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgZXJyb3IgKCR7cmVzcG9uc2Uuc3RhdHVzfSk6ICR7ZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogUG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gTUVESVVNIEZJWDogTm9ybWFsaXplIHVzZXJuYW1lIGZyb20gZWxlbWVudCBtZXRhZGF0YSAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IHJhd1VzZXJuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyc7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdVc2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZ2VuZXJhdGVGaWxlTmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7ZWxlbWVudC50eXBlfS8ke2ZpbGVOYW1lfS5tZGA7XG5cbiAgICAvLyBQcmVwYXJlIGNvbnRlbnQgKGNvdWxkIGJlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudCk7XG4gICAgXG4gICAgLy8gRElBR05PU1RJQzogTG9nIGNvbnRlbnQgc2l6ZSBiZWZvcmUgc2VuZGluZyB0byBHaXRIdWJcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBTYXZpbmcgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIEdpdEh1YiAtIGNvbnRlbnQgc2l6ZTogJHtjb250ZW50Lmxlbmd0aH0gY2hhcnNgKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBGaXJzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoMCwgMjAwKX1gKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBMYXN0IDIwMCBjaGFyczogJHtjb250ZW50LnN1YnN0cmluZyhNYXRoLm1heCgwLCBjb250ZW50Lmxlbmd0aCAtIDIwMCkpfWApO1xuXG4gICAgLy8gU2F2ZSB0byBHaXRIdWJcbiAgICB0cnkge1xuICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIGZpbGUgZXhpc3RzIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGNyZWF0ZSBvciB1cGRhdGVcbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzLyR7ZmlsZVBhdGh9YFxuICAgICAgKTtcblxuICAgICAgLy8gRFVQTElDQVRFIERFVEVDVElPTiAoSXNzdWUgIzc5Mik6IENoZWNrIGlmIGNvbnRlbnQgaXMgaWRlbnRpY2FsXG4gICAgICBpZiAoZXhpc3RpbmdGaWxlICYmIGV4aXN0aW5nRmlsZS5jb250ZW50KSB7XG4gICAgICAgIC8vIERlY29kZSBleGlzdGluZyBjb250ZW50IGZyb20gYmFzZTY0XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IEJ1ZmZlci5mcm9tKGV4aXN0aW5nRmlsZS5jb250ZW50LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb21wYXJlIHdpdGggbmV3IGNvbnRlbnRcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gY29udGVudCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdTa2lwcGluZyBkdXBsaWNhdGUgcG9ydGZvbGlvIHVwbG9hZCAtIGNvbnRlbnQgaWRlbnRpY2FsJywge1xuICAgICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgZWxlbWVudE5hbWU6IGVsZW1lbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGZpbGVQYXRoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBleGlzdGluZyBmaWxlIFVSTCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGR1cGxpY2F0ZSBjb21taXRcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1VybCA9IGV4aXN0aW5nRmlsZS5odG1sX3VybCB8fCBcbiAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtmaWxlUGF0aH1gO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiBleGlzdGluZ1VybDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgb3IgdXBkYXRlIHRoZSBmaWxlIChvbmx5IGlmIGNvbnRlbnQgaXMgZGlmZmVyZW50KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IGV4aXN0aW5nRmlsZSA/IFxuICAgICAgICAgICAgYFVwZGF0ZSAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gaW4gcG9ydGZvbGlvYCA6IFxuICAgICAgICAgICAgYEFkZCAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdG8gcG9ydGZvbGlvYCxcbiAgICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICAgc2hhOiBleGlzdGluZ0ZpbGU/LnNoYSAvLyBJbmNsdWRlIFNIQSBpZiB1cGRhdGluZyBleGlzdGluZyBmaWxlXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIEZJWDogR2l0SHViIEFQSSByZXNwb25zZSBzdHJ1Y3R1cmUgdmFyaWVzIC0gaGFuZGxlIGFsbCBjYXNlc1xuICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBoYXZlIGNvbW1pdCBkYXRhIGF0IGRpZmZlcmVudCBsZXZlbHMgb3Igbm90IGF0IGFsbFxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UgZm9yICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbXVsdGlwbGUgcGF0aHMgdG8gZ2V0IHRoZSBjb21taXQgVVJMXG4gICAgICBsZXQgY29tbWl0VXJsOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIFBhdGggMTogcmVzdWx0LmNvbW1pdC5odG1sX3VybCAoc3RhbmRhcmQgZm9yIGNvbnRlbnQgQVBJKVxuICAgICAgaWYgKHJlc3VsdC5jb21taXQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb21taXQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDI6IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsIChzb21lIEFQSSByZXNwb25zZXMpXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8uaHRtbF91cmwpIHtcbiAgICAgICAgY29tbWl0VXJsID0gcmVzdWx0LmNvbnRlbnQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDM6IEdlbmVyYXRlIFVSTCBmcm9tIHJlc3BvbnNlIGRhdGFcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5jb250ZW50Py5wYXRoKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtyZXN1bHQuY29udGVudC5wYXRofWA7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDQ6IEZhbGxiYWNrIHRvIHJlcG9zaXRvcnkgVVJMIChndWFyYW50ZWVkIHRvIGJlIHNldClcbiAgICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignW1BPUlRGT0xJT19TWU5DXzAwNF0gQ291bGQgbm90IGV4dHJhY3QgY29tbWl0IFVSTCBmcm9tIEdpdEh1YiByZXNwb25zZSwgdXNpbmcgZmFsbGJhY2snLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICByZXNwb25zZUtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCksXG4gICAgICAgICAgaGFzQ29tbWl0OiAhIXJlc3VsdC5jb21taXQsXG4gICAgICAgICAgaGFzQ29udGVudDogISFyZXN1bHQuY29udGVudFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWl0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L3RyZWUvbWFpbi8ke2VsZW1lbnQudHlwZX1gO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1N1Y2Nlc3NmdWxseSBzYXZlZCBlbGVtZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgY29tbWl0VXJsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbW1pdFVybDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFbmhhbmNlZCBlcnJvciByZXBvcnRpbmcgd2l0aCBzcGVjaWZpYyBlcnJvciBjb2Rlc1xuICAgICAgbGV0IGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDUnOyAvLyBEZWZhdWx0IG5ldHdvcmsgZXJyb3JcbiAgICAgIGxldCBlbmhhbmNlZE1lc3NhZ2UgPSAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBwb3J0Zm9saW8nO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3Igc3BlY2lmaWMgZXJyb3IgY29uZGl0aW9uc1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDEnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDAxJztcbiAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwNCcpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDAyJztcbiAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBub3QgZm91bmQuIFBsZWFzZSBydW4gaW5pdF9wb3J0Zm9saW8gZmlyc3QuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNic7XG4gICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0Nhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgbnVsbCcpKSB7XG4gICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDQnO1xuICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSBgR2l0SHViIEFQSSByZXNwb25zZSBwYXJzaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmVycm9yKGBbJHtlcnJvckNvZGV9XSAke2VuaGFuY2VkTWVzc2FnZX1gLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBvcmlnaW5hbEVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50VG9SZXBvJywgZXJyb3IsIHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIGVycm9yQ29kZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFRocm93IGVycm9yIHdpdGggY29kZSBmb3IgYmV0dGVyIGhhbmRsaW5nIHVwc3RyZWFtXG4gICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCBgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICh3cmFwcGVkRXJyb3IgYXMgYW55KS5jb2RlID0gZXJyb3JDb2RlO1xuICAgICAgdGhyb3cgd3JhcHBlZEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBpbml0aWFsIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgd2l0aCBSRUFETUUgYW5kIGRpcmVjdG9yaWVzXG4gICAqIFNFQ1VSSVRZOiBVc2VybmFtZSBhbHJlYWR5IG5vcm1hbGl6ZWQgYnkgY2FsbGluZyBtZXRob2RzXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVBvcnRmb2xpb1N0cnVjdHVyZSh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIFJFQURNRS5tZFxuICAgIGNvbnN0IHJlYWRtZUNvbnRlbnQgPSBgIyBEb2xsaG91c2VNQ1AgUG9ydGZvbGlvXG5cblRoaXMgaXMgbXkgcGVyc29uYWwgY29sbGVjdGlvbiBvZiBEb2xsaG91c2VNQ1AgZWxlbWVudHMuXG5cbiMjIFN0cnVjdHVyZVxuXG4tICoqcGVyc29uYXMvKiogLSBCZWhhdmlvcmFsIHByb2ZpbGVzXG4tICoqc2tpbGxzLyoqIC0gRGlzY3JldGUgY2FwYWJpbGl0aWVzICBcbi0gKip0ZW1wbGF0ZXMvKiogLSBSZXVzYWJsZSBjb250ZW50IHN0cnVjdHVyZXNcbi0gKiphZ2VudHMvKiogLSBBdXRvbm9tb3VzIGFjdG9yc1xuLSAqKm1lbW9yaWVzLyoqIC0gUGVyc2lzdGVudCBjb250ZXh0XG4tICoqZW5zZW1ibGVzLyoqIC0gRWxlbWVudCBncm91cHNcblxuIyMgVXNhZ2VcblxuVGhlc2UgZWxlbWVudHMgY2FuIGJlIGltcG9ydGVkIGludG8geW91ciBEb2xsaG91c2VNQ1AgaW5zdGFsbGF0aW9uLlxuXG4tLS1cbipHZW5lcmF0ZWQgYnkgRG9sbGhvdXNlTUNQKlxuYDtcblxuICAgIGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9jb250ZW50cy9SRUFETUUubWRgLFxuICAgICAgJ1BVVCcsXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdJbml0aWFsaXplIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShyZWFkbWVDb250ZW50KS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBwbGFjZWhvbGRlcnNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFsncGVyc29uYXMnLCAnc2tpbGxzJywgJ3RlbXBsYXRlcycsICdhZ2VudHMnLCAnbWVtb3JpZXMnLCAnZW5zZW1ibGVzJ107XG4gICAgXG4gICAgZm9yIChjb25zdCBkaXIgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzLyR7ZGlyfS8uZ2l0a2VlcGAsXG4gICAgICAgICdQVVQnLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogYENyZWF0ZSAke2Rpcn0gZGlyZWN0b3J5YCxcbiAgICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbSgnJykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIGVsZW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIWVsZW1lbnQubWV0YWRhdGEubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQuaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiBpZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogdHlwZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzYWZlIGZpbGVuYW1lIGZyb20gZWxlbWVudCBuYW1lXG4gICAqIFNFQ1VSSVRZOiBBZGRpdGlvbmFsIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBmb3IgZmlsZW5hbWVzXG4gICAqIFNFQ1VSSVRZIEZJWDogRml4ZWQgUmVEb1MgdnVsbmVyYWJpbGl0eSB3aXRoIGlucHV0IGxlbmd0aCBsaW1pdCBhbmQgb3B0aW1pemVkIHJlZ2V4XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlRmlsZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IExpbWl0IGlucHV0IGxlbmd0aCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgICAvLyBFdmVuIHdpdGggb3B0aW1pemVkIHJlZ2V4LCB2ZXJ5IGxvbmcgaW5wdXRzIGNvdWxkIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3Vlc1xuICAgIGNvbnN0IE1BWF9GSUxFTkFNRV9MRU5HVEggPSAyNTU7IC8vIENvbW1vbiBmaWxlc3lzdGVtIGxpbWl0XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIGluIGZpbGVuYW1lc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gVHJ1bmNhdGUgdG8gc2FmZSBsZW5ndGggQkVGT1JFIHJlZ2V4IG9wZXJhdGlvbnNcbiAgICBjb25zdCB0cnVuY2F0ZWROYW1lID0gbm9ybWFsaXplZE5hbWUuc2xpY2UoMCwgTUFYX0ZJTEVOQU1FX0xFTkdUSCk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBPcHRpbWl6ZWQgcmVnZXggb3BlcmF0aW9ucyB0byBwcmV2ZW50IFJlRG9TXG4gICAgLy8gMS4gQ29udmVydCBub24tYWxwaGFudW1lcmljIHNlcXVlbmNlcyB0byBzaW5nbGUgZGFzaFxuICAgIC8vIDIuIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlcyBpbiBhIHNpbmdsZSBwYXNzIHVzaW5nIHRyaW1cbiAgICBjb25zdCBzYWZlTmFtZSA9IHRydW5jYXRlZE5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXi0rLywgJycpICAvLyBSZW1vdmUgbGVhZGluZyBkYXNoZXNcbiAgICAgIC5yZXBsYWNlKC8tKyQvLCAnJyk7IC8vIFJlbW92ZSB0cmFpbGluZyBkYXNoZXNcbiAgICBcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIGZpbGVuYW1lIChub3QgZW1wdHkgYWZ0ZXIgY2xlYW5pbmcpXG4gICAgcmV0dXJuIHNhZmVOYW1lIHx8ICd1bm5hbWVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZWxlbWVudCBjb250ZW50IGZvciBzdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEVsZW1lbnRDb250ZW50KGVsZW1lbnQ6IElFbGVtZW50KTogc3RyaW5nIHtcbiAgICAvLyBTZXJpYWxpemUgdGhlIGVsZW1lbnQgb3IgY3JlYXRlIGJhc2ljIG1hcmtkb3duXG4gICAgaWYgKGVsZW1lbnQuc2VyaWFsaXplKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemUoKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gYmFzaWMgbWFya2Rvd24gZm9ybWF0XG4gICAgcmV0dXJuIGAjICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfVxcblxcbiR7ZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJ31gO1xuICB9XG59Il19
|
|
515
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFcEM7UUFDRSxzQ0FBc0M7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELG9F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QUFHLENBQUMsQ0FBQywwQkFBMEI7UUFFM0Qsb0RBQW9EO1FBQ3BELE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUUxRSxrREFBa0Q7UUFDbEQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUVuRSw0REFBNEQ7UUFDNUQsdURBQXVEO1FBQ3ZELGdFQUFnRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxhQUFhO2FBQzNCLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDO2FBQzNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUUsd0JBQXdCO2FBQzVDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7UUFFaEQsNkRBQTZEO1FBQzdELE9BQU8sUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxPQUFpQjtRQUM1QyxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUNELG9DQUFvQztRQUNwQyxPQUFPLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7SUFDL0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9ydGZvbGlvUmVwb01hbmFnZXIgLSBNYW5hZ2VzIEdpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzIGZvciBlbGVtZW50IHN0b3JhZ2VcbiAqIFxuICogS2V5IEZlYXR1cmVzOlxuICogLSBFWFBMSUNJVCBDT05TRU5UIHJlcXVpcmVkIGZvciBhbGwgb3BlcmF0aW9uc1xuICogLSBDcmVhdGVzIHBvcnRmb2xpbyByZXBvc2l0b3JpZXMgaW4gdXNlcidzIEdpdEh1YiBhY2NvdW50XG4gKiAtIFNhdmVzIGVsZW1lbnRzIHRvIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzXG4gKiAtIEhhbmRsZXMgQVBJIGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAqIC0gUHJvdmlkZXMgYXVkaXQgbG9nZ2luZyBmb3IgY29uc2VudCBkZWNpc2lvbnNcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudCB9IGZyb20gJy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9SZXBvT3B0aW9ucyB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlPzogYm9vbGVhbjtcbiAgYXV0b19pbml0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUE9SVEZPTElPX1JFUE9fTkFNRSA9ICdkb2xsaG91c2UtcG9ydGZvbGlvJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9ERVNDUklQVElPTiA9ICdNeSBEb2xsaG91c2VNQ1AgZWxlbWVudCBwb3J0Zm9saW8nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfQVBJX0JBU0UgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbSc7XG4gIFxuICBwcml2YXRlIHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBUb2tlbiB3aWxsIGJlIHJldHJpZXZlZCB3aGVuIG5lZWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgR2l0SHViIHRva2VuIGZvciBBUEkgY2FsbHNcbiAgICogVXNlZCB3aGVuIHRva2VuIGlzIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gVG9rZW5NYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZvciBBUEkgY2FsbHMgd2l0aCB2YWxpZGF0aW9uXG4gICAqIFNFQ1VSSVRZIEZJWDogQWRkZWQgdG9rZW4gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRva2VuIHZhbGlkYXRpb24gYnlwYXNzIChETUNQLVNFQy0wMDIpXG4gICAqIE1ldGhvZCBuYW1lIGluY2x1ZGVzICd2YWxpZGF0ZScgdG8gc2F0aXNmeSBzZWN1cml0eSBzY2FubmVyIHBhdHRlcm5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0VG9rZW5BbmRWYWxpZGF0ZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy50b2tlbikge1xuICAgICAgdGhpcy50b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRoaXMudG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWIgYXV0aGVudGljYXRpb24gcmVxdWlyZWQuIFBsZWFzZSB1c2Ugc2V0dXBfZ2l0aHViX2F1dGggZmlyc3QuJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVmFsaWRhdGUgdG9rZW4gYmVmb3JlIHVzZSB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAgICAvLyBVc2luZyB2YWxpZGF0ZVRva2VuU2NvcGVzIHdpdGggbWluaW1hbCByZXF1aXJlZCBzY29wZXMgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModGhpcy50b2tlbiwge1xuICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddIC8vIE1pbmltdW0gc2NvcGUgbmVlZGVkIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9uc1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3IgZXhwaXJlZCBHaXRIdWIgdG9rZW46ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvciB8fCAnUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBMT1cgRklYOiBBZGQgYXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgb3BlcmF0aW9ucyAoRE1DUC1TRUMtMDA2KVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9SZXBvTWFuYWdlci5nZXRUb2tlbicsXG4gICAgICAgIGRldGFpbHM6ICdHaXRIdWIgdG9rZW4gdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseSBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW47XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhdXRoZW50aWNhdGVkIEdpdEh1YiBBUEkgcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnaXRodWJSZXF1ZXN0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXRob2Q6IHN0cmluZyA9ICdHRVQnLFxuICAgIGJvZHk/OiBhbnlcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW5BbmRWYWxpZGF0ZSgpO1xuICAgIGNvbnN0IHVybCA9IGAke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLkdJVEhVQl9BUElfQkFTRX0ke3BhdGh9YDtcbiAgICBcbiAgICBjb25zdCBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGV4aXN0cyBiZWZvcmUgYWNjZXNzaW5nIHByb3BlcnRpZXNcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdObyByZXNwb25zZSByZWNlaXZlZCBmcm9tIEdpdEh1YiBBUEknKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IDA7XG4gICAgICBlcnJvci5jb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kIGlzIG9mdGVuIGV4cGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIENyZWF0ZSBlcnJvciB3aXRoIHN0YXR1cyBjb2RlIGF0dGFjaGVkIGZvciBiZXR0ZXIgY2xhc3NpZmljYXRpb25cbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gICAgICBsZXQgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNSc7IC8vIERlZmF1bHRcbiAgICAgIFxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQ6ICR7ZGF0YS5tZXNzYWdlfWA7XG4gICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgYWNjZXNzIGZvcmJpZGRlbjogJHtkYXRhLm1lc3NhZ2UgfHwgJ2luc3VmZmljaWVudCBwZXJtaXNzaW9ucyd9YDtcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnOyAvLyBUcmVhdCBhcyBhdXRoIGlzc3VlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCAtIG9mdGVuIG1lYW5zIHJlcG9zaXRvcnkgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZDogJHtkYXRhLm1lc3NhZ2UgfHwgJ25hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBhY2NvdW50J31gO1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnR2l0SHViIEFQSSBzZXJ2ZXIgZXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA1JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgR2l0SHViIEFQSSBlcnJvciAoJHtyZXNwb25zZS5zdGF0dXN9KTogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIGVycm9yLmNvZGUgPSBlcnJvckNvZGU7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogUG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gTUVESVVNIEZJWDogTm9ybWFsaXplIHVzZXJuYW1lIGZyb20gZWxlbWVudCBtZXRhZGF0YSAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IHJhd1VzZXJuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyc7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdVc2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IFBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdlbmVyYXRlRmlsZU5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2VsZW1lbnQudHlwZX0vJHtmaWxlTmFtZX0ubWRgO1xuXG4gICAgLy8gUHJlcGFyZSBjb250ZW50IChjb3VsZCBiZSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmZvcm1hdEVsZW1lbnRDb250ZW50KGVsZW1lbnQpO1xuICAgIFxuICAgIC8vIERJQUdOT1NUSUM6IExvZyBjb250ZW50IHNpemUgYmVmb3JlIHNlbmRpbmcgdG8gR2l0SHViXG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gU2F2aW5nIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBHaXRIdWIgLSBjb250ZW50IHNpemU6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gRmlyc3QgMjAwIGNoYXJzOiAke2NvbnRlbnQuc3Vic3RyaW5nKDAsIDIwMCl9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gTGFzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgY29udGVudC5sZW5ndGggLSAyMDApKX1gKTtcblxuICAgIC8vIFNhdmUgdG8gR2l0SHViXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiBmaWxlIGV4aXN0cyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBjcmVhdGUgb3IgdXBkYXRlXG4gICAgICBsZXQgZXhpc3RpbmdGaWxlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChjaGVja0Vycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSU1QT1JUQU5UOiBBdXRoZW50aWNhdGlvbiBhbmQgcmF0ZSBsaW1pdCBlcnJvcnMgbXVzdCBiZSByZS10aHJvd24hXG4gICAgICAgIC8vIFRoZXNlIGFyZSBOT1QgXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIiBzY2VuYXJpb3MgLSB0aGV5IGluZGljYXRlIHdlIGNhbid0XG4gICAgICAgIC8vIGFjY2VzcyB0aGUgQVBJIGF0IGFsbC4gT25seSA0MDQgKGFuZCBzaW1pbGFyKSBzaG91bGQgYmUgdHJlYXRlZCBhcyBcbiAgICAgICAgLy8gXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIi4gVGhpcyBlbnN1cmVzIGF1dGggZXJyb3JzIGFyZSBwcm9wZXJseSByZXBvcnRlZFxuICAgICAgICAvLyB3aXRoIGNvcnJlY3QgZXJyb3IgY29kZXMgKGUuZy4sIFBPUlRGT0xJT19TWU5DXzAwMSBmb3IgYXV0aCBmYWlsdXJlcykuXG4gICAgICAgIC8vIFNlZSBQUiAjODQ2IGFuZCB0ZXN0OiBwb3J0Zm9saW8tc2luZ2xlLXVwbG9hZC5xYS50ZXN0LnRzXG4gICAgICAgIGlmIChjaGVja0Vycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGNoZWNrRXJyb3IuY29kZSA9PT0gJ1BPUlRGT0xJT19TWU5DXzAwMScpIHtcbiAgICAgICAgICB0aHJvdyBjaGVja0Vycm9yOyAvLyBBdXRoZW50aWNhdGlvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrRXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgY2hlY2tFcnJvci5jb2RlID09PSAnUE9SVEZPTElPX1NZTkNfMDA2Jykge1xuICAgICAgICAgIHRocm93IGNoZWNrRXJyb3I7IC8vIFJhdGUgbGltaXQgb3IgcGVybWlzc2lvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIG90aGVyIGVycm9ycyAobGlrZSA0MDQpLCBhc3N1bWUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBjb250aW51ZVxuICAgICAgICAvLyB3aXRoIGZpbGUgY3JlYXRpb24uIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3cgZm9yIG5ldyBmaWxlcy5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlIGNoZWNrIHJldHVybmVkIGVycm9yIChsaWtlbHkgZG9lc24ndCBleGlzdCk6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT04gKElzc3VlICM3OTIpOiBDaGVjayBpZiBjb250ZW50IGlzIGlkZW50aWNhbFxuICAgICAgaWYgKGV4aXN0aW5nRmlsZSAmJiBleGlzdGluZ0ZpbGUuY29udGVudCkge1xuICAgICAgICAvLyBEZWNvZGUgZXhpc3RpbmcgY29udGVudCBmcm9tIGJhc2U2NFxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBCdWZmZXIuZnJvbShleGlzdGluZ0ZpbGUuY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29tcGFyZSB3aXRoIG5ldyBjb250ZW50XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnU2tpcHBpbmcgZHVwbGljYXRlIHBvcnRmb2xpbyB1cGxvYWQgLSBjb250ZW50IGlkZW50aWNhbCcsIHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBlbGVtZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhpc3RpbmcgZmlsZSBVUkwgaW5zdGVhZCBvZiBjcmVhdGluZyBkdXBsaWNhdGUgY29tbWl0XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdVcmwgPSBleGlzdGluZ0ZpbGUuaHRtbF91cmwgfHwgXG4gICAgICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vYmxvYi9tYWluLyR7ZmlsZVBhdGh9YDtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdVcmw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgZmlsZSAob25seSBpZiBjb250ZW50IGlzIGRpZmZlcmVudClcbiAgICAgIC8vIERFQlVHOiBMb2cgd2hhdCB3ZSdyZSBhYm91dCB0byBzZW5kXG4gICAgICBsb2dnZXIuZGVidWcoYFtERUJVR10gQ3JlYXRpbmcvdXBkYXRpbmcgZmlsZS4gZXhpc3RpbmdGaWxlOiAkeyEhZXhpc3RpbmdGaWxlfSwgc2hhOiAke2V4aXN0aW5nRmlsZT8uc2hhfWApO1xuICAgICAgXG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlOiBleGlzdGluZ0ZpbGUgPyBcbiAgICAgICAgICBgVXBkYXRlICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSBpbiBwb3J0Zm9saW9gIDogXG4gICAgICAgICAgYEFkZCAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdG8gcG9ydGZvbGlvYCxcbiAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgc2hhIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgZmlsZSB3aXRoIGEgc2hhXG4gICAgICBpZiAoZXhpc3RpbmdGaWxlICYmIGV4aXN0aW5nRmlsZS5zaGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkuc2hhID0gZXhpc3RpbmdGaWxlLnNoYTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAgcmVxdWVzdEJvZHlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZJWDogR2l0SHViIEFQSSByZXNwb25zZSBzdHJ1Y3R1cmUgdmFyaWVzIC0gaGFuZGxlIGFsbCBjYXNlc1xuICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBoYXZlIGNvbW1pdCBkYXRhIGF0IGRpZmZlcmVudCBsZXZlbHMgb3Igbm90IGF0IGFsbFxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UgZm9yICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbXVsdGlwbGUgcGF0aHMgdG8gZ2V0IHRoZSBjb21taXQgVVJMXG4gICAgICBsZXQgY29tbWl0VXJsOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIFBhdGggMTogcmVzdWx0LmNvbW1pdC5odG1sX3VybCAoc3RhbmRhcmQgZm9yIGNvbnRlbnQgQVBJKVxuICAgICAgaWYgKHJlc3VsdC5jb21taXQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb21taXQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDI6IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsIChzb21lIEFQSSByZXNwb25zZXMpXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8uaHRtbF91cmwpIHtcbiAgICAgICAgY29tbWl0VXJsID0gcmVzdWx0LmNvbnRlbnQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDM6IEdlbmVyYXRlIFVSTCBmcm9tIHJlc3BvbnNlIGRhdGFcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5jb250ZW50Py5wYXRoKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtyZXN1bHQuY29udGVudC5wYXRofWA7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDQ6IEZhbGxiYWNrIHRvIHJlcG9zaXRvcnkgVVJMIChndWFyYW50ZWVkIHRvIGJlIHNldClcbiAgICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignW1BPUlRGT0xJT19TWU5DXzAwNF0gQ291bGQgbm90IGV4dHJhY3QgY29tbWl0IFVSTCBmcm9tIEdpdEh1YiByZXNwb25zZSwgdXNpbmcgZmFsbGJhY2snLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICByZXNwb25zZUtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCksXG4gICAgICAgICAgaGFzQ29tbWl0OiAhIXJlc3VsdC5jb21taXQsXG4gICAgICAgICAgaGFzQ29udGVudDogISFyZXN1bHQuY29udGVudFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWl0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L3RyZWUvbWFpbi8ke2VsZW1lbnQudHlwZX1gO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1N1Y2Nlc3NmdWxseSBzYXZlZCBlbGVtZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgY29tbWl0VXJsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbW1pdFVybDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBVc2UgZXJyb3IgY29kZSBpZiBhbHJlYWR5IHNldCBieSBnaXRodWJSZXF1ZXN0XG4gICAgICBsZXQgZXJyb3JDb2RlID0gZXJyb3IuY29kZSB8fCAnUE9SVEZPTElPX1NZTkNfMDA1JzsgLy8gRGVmYXVsdCBuZXR3b3JrIGVycm9yXG4gICAgICBsZXQgZW5oYW5jZWRNZXNzYWdlID0gJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gcG9ydGZvbGlvJztcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZXJyb3Igc3RhdHVzIGZpcnN0IChtb3JlIHJlbGlhYmxlIHRoYW4gbWVzc2FnZSBwYXJzaW5nKVxuICAgICAgaWYgKGVycm9yLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKGVycm9yLnN0YXR1cykge1xuICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBBUEkgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW4uIENoZWNrIHRva2VuIHBlcm1pc3Npb25zLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBub3QgZm91bmQuIFBsZWFzZSBydW4gaW5pdF9wb3J0Zm9saW8gZmlyc3QuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMyc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZC4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGVycm9yIGNvZGUgZnJvbSBnaXRodWJSZXF1ZXN0IGlmIHNldFxuICAgICAgICAgICAgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBtZXNzYWdlIHBhcnNpbmcgb25seSBpZiBubyBzdGF0dXMgY29kZSBhdmFpbGFibGVcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDEnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwNCcpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgcnVuIGluaXRfcG9ydGZvbGlvIGZpcnN0Lic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0Nhbm5vdCByZWFkIHByb3BlcnRpZXMnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDQnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJlc3BvbnNlIHBhcnNpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcihgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgeyBcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgZXJyb3JTdGF0dXM6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudFRvUmVwbycsIGVycm9yLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIGVycm9yU3RhdHVzOiBlcnJvci5zdGF0dXNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBUaHJvdyBlcnJvciB3aXRoIGNvZGUgZm9yIGJldHRlciBoYW5kbGluZyB1cHN0cmVhbVxuICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYFske2Vycm9yQ29kZX1dICR7ZW5oYW5jZWRNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuTkVUV09SS19FUlJPUik7XG4gICAgICAod3JhcHBlZEVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yQ29kZTtcbiAgICAgICh3cmFwcGVkRXJyb3IgYXMgYW55KS5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICB0aHJvdyB3cmFwcGVkRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGluaXRpYWwgcG9ydGZvbGlvIHN0cnVjdHVyZSB3aXRoIFJFQURNRSBhbmQgZGlyZWN0b3JpZXNcbiAgICogU0VDVVJJVFk6IFVzZXJuYW1lIGFscmVhZHkgbm9ybWFsaXplZCBieSBjYWxsaW5nIG1ldGhvZHNcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDcmVhdGUgUkVBRE1FLm1kXG4gICAgY29uc3QgcmVhZG1lQ29udGVudCA9IGAjIERvbGxob3VzZU1DUCBQb3J0Zm9saW9cblxuVGhpcyBpcyBteSBwZXJzb25hbCBjb2xsZWN0aW9uIG9mIERvbGxob3VzZU1DUCBlbGVtZW50cy5cblxuIyMgU3RydWN0dXJlXG5cbi0gKipwZXJzb25hcy8qKiAtIEJlaGF2aW9yYWwgcHJvZmlsZXNcbi0gKipza2lsbHMvKiogLSBEaXNjcmV0ZSBjYXBhYmlsaXRpZXMgIFxuLSAqKnRlbXBsYXRlcy8qKiAtIFJldXNhYmxlIGNvbnRlbnQgc3RydWN0dXJlc1xuLSAqKmFnZW50cy8qKiAtIEF1dG9ub21vdXMgYWN0b3JzXG4tICoqbWVtb3JpZXMvKiogLSBQZXJzaXN0ZW50IGNvbnRleHRcbi0gKiplbnNlbWJsZXMvKiogLSBFbGVtZW50IGdyb3Vwc1xuXG4jIyBVc2FnZVxuXG5UaGVzZSBlbGVtZW50cyBjYW4gYmUgaW1wb3J0ZWQgaW50byB5b3VyIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24uXG5cbi0tLVxuKkdlbmVyYXRlZCBieSBEb2xsaG91c2VNQ1AqXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzL1JFQURNRS5tZGAsXG4gICAgICAnUFVUJyxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogJ0luaXRpYWxpemUgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKHJlYWRtZUNvbnRlbnQpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IHBsYWNlaG9sZGVyc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gWydwZXJzb25hcycsICdza2lsbHMnLCAndGVtcGxhdGVzJywgJ2FnZW50cycsICdtZW1vcmllcycsICdlbnNlbWJsZXMnXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtkaXJ9Ly5naXRrZWVwYCxcbiAgICAgICAgJ1BVVCcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiBgQ3JlYXRlICR7ZGlyfSBkaXJlY3RvcnlgLFxuICAgICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKCcnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBiZWZvcmUgc2F2aW5nXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZWxlbWVudCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogbmFtZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IGlkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50LnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiB0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNhZmUgZmlsZW5hbWUgZnJvbSBlbGVtZW50IG5hbWVcbiAgICogU0VDVVJJVFk6IEFkZGl0aW9uYWwgVW5pY29kZSBub3JtYWxpemF0aW9uIGZvciBmaWxlbmFtZXNcbiAgICogU0VDVVJJVFkgRklYOiBGaXhlZCBSZURvUyB2dWxuZXJhYmlsaXR5IHdpdGggaW5wdXQgbGVuZ3RoIGxpbWl0IGFuZCBvcHRpbWl6ZWQgcmVnZXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgaW5wdXQgbGVuZ3RoIHRvIHByZXZlbnQgUmVEb1MgYXR0YWNrc1xuICAgIC8vIEV2ZW4gd2l0aCBvcHRpbWl6ZWQgcmVnZXgsIHZlcnkgbG9uZyBpbnB1dHMgY291bGQgY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWVzXG4gICAgY29uc3QgTUFYX0ZJTEVOQU1FX0xFTkdUSCA9IDI1NTsgLy8gQ29tbW9uIGZpbGVzeXN0ZW0gbGltaXRcbiAgICBcbiAgICAvLyBOb3JtYWxpemUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgaW4gZmlsZW5hbWVzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBUcnVuY2F0ZSB0byBzYWZlIGxlbmd0aCBCRUZPUkUgcmVnZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRydW5jYXRlZE5hbWUgPSBub3JtYWxpemVkTmFtZS5zbGljZSgwLCBNQVhfRklMRU5BTUVfTEVOR1RIKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IE9wdGltaXplZCByZWdleCBvcGVyYXRpb25zIHRvIHByZXZlbnQgUmVEb1NcbiAgICAvLyAxLiBDb252ZXJ0IG5vbi1hbHBoYW51bWVyaWMgc2VxdWVuY2VzIHRvIHNpbmdsZSBkYXNoXG4gICAgLy8gMi4gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzIGluIGEgc2luZ2xlIHBhc3MgdXNpbmcgdHJpbVxuICAgIGNvbnN0IHNhZmVOYW1lID0gdHJ1bmNhdGVkTmFtZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgIC8vIFJlbW92ZSBsZWFkaW5nIGRhc2hlc1xuICAgICAgLnJlcGxhY2UoLy0rJC8sICcnKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGRhc2hlc1xuICAgIFxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgZmlsZW5hbWUgKG5vdCBlbXB0eSBhZnRlciBjbGVhbmluZylcbiAgICByZXR1cm4gc2FmZU5hbWUgfHwgJ3VubmFtZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBlbGVtZW50IGNvbnRlbnQgZm9yIHN0b3JhZ2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudDogSUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIC8vIFNlcmlhbGl6ZSB0aGUgZWxlbWVudCBvciBjcmVhdGUgYmFzaWMgbWFya2Rvd25cbiAgICBpZiAoZWxlbWVudC5zZXJpYWxpemUpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZSgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBtYXJrZG93biBmb3JtYXRcbiAgICByZXR1cm4gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gIH1cbn0iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersonaTools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/PersonaTools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"PersonaTools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/PersonaTools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CA2D/G"}
|