@ieeesa-npm/groups 0.15.10 → 0.15.11
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/esm2022/lib/assets/constants.json +12 -0
- package/esm2022/lib/components/roster-import/roster-import.component.mjs +120 -28
- package/esm2022/lib/groups.component.mjs +24 -2
- package/esm2022/lib/models/roster-import.model.mjs +1 -1
- package/esm2022/lib/services/groups.service.mjs +24 -1
- package/fesm2022/ieeesa-npm-groups.mjs +177 -28
- package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
- package/lib/components/roster-import/roster-import.component.d.ts +48 -8
- package/lib/groups.component.d.ts +14 -1
- package/lib/models/roster-import.model.d.ts +6 -3
- package/lib/services/groups.service.d.ts +20 -0
- package/package.json +1 -1
|
@@ -358,6 +358,16 @@
|
|
|
358
358
|
"Producer"
|
|
359
359
|
]
|
|
360
360
|
],
|
|
361
|
+
"tenantFieldLabels": {
|
|
362
|
+
"phone": "Phone Number",
|
|
363
|
+
"address": "Address",
|
|
364
|
+
"employer": "Employer"
|
|
365
|
+
},
|
|
366
|
+
"tenantFieldSampleValues": {
|
|
367
|
+
"phone": "+1 555 000 1234",
|
|
368
|
+
"address": "123 Main St, City, Country",
|
|
369
|
+
"employer": "Acme Corp"
|
|
370
|
+
},
|
|
361
371
|
"uploadLabel": "Upload your file",
|
|
362
372
|
"downloadSampleLabel": "Download Sample File",
|
|
363
373
|
"sampleFileName": "Roster_Sample.csv",
|
|
@@ -383,6 +393,7 @@
|
|
|
383
393
|
"singleFileOnly": "Please upload a single file at a time.",
|
|
384
394
|
"noDataRecords": "No roster data found. The selected file contains headers but no roster records.",
|
|
385
395
|
"missingHeaders": "Incorrect file format. Mandatory column headers are missing",
|
|
396
|
+
"forbidden": "You do not have permission to import a roster for this group.",
|
|
386
397
|
"uploadFailed": "An error occurred while importing the roster. Please try again."
|
|
387
398
|
},
|
|
388
399
|
"errorLog": {
|
|
@@ -466,6 +477,7 @@
|
|
|
466
477
|
"1037": "Group and parent group should not be same.",
|
|
467
478
|
"1038": "Reassigning parent for this group is not allowed.",
|
|
468
479
|
"1039": "You may not remove yourself from admin role.",
|
|
480
|
+
"1071": "You do not have permission to import a roster for this group.",
|
|
469
481
|
"1072": "Incorrect file type. Only .xlsx and .csv files are supported.",
|
|
470
482
|
"1073": "File size exceeds the maximum allowed size of 10MB.",
|
|
471
483
|
"1074": "The file exceeds the maximum allowed limit of 10,000 rows.",
|
|
@@ -68,9 +68,76 @@ export class RosterImportComponent {
|
|
|
68
68
|
/** Accepted file extensions (must match the BE contract: only .csv / .xlsx). */
|
|
69
69
|
this.ACCEPTED_EXTENSIONS = ['.csv', '.xlsx'];
|
|
70
70
|
}
|
|
71
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* Required column headers for display and the sample file. This is the static
|
|
73
|
+
* base set from constants PLUS any tenant-level required profile fields the
|
|
74
|
+
* host app configured (e.g. phone / address / employer), mapped to friendly
|
|
75
|
+
* headers and de-duplicated (case-insensitive) against the base columns.
|
|
76
|
+
* @return {string[]}
|
|
77
|
+
*/
|
|
72
78
|
get requiredColumns() {
|
|
73
|
-
|
|
79
|
+
const base = this.screenTexts?.requiredColumns ?? [];
|
|
80
|
+
return this.mergeTenantColumns(base);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Appends the tenant-configured columns (from {@link tenantExtraColumns}) to
|
|
84
|
+
* the base column headers.
|
|
85
|
+
* @param {string[]} base - The static base column headers.
|
|
86
|
+
* @return {string[]}
|
|
87
|
+
* @memberof RosterImportComponent
|
|
88
|
+
*/
|
|
89
|
+
mergeTenantColumns(base) {
|
|
90
|
+
const extras = this.tenantExtraColumns(base);
|
|
91
|
+
return extras.length ? [...base, ...extras.map((c) => c.label)] : base;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolves the tenant-configured required profile fields into the EXTRA
|
|
95
|
+
* columns to append after the base set — the single source of truth shared by
|
|
96
|
+
* both the header list ({@link requiredColumns}) and the sample file
|
|
97
|
+
* ({@link downloadSampleFile}) so the two never drift out of alignment.
|
|
98
|
+
*
|
|
99
|
+
* Each field becomes one column with its friendly `label` (known keys use the
|
|
100
|
+
* label map; unknown keys fall back to a title-cased key) and a `sampleValue`
|
|
101
|
+
* for the sample row. Fields whose label already exists in the base set
|
|
102
|
+
* (case-insensitive) are skipped so a tenant field like "employer" that is
|
|
103
|
+
* already a base column is not duplicated.
|
|
104
|
+
* @param {string[]} base - The static base column headers.
|
|
105
|
+
* @return {{ label: string; sampleValue: string }[]}
|
|
106
|
+
* @memberof RosterImportComponent
|
|
107
|
+
*/
|
|
108
|
+
tenantExtraColumns(base) {
|
|
109
|
+
const tenantFields = this.groupService?.getRequiredProfileFields() ?? [];
|
|
110
|
+
if (!tenantFields.length) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const sampleMap = this.screenTexts?.tenantFieldSampleValues ?? {};
|
|
114
|
+
const seen = new Set(base.map((col) => col.toLowerCase()));
|
|
115
|
+
const extras = [];
|
|
116
|
+
tenantFields.forEach((field) => {
|
|
117
|
+
const label = this.tenantFieldLabel(field);
|
|
118
|
+
if (label && !seen.has(label.toLowerCase())) {
|
|
119
|
+
seen.add(label.toLowerCase());
|
|
120
|
+
extras.push({ label, sampleValue: sampleMap[field] ?? '' });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return extras;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Maps a tenant field key to its display header. Known keys use the configured
|
|
127
|
+
* label map; unknown keys fall back to a title-cased key.
|
|
128
|
+
* @param {string} field - The tenant field key (e.g. 'phone').
|
|
129
|
+
* @return {string}
|
|
130
|
+
* @memberof RosterImportComponent
|
|
131
|
+
*/
|
|
132
|
+
tenantFieldLabel(field) {
|
|
133
|
+
const labels = this.screenTexts?.tenantFieldLabels ?? {};
|
|
134
|
+
if (labels[field]) {
|
|
135
|
+
return labels[field];
|
|
136
|
+
}
|
|
137
|
+
// Fallback: "phone_number" -> "Phone Number".
|
|
138
|
+
return field
|
|
139
|
+
.replace(/[_-]+/g, ' ')
|
|
140
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
74
141
|
}
|
|
75
142
|
/** Comma-separated accepted file types for the input element. */
|
|
76
143
|
get acceptedFileTypes() {
|
|
@@ -256,6 +323,8 @@ export class RosterImportComponent {
|
|
|
256
323
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
257
324
|
handleImportError(error) {
|
|
258
325
|
this.importState = 'upload';
|
|
326
|
+
// BE error codes take priority when present (e.g. 1071 no permission, 1072
|
|
327
|
+
// format, 1073 too large, 1074 row limit, 1075 invalid status).
|
|
259
328
|
const errorCodes = error?.error?.body?.errorCodes;
|
|
260
329
|
if (Array.isArray(errorCodes) && errorCodes.length) {
|
|
261
330
|
const code = errorCodes[0];
|
|
@@ -265,6 +334,16 @@ export class RosterImportComponent {
|
|
|
265
334
|
'An error occurred while importing the roster. Please try again.';
|
|
266
335
|
return;
|
|
267
336
|
}
|
|
337
|
+
// A 403 with no error-code body comes from the endpoint's @PreAuthorize
|
|
338
|
+
// (the user lacks Manage Group Member / Manage All Rosters for this group).
|
|
339
|
+
// Show the permission message — retrying will not help.
|
|
340
|
+
const status = error?.status ?? error?.error?.status;
|
|
341
|
+
if (status === 403) {
|
|
342
|
+
this.errorMessage =
|
|
343
|
+
this.screenTexts?.validation?.forbidden ??
|
|
344
|
+
'You do not have permission to import a roster for this group.';
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
268
347
|
this.errorMessage =
|
|
269
348
|
this.screenTexts?.validation?.uploadFailed ??
|
|
270
349
|
'An error occurred while importing the roster. Please try again.';
|
|
@@ -290,36 +369,43 @@ export class RosterImportComponent {
|
|
|
290
369
|
}
|
|
291
370
|
}
|
|
292
371
|
/**
|
|
293
|
-
*
|
|
372
|
+
* Normalizes the BE `error_report` into row-error view models.
|
|
294
373
|
*
|
|
295
|
-
* The BE
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
374
|
+
* The BE wraps the per-row entries in a `{ rows: [ { row, field, message } ] }`
|
|
375
|
+
* document, but that value has been observed to arrive in MULTIPLE shapes:
|
|
376
|
+
* - a parsed object `{ rows: [...] }` (confirm response — the common case),
|
|
377
|
+
* - a raw JSON string of the same object (JSONB passthrough), or
|
|
378
|
+
* - a bare array `[ { row, field, message } ]`.
|
|
379
|
+
* This handles all three (and `null`) so the error log renders regardless of
|
|
380
|
+
* how the field is serialized.
|
|
381
|
+
* @param {*} errorReport - The BE error_report (object, string, array, or null).
|
|
301
382
|
* @return {RosterImportRowError[]}
|
|
302
383
|
* @memberof RosterImportComponent
|
|
303
384
|
*/
|
|
385
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
304
386
|
parseErrorReport(errorReport) {
|
|
305
387
|
if (!errorReport) {
|
|
306
388
|
return [];
|
|
307
389
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
}));
|
|
318
|
-
}
|
|
319
|
-
catch {
|
|
320
|
-
// Malformed error report — surface no per-row errors rather than crash.
|
|
321
|
-
return [];
|
|
390
|
+
// If it's a string, parse it first; on parse failure, no row errors.
|
|
391
|
+
let value = errorReport;
|
|
392
|
+
if (typeof errorReport === 'string') {
|
|
393
|
+
try {
|
|
394
|
+
value = JSON.parse(errorReport);
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
return [];
|
|
398
|
+
}
|
|
322
399
|
}
|
|
400
|
+
// Accept either a bare array or a { rows: [...] } wrapper object.
|
|
401
|
+
const entries = Array.isArray(value)
|
|
402
|
+
? value
|
|
403
|
+
: (value?.rows ?? []);
|
|
404
|
+
return entries.map((entry) => ({
|
|
405
|
+
rowNumber: entry?.row,
|
|
406
|
+
field: entry?.field,
|
|
407
|
+
errorMessage: entry?.message,
|
|
408
|
+
}));
|
|
323
409
|
}
|
|
324
410
|
/**
|
|
325
411
|
* Whether the result state should show the summary cards (added / skipped).
|
|
@@ -351,10 +437,16 @@ export class RosterImportComponent {
|
|
|
351
437
|
.map((col) => this.toCsvCell(col))
|
|
352
438
|
.join(',');
|
|
353
439
|
// Sample data rows so the downloaded file shows the expected format, not
|
|
354
|
-
// just the column headers.
|
|
355
|
-
//
|
|
356
|
-
|
|
357
|
-
|
|
440
|
+
// just the column headers. The base row values come from constants; sample
|
|
441
|
+
// values for any tenant-configured columns are appended (from the SAME
|
|
442
|
+
// source that builds the headers) so every row lines up with the
|
|
443
|
+
// (base + tenant) header set.
|
|
444
|
+
const base = this.screenTexts?.requiredColumns ?? [];
|
|
445
|
+
const baseSampleRows = this.screenTexts?.sampleRows ?? [];
|
|
446
|
+
const tenantSampleCells = this.tenantExtraColumns(base).map((col) => col.sampleValue);
|
|
447
|
+
const dataLines = baseSampleRows.map((row) => [...row, ...tenantSampleCells]
|
|
448
|
+
.map((cell) => this.toCsvCell(cell))
|
|
449
|
+
.join(','));
|
|
358
450
|
const csvContent = [headerLine, ...dataLines].join('\r\n') + '\r\n';
|
|
359
451
|
const blob = new Blob([csvContent], {
|
|
360
452
|
type: 'text/csv;charset=utf-8;',
|
|
@@ -440,4 +532,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
440
532
|
}], formCancel: [{
|
|
441
533
|
type: Output
|
|
442
534
|
}] } });
|
|
443
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWltcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU9yRCxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7O0FBc0J6RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUFtRGhDO0lBQ0UsMENBQTBDO0lBQ2xDLHNCQUE4QztJQUN0RCwwQ0FBMEM7SUFDbEMsWUFBMkI7UUFGM0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUU5QyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWxEckMsOEVBQThFO1FBQzlFLDhEQUE4RDtRQUNwRCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHFFQUFxRTtRQUMzRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVoRCxh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biAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIFJvc3RlckltcG9ydEVycm9yUmVwb3J0LFxyXG4gIFJvc3RlckltcG9ydEpvYixcclxufSBmcm9tICcuLi8uLi9tb2RlbHMvcm9zdGVyLWltcG9ydC5tb2RlbCc7XHJcbmltcG9ydCB7IFJvc3RlckltcG9ydEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3N0ZXItaW1wb3J0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKiogU3RhdGVzIG9mIHRoZSByb3N0ZXIgaW1wb3J0IGZsb3cuICovXHJcbnR5cGUgUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJyB8ICdwcm9jZXNzaW5nJyB8ICdyZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIFZpZXctbW9kZWwgZm9yIHRoZSByZXN1bHQgc2NyZWVuLiBQb3B1bGF0ZWQgZnJvbSB0aGUgY29uZmlybWVkXHJcbiAqIHtAbGluayBSb3N0ZXJJbXBvcnRKb2J9IHJldHVybmVkIGJ5IHRoZSBiYWNrZW5kLlxyXG4gKi9cclxuaW50ZXJmYWNlIFJvc3RlckltcG9ydFJlc3VsdCB7XHJcbiAgdG90YWxSZWNvcmRzOiBudW1iZXI7XHJcbiAgc3VjY2Vzc0NvdW50OiBudW1iZXI7XHJcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBSb3cgZXJyb3Igc2hvd24gb24gdGhlIHJlc3VsdCBzY3JlZW4gKG1hcHBlZCBmcm9tIHRoZSBCRSBlcnJvciByZXBvcnQpLiAqL1xyXG5pbnRlcmZhY2UgUm9zdGVySW1wb3J0Um93RXJyb3Ige1xyXG4gIHJvd051bWJlcjogbnVtYmVyO1xyXG4gIGZpZWxkPzogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUm9zdGVyIEltcG9ydCBkaWFsb2cuXHJcbiAqXHJcbiAqIExldHMgYW4gYWRtaW4gdXBsb2FkIGEgQ1NWL1hMU1ggcm9zdGVyIGZpbGUsIHNob3dzIGEgcHJvY2Vzc2luZyBwcm9ncmVzc1xyXG4gKiBiYXIsIHRoZW4gYSByZXN1bHQgc3VtbWFyeSAoYWRkZWQgLyBza2lwcGVkKSB3aXRoIHBlci1yb3cgZXJyb3JzIGFuZCBhblxyXG4gKiBlcnJvci1sb2cgZG93bmxvYWQuXHJcbiAqXHJcbiAqIFdpcmVkIHRvIHRoZSByZWFsIGJhY2tlbmQgcm9zdGVyLWltcG9ydCBzdGF0ZSBtYWNoaW5lXHJcbiAqIChzYS1zYWFwcHMtZ3JvdXBzLWFwaSBgUm9zdGVySW1wb3J0Q29udHJvbGxlcmApIHZpYVxyXG4gKiB7QGxpbmsgUm9zdGVySW1wb3J0QXBpU2VydmljZX06IG9uIEltcG9ydCBpdCBydW5zXHJcbiAqIHVwbG9hZCDihpIgdmFsaWRhdGUg4oaSIGNvbmZpcm0gYW5kIHJlbmRlcnMgdGhlIGNvbmZpcm1lZCBqb2IncyB0ZXJtaW5hbCBjb3VudHNcclxuICogYW5kIHBlci1yb3cgZXJyb3JzLiBTZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIGVycm9ycyAoMTA3MiB1bnN1cHBvcnRlZCBmb3JtYXQsXHJcbiAqIDEwNzMgdG9vIGxhcmdlLCAxMDc0IHJvdyBsaW1pdCwgMTA3NSBpbnZhbGlkIHN0YXR1cykgYXJlIHN1cmZhY2VkIGlubGluZS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2llZWVzYS1yb3N0ZXItaW1wb3J0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0UHJvZ3Jlc3NCYXJNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvc3RlckltcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogQ2FycmllcyB0aGUgeyBncm91cElkLCBncm91cE5hbWUgfSBwYXlsb2FkIGZyb20gdGhlIG9wZW5pbmcgZGlhbG9nLiAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgQElucHV0KCkgY29tcG9uZW50RGF0YTogYW55O1xyXG5cclxuICAvKiogRW1pdHRlZCBhZnRlciBhbiBpbXBvcnQgdGhhdCBhZGRlZCBhdCBsZWFzdCBvbmUgcm93IChwYXJlbnQgcmVmcmVzaGVzKS4gKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIEBPdXRwdXQoKSBzdWJtaXRGb3JtUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzL2Nsb3NlcyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBhZGQuICovXHJcbiAgQE91dHB1dCgpIGZvcm1DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IGNvbnN0YW50cztcclxuICBzY3JlZW5UZXh0cyA9IHRoaXMuY29uc3RhbnRzPy5yb3N0ZXJJbXBvcnQ7XHJcblxyXG4gIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBpbXBvcnQgZmxvdy4gKi9cclxuICBpbXBvcnRTdGF0ZTogUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJztcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBmaWxlLiAqL1xyXG4gIHNlbGVjdGVkRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogRmlsZSBkcmFnLW92ZXIgc3RhdGUuICovXHJcbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG5cclxuICAvKiogVGVybWluYWwgdXBsb2FkIHJlc3VsdC4gKi9cclxuICB1cGxvYWRSZXN1bHQ6IFJvc3RlckltcG9ydFJlc3VsdCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogUm93LWxldmVsIGVycm9ycyBmb3IgdGhlIGNvbXBsZXRlZCBqb2IuICovXHJcbiAgam9iRXJyb3JzOiBSb3N0ZXJJbXBvcnRSb3dFcnJvcltdID0gW107XHJcblxyXG4gIC8qKiBJbmxpbmUgdmFsaWRhdGlvbiAvIEFQSSBlcnJvciBtZXNzYWdlLiAqL1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm8gYmFubmVyIHNob3duIHdoZW4gdGhlIGZpbGUgaGFzIGhlYWRlcnMgYnV0IG5vIGRhdGEgcm93c1xyXG4gICAqIChGaWdtYTogXCJObyByb3N0ZXIgZGF0YSBmb3VuZC4uLlwiKS5cclxuICAgKi9cclxuICBub0RhdGFNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFRoZSBpbXBvcnQgam9iIGlkIHJldHVybmVkIGJ5IHVwbG9hZCAoa2VwdCBzbyBjYW5jZWwgY2FuIGNsZWFuIGl0IHVwKS4gKi9cclxuICBwcml2YXRlIGltcG9ydElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIGJ5dGVzICgxMCBNQikg4oCUIG1hdGNoZXMgdGhlIEJFIDEwTUIgbGltaXQuICovXHJcbiAgcmVhZG9ubHkgTUFYX0ZJTEVfU0laRSA9IDEwXzQ4NV83NjA7XHJcblxyXG4gIC8qKiBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMgKG11c3QgbWF0Y2ggdGhlIEJFIGNvbnRyYWN0OiBvbmx5IC5jc3YgLyAueGxzeCkuICovXHJcbiAgcmVhZG9ubHkgQUNDRVBURURfRVhURU5TSU9OUyA9IFsnLmNzdicsICcueGxzeCddO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSByb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlOiBSb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3VwU2VydmljZTogR3JvdXBzU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqIFJlcXVpcmVkIGNvbHVtbiBoZWFkZXJzIGZvciBkaXNwbGF5LiAqL1xyXG4gIGdldCByZXF1aXJlZENvbHVtbnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuVGV4dHM/LnJlcXVpcmVkQ29sdW1ucyA/PyBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBDb21tYS1zZXBhcmF0ZWQgYWNjZXB0ZWQgZmlsZSB0eXBlcyBmb3IgdGhlIGlucHV0IGVsZW1lbnQuICovXHJcbiAgZ2V0IGFjY2VwdGVkRmlsZVR5cGVzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5BQ0NFUFRFRF9FWFRFTlNJT05TLmpvaW4oJywnKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgdGFyZ2V0IGdyb3VwIGlkIGZyb20gdGhlIGRpYWxvZyBwYXlsb2FkIChmYWxscyBiYWNrIHRvIHNlbGVjdGlvbikuICovXHJcbiAgcHJpdmF0ZSBnZXQgZ3JvdXBJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb21wb25lbnREYXRhPy5ncm91cElkID8/XHJcbiAgICAgICh0aGlzLmdyb3VwU2VydmljZT8uZ2V0U2VsZWN0ZWRHcm91cEluZm8oKT8uZ3JvdXBJZCBhcyBzdHJpbmcpID8/XHJcbiAgICAgICcnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgQVBJIGJhc2UgVVJMIG9uIHRoZSBpbXBvcnQgc2VydmljZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvc3RlckltcG9ydEFwaVNlcnZpY2Uuc2V0QXBpQmFzZVVybCh0aGlzLmdyb3VwU2VydmljZT8uYXBpQmFzZVVybCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhbnMgdXAgc3Vic2NyaXB0aW9ucyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYSBmaWxlIHNlbGVjdGVkIHZpYSB0aGUgYnJvd3NlIGRpYWxvZy5cclxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBjaGFuZ2UgZXZlbnQgZnJvbSB0aGUgaGlkZGVuIGZpbGUgaW5wdXQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmICghaW5wdXQuZmlsZXMgfHwgaW5wdXQuZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dC5maWxlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuc2hvd1NpbmdsZUZpbGVPbmx5RXJyb3IoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9jZXNzRmlsZShpbnB1dC5maWxlc1swXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGEgZmlsZSBkcm9wcGVkIG9udG8gdGhlIGRyb3B6b25lLlxyXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudCAtIFRoZSBkcm9wIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkZpbGVEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5zaG93U2luZ2xlRmlsZU9ubHlFcnJvcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2Nlc3NGaWxlKGZpbGVzWzBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgZHJhZy1vdmVyIG9uIHRoZSBkcm9wem9uZS5cclxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnQgLSBUaGUgZHJhZ292ZXIgZXZlbnQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0RyYWdPdmVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgZHJhZy1sZWF2ZSBvbiB0aGUgZHJvcHpvbmUuXHJcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50IC0gVGhlIGRyYWdsZWF2ZSBldmVudC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgdGhlIGZpbGUgdHlwZSBhbmQgc2l6ZSwgdGhlbiBlaXRoZXIgc2V0cyBpdCBvciBzaG93cyBhbiBlcnJvci5cclxuICAgKiBAcGFyYW0ge0ZpbGV9IGZpbGUgLSBUaGUgY2FuZGlkYXRlIGZpbGUuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByb2Nlc3NGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLnVwbG9hZFJlc3VsdCA9IG51bGw7XHJcbiAgICB0aGlzLmltcG9ydElkID0gbnVsbDtcclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91c2x5IHNlbGVjdGVkICh2YWxpZCkgZmlsZSBzbyBhbiBpbnZhbGlkIG5ldyBzZWxlY3Rpb25cclxuICAgIC8vIGNhbid0IGxlYXZlIHRoZSBJbXBvcnQgYnV0dG9uIGVuYWJsZWQgZm9yIGEgc3RhbGUgZmlsZS5cclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcclxuXHJcbiAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgaXNWYWxpZEV4dGVuc2lvbiA9IHRoaXMuQUNDRVBURURfRVhURU5TSU9OUy5zb21lKChleHQpID0+XHJcbiAgICAgIGZpbGVOYW1lLmVuZHNXaXRoKGV4dClcclxuICAgICk7XHJcbiAgICBpZiAoIWlzVmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LnVuc3VwcG9ydGVkVHlwZSA/P1xyXG4gICAgICAgICdJbmNvcnJlY3QgZmlsZSB0eXBlLiBQbGVhc2UgdXBsb2FkIGEgdmFsaWQgLmNzdiBvciAueGxzeCBmaWxlLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5lbXB0eUZpbGUgPz9cclxuICAgICAgICAnVGhlIHNlbGVjdGVkIGZpbGUgaXMgZW1wdHkuIFBsZWFzZSB1cGxvYWQgYSBmaWxlIHdpdGggcm9zdGVyIHJlY29yZHMuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLk1BWF9GSUxFX1NJWkUpIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmZpbGVUb29MYXJnZSA/P1xyXG4gICAgICAgICdGaWxlIHNpemUgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUgb2YgMTBNQi4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgdGhlIHNpbmdsZS1maWxlLW9ubHkgdmFsaWRhdGlvbiBtZXNzYWdlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93U2luZ2xlRmlsZU9ubHlFcnJvcigpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8uc2luZ2xlRmlsZU9ubHkgPz9cclxuICAgICAgJ1BsZWFzZSB1cGxvYWQgYSBzaW5nbGUgZmlsZSBhdCBhIHRpbWUuJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmaWxlIGFuZCByZXNldHMgdG8gdGhlIHVwbG9hZCBzdGF0ZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25SZW1vdmVGaWxlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gbnVsbDtcclxuICAgIHRoaXMuaW1wb3J0SWQgPSBudWxsO1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICd1cGxvYWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUnVucyB0aGUgcmVhbCBpbXBvcnQ6IHVwbG9hZCDihpIgdmFsaWRhdGUg4oaSIGNvbmZpcm0uIFRoZSBwcm9ncmVzcyBiYXIgaXNcclxuICAgKiBzaG93biBpbiBpbmRldGVybWluYXRlIG1vZGUgd2hpbGUgdGhlIGNoYWluIGlzIGluIGZsaWdodCwgdGhlbiB0aGVcclxuICAgKiBjb25maXJtZWQgam9iJ3MgdGVybWluYWwgY291bnRzICsgcGVyLXJvdyBlcnJvcnMgZHJpdmUgdGhlIHJlc3VsdCBzY3JlZW4uXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uSW1wb3J0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBJZCkge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udXBsb2FkRmFpbGVkID8/XHJcbiAgICAgICAgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGltcG9ydGluZyB0aGUgcm9zdGVyLiBQbGVhc2UgdHJ5IGFnYWluLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLnVwbG9hZFJlc3VsdCA9IG51bGw7XHJcbiAgICB0aGlzLmpvYkVycm9ycyA9IFtdO1xyXG4gICAgdGhpcy5pbXBvcnRJZCA9IG51bGw7XHJcbiAgICB0aGlzLmltcG9ydFN0YXRlID0gJ3Byb2Nlc3NpbmcnO1xyXG5cclxuICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZVxyXG4gICAgICAudXBsb2FkSW1wb3J0RmlsZSh0aGlzLnNlbGVjdGVkRmlsZSwgdGhpcy5ncm91cElkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGpvYjogUm9zdGVySW1wb3J0Sm9iKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmltcG9ydElkID0gam9iPy5pbXBvcnRJZCA/PyBudWxsO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZS52YWxpZGF0ZUltcG9ydEpvYihcclxuICAgICAgICAgICAgdGhpcy5pbXBvcnRJZCBhcyBzdHJpbmdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XHJcbiAgICAgICAgICB0aGlzLnJvc3RlckltcG9ydEFwaVNlcnZpY2UuY29uZmlybUltcG9ydEpvYih0aGlzLmltcG9ydElkIGFzIHN0cmluZylcclxuICAgICAgICApLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChjb25maXJtZWRKb2I6IFJvc3RlckltcG9ydEpvYikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maW5hbGl6ZVJlc3VsdChjb25maXJtZWRKb2IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlSW1wb3J0RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBhIGZhaWxlZCBpbXBvcnQgY2FsbCB0byBhbiBpbmxpbmUgZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyB0aGUgVUkgdG9cclxuICAgKiB0aGUgdXBsb2FkIHN0YXRlIHNvIHRoZSB1c2VyIGNhbiByZXRyeS4gS25vd24gQkUgZXJyb3IgY29kZXMgKDEwNzLigJMxMDc1KVxyXG4gICAqIGFyZSBtYXBwZWQgdmlhIGNvbnN0YW50czsgYW55dGhpbmcgZWxzZSB1c2VzIHRoZSBnZW5lcmljIG1lc3NhZ2UuXHJcbiAgICogQHBhcmFtIHsqfSBlcnJvciAtIFRoZSBIdHRwRXJyb3JSZXNwb25zZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIGhhbmRsZUltcG9ydEVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaW1wb3J0U3RhdGUgPSAndXBsb2FkJztcclxuICAgIGNvbnN0IGVycm9yQ29kZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gZXJyb3I/LmVycm9yPy5ib2R5Py5lcnJvckNvZGVzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JDb2RlcykgJiYgZXJyb3JDb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgY29kZSA9IGVycm9yQ29kZXNbMF0gYXMga2V5b2YgdHlwZW9mIHRoaXMuY29uc3RhbnRzLmVycm9ycztcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuY29uc3RhbnRzPy5lcnJvcnM/Lltjb2RlXSA/P1xyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LnVwbG9hZEZhaWxlZCA/P1xyXG4gICAgICAgICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbXBvcnRpbmcgdGhlIHJvc3Rlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LnVwbG9hZEZhaWxlZCA/P1xyXG4gICAgICAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW1wb3J0aW5nIHRoZSByb3N0ZXIuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyB0aGUgdGVybWluYWwgcmVzdWx0IGFuZCBtb3ZlcyB0byB0aGUgcmVzdWx0IHN0YXRlLiBXaGVuIHRoZSBqb2IgaGFkXHJcbiAgICogbm8gZGF0YSByb3dzLCBzaG93cyB0aGUgXCJubyByb3N0ZXIgZGF0YVwiIGluZm8gYmFubmVyIGluc3RlYWQgb2YgdGhlIHN1bW1hcnlcclxuICAgKiBjYXJkcy5cclxuICAgKiBAcGFyYW0ge1Jvc3RlckltcG9ydEpvYn0gam9iIC0gVGhlIGNvbmZpcm1lZCBpbXBvcnQgam9iLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBmaW5hbGl6ZVJlc3VsdChqb2I6IFJvc3RlckltcG9ydEpvYik6IHZvaWQge1xyXG4gICAgY29uc3QgdG90YWxSZWNvcmRzID0gam9iPy50b3RhbFJvd3MgPz8gMDtcclxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudCA9IGpvYj8uc3VjY2Vzc1Jvd3MgPz8gMDtcclxuICAgIGNvbnN0IGZhaWx1cmVDb3VudCA9IGpvYj8uZmFpbGVkUm93cyA/PyAwO1xyXG5cclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0geyB0b3RhbFJlY29yZHMsIHN1Y2Nlc3NDb3VudCwgZmFpbHVyZUNvdW50IH07XHJcbiAgICB0aGlzLmpvYkVycm9ycyA9IHRoaXMucGFyc2VFcnJvclJlcG9ydChqb2I/LmVycm9yUmVwb3J0KTtcclxuICAgIHRoaXMuaW1wb3J0U3RhdGUgPSAncmVzdWx0JztcclxuXHJcbiAgICBpZiAodG90YWxSZWNvcmRzID09PSAwKSB7XHJcbiAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8ubm9EYXRhUmVjb3JkcyA/P1xyXG4gICAgICAgICdObyByb3N0ZXIgZGF0YSBmb3VuZC4gVGhlIHNlbGVjdGVkIGZpbGUgY29udGFpbnMgaGVhZGVycyBidXQgbm8gcm9zdGVyIHJlY29yZHMuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyB0aGUgQkUgYGVycm9yUmVwb3J0YCByYXcgSlNPTiBzdHJpbmcgaW50byByb3ctZXJyb3IgdmlldyBtb2RlbHMuXHJcbiAgICpcclxuICAgKiBUaGUgQkUgc3RvcmVzIHRoZSByZXBvcnQgYXMgYSBKU09OQiBkb2N1bWVudCB3cmFwcGluZyB0aGUgcGVyLXJvdyBlbnRyaWVzOlxyXG4gICAqIGB7IFwicm93c1wiOiBbIHsgXCJyb3dcIjogMiwgXCJmaWVsZFwiOiBcIkVtYWlsXCIsIFwibWVzc2FnZVwiOiBcIi4uLlwiIH0gXSB9YFxyXG4gICAqIChzZXJpYWxpemVkIGJ5IGl0cyBgRXJyb3JSZXBvcnRXcmFwcGVyYCkgYW5kIHJldHVybnMgaXQgdmVyYmF0aW0gdmlhXHJcbiAgICogYEBKc29uUmF3VmFsdWVgLiBTbyB3ZSByZWFkIGBwYXJzZWQucm93c2AuIEEgYmFyZSB0b3AtbGV2ZWwgYXJyYXkgaXMgYWxzb1xyXG4gICAqIGFjY2VwdGVkIGFzIGEgZmFsbGJhY2sgaW4gY2FzZSB0aGUgY29udHJhY3QgaXMgZXZlciBmbGF0dGVuZWQuXHJcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKX0gZXJyb3JSZXBvcnQgLSBSYXcgSlNPTiBlcnJvciByZXBvcnQgc3RyaW5nLlxyXG4gICAqIEByZXR1cm4ge1Jvc3RlckltcG9ydFJvd0Vycm9yW119XHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VFcnJvclJlcG9ydChlcnJvclJlcG9ydD86IHN0cmluZyk6IFJvc3RlckltcG9ydFJvd0Vycm9yW10ge1xyXG4gICAgaWYgKCFlcnJvclJlcG9ydCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGVycm9yUmVwb3J0KSBhc1xyXG4gICAgICAgIHwgeyByb3dzPzogUm9zdGVySW1wb3J0RXJyb3JSZXBvcnRbXSB9XHJcbiAgICAgICAgfCBSb3N0ZXJJbXBvcnRFcnJvclJlcG9ydFtdO1xyXG4gICAgICBjb25zdCBlbnRyaWVzOiBSb3N0ZXJJbXBvcnRFcnJvclJlcG9ydFtdID0gQXJyYXkuaXNBcnJheShwYXJzZWQpXHJcbiAgICAgICAgPyBwYXJzZWRcclxuICAgICAgICA6IHBhcnNlZD8ucm93cyA/PyBbXTtcclxuICAgICAgcmV0dXJuIGVudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcclxuICAgICAgICByb3dOdW1iZXI6IGVudHJ5Py5yb3csXHJcbiAgICAgICAgZmllbGQ6IGVudHJ5Py5maWVsZCxcclxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVudHJ5Py5tZXNzYWdlLFxyXG4gICAgICB9KSk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gTWFsZm9ybWVkIGVycm9yIHJlcG9ydCDigJQgc3VyZmFjZSBubyBwZXItcm93IGVycm9ycyByYXRoZXIgdGhhbiBjcmFzaC5cclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgcmVzdWx0IHN0YXRlIHNob3VsZCBzaG93IHRoZSBzdW1tYXJ5IGNhcmRzIChhZGRlZCAvIHNraXBwZWQpLlxyXG4gICAqIEhpZGRlbiBmb3IgdGhlIFwibm8gZGF0YSByZWNvcmRzXCIgY2FzZS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgc2hvd1N1bW1hcnlDYXJkcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudXBsb2FkUmVzdWx0ICYmIHRoaXMudXBsb2FkUmVzdWx0LnRvdGFsUmVjb3JkcyA+IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIGV2ZXJ5IHByb2Nlc3NlZCByb3cgd2FzIHNraXBwZWQgKGRyaXZlcyB0aGUgXCJBbGwgUm93cyBhcmUgc2tpcHBlZFwiXHJcbiAgICogaGVhZGVyIG9uIHRoZSBlcnJvcnMgY2FyZCkuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IGFsbFJvd3NTa2lwcGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgISF0aGlzLnVwbG9hZFJlc3VsdCAmJlxyXG4gICAgICB0aGlzLnVwbG9hZFJlc3VsdC50b3RhbFJlY29yZHMgPiAwICYmXHJcbiAgICAgIHRoaXMudXBsb2FkUmVzdWx0LnN1Y2Nlc3NDb3VudCA9PT0gMFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyBhIGNsaWVudC1zaWRlIENTViBzYW1wbGUgZmlsZSBmcm9tIHRoZSByZXF1aXJlZCBjb2x1bW5zIGFuZCB0cmlnZ2Vyc1xyXG4gICAqIGEgYnJvd3NlciBkb3dubG9hZC4gKENsaWVudC1zaWRlIGdlbmVyYXRpb24gdW50aWwgdGhlIHRlbXBsYXRlIEFQSSBleGlzdHMuKVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBkb3dubG9hZFNhbXBsZUZpbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWFkZXJMaW5lID0gdGhpcy5yZXF1aXJlZENvbHVtbnNcclxuICAgICAgLm1hcCgoY29sKSA9PiB0aGlzLnRvQ3N2Q2VsbChjb2wpKVxyXG4gICAgICAuam9pbignLCcpO1xyXG5cclxuICAgIC8vIFNhbXBsZSBkYXRhIHJvd3Mgc28gdGhlIGRvd25sb2FkZWQgZmlsZSBzaG93cyB0aGUgZXhwZWN0ZWQgZm9ybWF0LCBub3RcclxuICAgIC8vIGp1c3QgdGhlIGNvbHVtbiBoZWFkZXJzLiBTb3VyY2VkIGZyb20gY29uc3RhbnRzOyBlYWNoIHJvdyBpcyBhbGlnbmVkIHRvXHJcbiAgICAvLyB0aGUgcmVxdWlyZWQgY29sdW1ucy5cclxuICAgIGNvbnN0IHNhbXBsZVJvd3M6IHN0cmluZ1tdW10gPSB0aGlzLnNjcmVlblRleHRzPy5zYW1wbGVSb3dzID8/IFtdO1xyXG4gICAgY29uc3QgZGF0YUxpbmVzID0gc2FtcGxlUm93cy5tYXAoKHJvdykgPT5cclxuICAgICAgcm93Lm1hcCgoY2VsbCkgPT4gdGhpcy50b0NzdkNlbGwoY2VsbCkpLmpvaW4oJywnKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW2hlYWRlckxpbmUsIC4uLmRhdGFMaW5lc10uam9pbignXFxyXFxuJykgKyAnXFxyXFxuJztcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2Q29udGVudF0sIHtcclxuICAgICAgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7JyxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLnNjcmVlblRleHRzPy5zYW1wbGVGaWxlTmFtZSA/PyAnUm9zdGVyX1NhbXBsZS5jc3YnO1xyXG4gICAgdGhpcy50cmlnZ2VyRG93bmxvYWQoYmxvYiwgZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGEgQ1NWIGZyb20gdGhlIHJvdy1sZXZlbCBlcnJvcnMgYW5kIHRyaWdnZXJzIGEgYnJvd3NlciBkb3dubG9hZCBzb1xyXG4gICAqIHRoZSB1c2VyIGNhbiBjb3JyZWN0IGFuZCByZS11cGxvYWQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGRvd25sb2FkRXJyb3JMb2coKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuam9iRXJyb3JzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBoZWFkZXJzOiBzdHJpbmdbXSA9IHRoaXMuc2NyZWVuVGV4dHM/LmVycm9yTG9nPy5oZWFkZXJzID8/IFtcclxuICAgICAgJ1JvdycsXHJcbiAgICAgICdGaWVsZCcsXHJcbiAgICAgICdFcnJvcicsXHJcbiAgICBdO1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuam9iRXJyb3JzLm1hcCgocm93RXJyKSA9PlxyXG4gICAgICBbcm93RXJyLnJvd051bWJlciwgcm93RXJyLmZpZWxkLCByb3dFcnIuZXJyb3JNZXNzYWdlXVxyXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB0aGlzLnRvQ3N2Q2VsbCh2YWx1ZSkpXHJcbiAgICAgICAgLmpvaW4oJywnKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbXHJcbiAgICAgIGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHRoaXMudG9Dc3ZDZWxsKGhlYWRlcikpLmpvaW4oJywnKSxcclxuICAgICAgLi4ucm93cyxcclxuICAgIF0uam9pbignXFxyXFxuJyk7XHJcbiAgICBjb25zdCBmaWxlTmFtZSA9XHJcbiAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LmVycm9yTG9nPy5maWxlTmFtZSA/PyAnUm9zdGVyX0ltcG9ydF9FcnJvcl9Mb2cuY3N2JztcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2Q29udGVudF0sIHsgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7JyB9KTtcclxuICAgIHRoaXMudHJpZ2dlckRvd25sb2FkKGJsb2IsIGZpbGVOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzY2FwZXMgYSB2YWx1ZSBmb3Igc2FmZSBpbmNsdXNpb24gaW4gYSBDU1YgY2VsbC5cclxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKX0gdmFsdWUgLSBUaGUgcmF3IGNlbGwgdmFsdWUuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIHRoZSBDU1Ytc2FmZSBjZWxsIHN0cmluZy5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgdG9Dc3ZDZWxsKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJhdyA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7XHJcbiAgICBpZiAoL1tcIixcXHJcXG5dLy50ZXN0KHJhdykpIHtcclxuICAgICAgcmV0dXJuIGBcIiR7cmF3LnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhdztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlcyB0aGUgZGlhbG9nLiBFbWl0cyBzdWJtaXRGb3JtUmVzcG9uc2Ugd2hlbiBhdCBsZWFzdCBvbmUgcm93IHdhcyBhZGRlZFxyXG4gICAqIHNvIHRoZSBwYXJlbnQgcmVmcmVzaGVzOyBvdGhlcndpc2UgZW1pdHMgZm9ybUNhbmNlbC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25DYW5jZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51cGxvYWRSZXN1bHQgJiYgdGhpcy51cGxvYWRSZXN1bHQuc3VjY2Vzc0NvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnN1Ym1pdEZvcm1SZXNwb25zZS5lbWl0KHRoaXMudXBsb2FkUmVzdWx0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybUNhbmNlbC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmlnZ2VycyBhIGJyb3dzZXIgZG93bmxvYWQgZm9yIGEgZ2VuZXJhdGVkIGJsb2IuXHJcbiAgICogQHBhcmFtIHtCbG9ifSBibG9iIC0gVGhlIGZpbGUgY29udGVudC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSBUaGUgc3VnZ2VzdGVkIGZpbGVuYW1lLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHRyaWdnZXJEb3dubG9hZChibG9iOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0XCI+XHJcbiAgPCEtLSBTdWItaGVhZGluZyBiYW5kOiBcIkJ1bGsgSW1wb3J0IFBhcnRpY2lwYW50c1wiIG9uIHRoZSBsZWZ0LCBJbXBvcnQgUm9zdGVyXHJcbiAgICAgICBhY3Rpb24gb24gdGhlIHJpZ2h0IChhcHBlYXJzIG9uY2UgYSBmaWxlIGlzIHNlbGVjdGVkKSDigJQgbWF0Y2hlcyB0aGUgRmlnbWEuXHJcbiAgICAgICBUaGUgXCLihpAgQmFjayB0byBSb3N0ZXJzIC8gSW1wb3J0IFJvc3RlclwiIHRpdGxlIHJvdyArIFggYXJlIHJlbmRlcmVkIGJ5IHRoZVxyXG4gICAgICAgc2hhcmVkIE1vZGFsQ29tcG9uZW50IGFib3ZlIHRoaXMuIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3ViaGVhZGVyXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdWJoZWFkZXItdGl0bGVcIj5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LnN1YkhlYWRpbmcgPz8gJ0J1bGsgSW1wb3J0IFBhcnRpY2lwYW50cycgfX1cclxuICAgIDwvc3Bhbj5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEZpbGVcIlxyXG4gICAgICBtYXQtYnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cIm1hdC10ZXJ0aWFyeS1idXR0b24gaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ltcG9ydC1idG5cIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiaW1wb3J0U3RhdGUgPT09ICdwcm9jZXNzaW5nJ1wiXHJcbiAgICAgIChjbGljayk9XCJvbkltcG9ydCgpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYnV0dG9ucz8uaW1wb3J0ID8/ICdJbXBvcnQgUm9zdGVyJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9faW1wb3J0LWJ0bi1pY29uXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24taW1wb3J0XCI+PC91c2U+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgICB7eyBzY3JlZW5UZXh0cz8uYnV0dG9ucz8uaW1wb3J0ID8/ICdJbXBvcnQgUm9zdGVyJyB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUmVxdWlyZWQgQ29sdW1ucyBJbmZvIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY29sdW1ucy1jYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtY29udGVudFwiPlxyXG4gICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jb2x1bW5zLXRpdGxlXCI+XHJcbiAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlcXVpcmVkQ29sdW1uc1RpdGxlID8/ICdSZXF1aXJlZCBjb2x1bW5zJyB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY29sdW1ucy1jaGlwc1wiPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIHJlcXVpcmVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jaGlwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBjb2wgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3NhbXBsZS13cmFwcGVyXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uIGllZWVzYS1yb3N0ZXItaW1wb3J0X19kb3dubG9hZC1idG5cIlxyXG4gICAgICAgIChjbGljayk9XCJkb3dubG9hZFNhbXBsZUZpbGUoKVwiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kb3dubG9hZFNhbXBsZSA/PyAnRG93bmxvYWQgU2FtcGxlIEZpbGUnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzdmdcclxuICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Rvd25sb2FkLWJ0bi1pY29uXCJcclxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tZmlsZS1kb2NcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICB7eyBzY3JlZW5UZXh0cz8uZG93bmxvYWRTYW1wbGVMYWJlbCA/PyAnRG93bmxvYWQgU2FtcGxlIEZpbGUnIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3VwbG9hZC1sYWJlbFwiPlxyXG4gICAge3sgc2NyZWVuVGV4dHM/LnVwbG9hZExhYmVsID8/ICdVcGxvYWQgeW91ciBmaWxlJyB9fVxyXG4gIDwvcD5cclxuXHJcbiAgPCEtLSBVcGxvYWQgU3RhdGUgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltcG9ydFN0YXRlID09PSAndXBsb2FkJ1wiPlxyXG4gICAgPCEtLSBIaWRkZW4gZmlsZSBpbnB1dCAtLT5cclxuICAgIDxpbnB1dFxyXG4gICAgICAjZmlsZUlucHV0XHJcbiAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiXHJcbiAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgIGhpZGRlblxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy51cGxvYWRMYWJlbCA/PyAnVXBsb2FkIHlvdXIgZmlsZSdcIlxyXG4gICAgLz5cclxuXHJcbiAgICA8IS0tIERyYWcgJiBEcm9wIFpvbmUgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lXCJcclxuICAgICAgW2NsYXNzLmllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS0tYWN0aXZlXT1cImlzRHJhZ092ZXJcIlxyXG4gICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcclxuICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcclxuICAgICAgKGRyb3ApPVwib25GaWxlRHJvcCgkZXZlbnQpXCJcclxuICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAgICAgKGtleWRvd24uc3BhY2UpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5hcmlhTGFiZWw/LmRyb3B6b25lID8/ICdEcmFnIGFuZCBkcm9wIGZpbGUgdXBsb2FkIGFyZWEnXCJcclxuICAgID5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZEZpbGVcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3VwbG9hZC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCI+XHJcbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi11cGxvYWQtZ3JheVwiPjwvdXNlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lLXRleHRcIj5cclxuICAgICAgICAgIHt7IHNjcmVlblRleHRzPy5kcm9wem9uZVRleHQgPz8gJ0RyYWcgJiBkcm9wIGEgZmlsZSBoZXJlLCBvciBjbGljayB0byBicm93c2UnIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lLWhpbnRcIj5cclxuICAgICAgICAgIHt7IHNjcmVlblRleHRzPy5kcm9wem9uZUhpbnQgPz8gJ0FjY2VwdGVkIGZvcm1hdHM6IC5jc3YsIC54bHN4JyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZpbGVcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3VwbG9hZC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCI+XHJcbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi11cGxvYWQtZ3JheVwiPjwvdXNlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZmlsZS1yb3dcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ZpbGUtbmFtZVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiPlxyXG4gICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWZpbGUtZG9jXCI+PC91c2U+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBzZWxlY3RlZEZpbGUubmFtZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3JlbW92ZS1maWxlLWJ0blwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUZpbGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmFyaWFMYWJlbD8ucmVtb3ZlID8/ICdSZW1vdmUgc2VsZWN0ZWQgZmlsZSdcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICAmdGltZXM7XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIElubGluZSBFcnJvciBNZXNzYWdlIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cImVycm9yTWVzc2FnZVwiXHJcbiAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLWJhbm5lclwiXHJcbiAgICAgIHJvbGU9XCJhbGVydFwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gUHJvY2Vzc2luZyAvIFJlc3VsdCBzaGFyZSB0aGUgZmlsZSBkaXNwbGF5ICsgcHJvZ3Jlc3MgYmFyIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Byb2Nlc3NpbmcnIHx8IGltcG9ydFN0YXRlID09PSAncmVzdWx0J1wiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZSBpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUtLXJlc3VsdFwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fdXBsb2FkLWljb25cIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIj5cclxuICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi11cGxvYWQtZ3JheVwiPjwvdXNlPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZmlsZS1uYW1lXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIj5cclxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWZpbGUtZG9jXCI+PC91c2U+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAge3sgc2VsZWN0ZWRGaWxlPy5uYW1lIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUHJvZ3Jlc3MgbGFiZWwgKHByb2Nlc3Npbmcgb25seSkgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwiaW1wb3J0U3RhdGUgPT09ICdwcm9jZXNzaW5nJ1wiXHJcbiAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3Byb2dyZXNzLWhlYWRcIlxyXG4gICAgPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19wcm9ncmVzcy1sYWJlbFwiPlxyXG4gICAgICAgIHt7IHNjcmVlblRleHRzPy5wcm9jZXNzaW5nTGFiZWwgPz8gJ1Byb2Nlc3NpbmcgZmlsZSByZWNvcmRzLi4uLicgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bWF0LXByb2dyZXNzLWJhclxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZydcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19wcm9ncmVzcy1iYXJcIlxyXG4gICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LnByb2Nlc3NpbmdMYWJlbCA/PyAnUHJvY2Vzc2luZyBmaWxlIHJlY29yZHMuLi4uJ1wiXHJcbiAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIFJlc3VsdCBTdGF0ZSAoc3VtbWFyeSArIGVycm9ycykgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncmVzdWx0JyAmJiB1cGxvYWRSZXN1bHRcIj5cclxuICAgIDwhLS0gTm8gZGF0YSByZWNvcmRzIGJhbm5lciAoaGVhZGVycyBvbmx5LCB6ZXJvIHJvd3MpIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cIm5vRGF0YU1lc3NhZ2VcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19uby1kYXRhLWJhbm5lclwiXHJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxyXG4gICAgPlxyXG4gICAgICB7eyBub0RhdGFNZXNzYWdlIH19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN1bW1hcnkgY2FyZHMgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd1N1bW1hcnlDYXJkc1wiIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZHNcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZCBpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLS1zdWNjZXNzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC1jb3VudFwiPlxyXG4gICAgICAgICAge3sgdXBsb2FkUmVzdWx0LnN1Y2Nlc3NDb3VudCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtbGFiZWxcIj5cclxuICAgICAgICAgIHt7IHNjcmVlblRleHRzPy5yZXN1bHQ/LnN1Y2Nlc3NDYXJkTGFiZWwgPz8gJ1Jvc3RlcnMgYWRkZWQgc3VjY2Vzc2Z1bGx5JyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC0tc2tpcHBlZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtY291bnRcIj5cclxuICAgICAgICAgIHt7IHVwbG9hZFJlc3VsdC5mYWlsdXJlQ291bnQgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5za2lwcGVkQ2FyZExhYmVsID8/ICdTa2lwcGVkIFJvd3MnIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUm93IEVycm9ycyBDYXJkIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImpvYkVycm9ycy5sZW5ndGhcIiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvcnMtY2FyZFwiPlxyXG4gICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvcnMtaGVhZGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFsbFJvd3NTa2lwcGVkOyBlbHNlIHNvbWVFcnJvcnNcIj5cclxuICAgICAgICAgIHt7IHNjcmVlblRleHRzPy5yZXN1bHQ/LmFsbFJvd3NTa2lwcGVkSGVhZGVyID8/ICdBbGwgUm93cyBhcmUgc2tpcHBlZCcgfX1cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3NvbWVFcnJvcnM+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5lcnJvcnNIZWFkZXIgPz8gJ1JvdyBlcnJvcnMg4oCUIHRoZXNlIHJvd3Mgd2lsbCBiZSBza2lwcGVkJyB9fVxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvcD5cclxuICAgICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvcnMtYm9keVwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3dFcnIgb2Ygam9iRXJyb3JzXCJcclxuICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLXJvd1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3Itcm93LXRpdGxlXCI+XHJcbiAgICAgICAgICAgIFJvdyB7eyByb3dFcnIucm93TnVtYmVyIH19IOKAlCB7eyByb3dFcnIuZXJyb3JNZXNzYWdlIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gRm9vdGVyIGFjdGlvbnMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19hY3Rpb25zXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1idXR0b25cclxuICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uIGllZWVzYS1yb3N0ZXItaW1wb3J0X19jYW5jZWwtYnRuXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgID5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmNhbmNlbCA/PyAnQ2FuY2VsJyB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiaW1wb3J0U3RhdGUgPT09ICdyZXN1bHQnICYmIGpvYkVycm9ycy5sZW5ndGhcIlxyXG4gICAgICBtYXQtYnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3ItbG9nLWJ0blwiXHJcbiAgICAgIChjbGljayk9XCJkb3dubG9hZEVycm9yTG9nKClcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5hcmlhTGFiZWw/LmRvd25sb2FkRXJyb3JMb2cgPz8gJ0Rvd25sb2FkIEVycm9yIGxvZydcIlxyXG4gICAgPlxyXG4gICAgICB7eyBzY3JlZW5UZXh0cz8uYnV0dG9ucz8uZG93bmxvYWRFcnJvckxvZyA/PyAnRG93bmxvYWQgRXJyb3IgbG9nJyB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWltcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU9yRCxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7O0FBc0J6RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUFtRGhDO0lBQ0UsMENBQTBDO0lBQ2xDLHNCQUE4QztJQUN0RCwwQ0FBMEM7SUFDbEMsWUFBMkI7UUFGM0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUU5QyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWxEckMsOEVBQThFO1FBQzlFLDhEQUE4RDtRQUNwRCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHFFQUFxRTtRQUMzRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVoRCxh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WSwrUEFBRSxlQUFlLDJRQUFFLG9CQUFvQjs7NEZBS2xELHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxpQkFHL0MsaUJBQWlCLENBQUMsSUFBSTt5SUFLNUIsYUFBYTtzQkFBckIsS0FBSztnQkFJSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIFJvc3RlckltcG9ydEVycm9yUmVwb3J0LFxyXG4gIFJvc3RlckltcG9ydEpvYixcclxufSBmcm9tICcuLi8uLi9tb2RlbHMvcm9zdGVyLWltcG9ydC5tb2RlbCc7XHJcbmltcG9ydCB7IFJvc3RlckltcG9ydEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3N0ZXItaW1wb3J0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKiogU3RhdGVzIG9mIHRoZSByb3N0ZXIgaW1wb3J0IGZsb3cuICovXHJcbnR5cGUgUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJyB8ICdwcm9jZXNzaW5nJyB8ICdyZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIFZpZXctbW9kZWwgZm9yIHRoZSByZXN1bHQgc2NyZWVuLiBQb3B1bGF0ZWQgZnJvbSB0aGUgY29uZmlybWVkXHJcbiAqIHtAbGluayBSb3N0ZXJJbXBvcnRKb2J9IHJldHVybmVkIGJ5IHRoZSBiYWNrZW5kLlxyXG4gKi9cclxuaW50ZXJmYWNlIFJvc3RlckltcG9ydFJlc3VsdCB7XHJcbiAgdG90YWxSZWNvcmRzOiBudW1iZXI7XHJcbiAgc3VjY2Vzc0NvdW50OiBudW1iZXI7XHJcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBSb3cgZXJyb3Igc2hvd24gb24gdGhlIHJlc3VsdCBzY3JlZW4gKG1hcHBlZCBmcm9tIHRoZSBCRSBlcnJvciByZXBvcnQpLiAqL1xyXG5pbnRlcmZhY2UgUm9zdGVySW1wb3J0Um93RXJyb3Ige1xyXG4gIHJvd051bWJlcjogbnVtYmVyO1xyXG4gIGZpZWxkPzogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUm9zdGVyIEltcG9ydCBkaWFsb2cuXHJcbiAqXHJcbiAqIExldHMgYW4gYWRtaW4gdXBsb2FkIGEgQ1NWL1hMU1ggcm9zdGVyIGZpbGUsIHNob3dzIGEgcHJvY2Vzc2luZyBwcm9ncmVzc1xyXG4gKiBiYXIsIHRoZW4gYSByZXN1bHQgc3VtbWFyeSAoYWRkZWQgLyBza2lwcGVkKSB3aXRoIHBlci1yb3cgZXJyb3JzIGFuZCBhblxyXG4gKiBlcnJvci1sb2cgZG93bmxvYWQuXHJcbiAqXHJcbiAqIFdpcmVkIHRvIHRoZSByZWFsIGJhY2tlbmQgcm9zdGVyLWltcG9ydCBzdGF0ZSBtYWNoaW5lXHJcbiAqIChzYS1zYWFwcHMtZ3JvdXBzLWFwaSBgUm9zdGVySW1wb3J0Q29udHJvbGxlcmApIHZpYVxyXG4gKiB7QGxpbmsgUm9zdGVySW1wb3J0QXBpU2VydmljZX06IG9uIEltcG9ydCBpdCBydW5zXHJcbiAqIHVwbG9hZCDihpIgdmFsaWRhdGUg4oaSIGNvbmZpcm0gYW5kIHJlbmRlcnMgdGhlIGNvbmZpcm1lZCBqb2IncyB0ZXJtaW5hbCBjb3VudHNcclxuICogYW5kIHBlci1yb3cgZXJyb3JzLiBTZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIGVycm9ycyAoMTA3MiB1bnN1cHBvcnRlZCBmb3JtYXQsXHJcbiAqIDEwNzMgdG9vIGxhcmdlLCAxMDc0IHJvdyBsaW1pdCwgMTA3NSBpbnZhbGlkIHN0YXR1cykgYXJlIHN1cmZhY2VkIGlubGluZS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2llZWVzYS1yb3N0ZXItaW1wb3J0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0UHJvZ3Jlc3NCYXJNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvc3RlckltcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogQ2FycmllcyB0aGUgeyBncm91cElkLCBncm91cE5hbWUgfSBwYXlsb2FkIGZyb20gdGhlIG9wZW5pbmcgZGlhbG9nLiAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgQElucHV0KCkgY29tcG9uZW50RGF0YTogYW55O1xyXG5cclxuICAvKiogRW1pdHRlZCBhZnRlciBhbiBpbXBvcnQgdGhhdCBhZGRlZCBhdCBsZWFzdCBvbmUgcm93IChwYXJlbnQgcmVmcmVzaGVzKS4gKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIEBPdXRwdXQoKSBzdWJtaXRGb3JtUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzL2Nsb3NlcyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBhZGQuICovXHJcbiAgQE91dHB1dCgpIGZvcm1DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IGNvbnN0YW50cztcclxuICBzY3JlZW5UZXh0cyA9IHRoaXMuY29uc3RhbnRzPy5yb3N0ZXJJbXBvcnQ7XHJcblxyXG4gIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBpbXBvcnQgZmxvdy4gKi9cclxuICBpbXBvcnRTdGF0ZTogUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJztcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBmaWxlLiAqL1xyXG4gIHNlbGVjdGVkRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogRmlsZSBkcmFnLW92ZXIgc3RhdGUuICovXHJcbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG5cclxuICAvKiogVGVybWluYWwgdXBsb2FkIHJlc3VsdC4gKi9cclxuICB1cGxvYWRSZXN1bHQ6IFJvc3RlckltcG9ydFJlc3VsdCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogUm93LWxldmVsIGVycm9ycyBmb3IgdGhlIGNvbXBsZXRlZCBqb2IuICovXHJcbiAgam9iRXJyb3JzOiBSb3N0ZXJJbXBvcnRSb3dFcnJvcltdID0gW107XHJcblxyXG4gIC8qKiBJbmxpbmUgdmFsaWRhdGlvbiAvIEFQSSBlcnJvciBtZXNzYWdlLiAqL1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm8gYmFubmVyIHNob3duIHdoZW4gdGhlIGZpbGUgaGFzIGhlYWRlcnMgYnV0IG5vIGRhdGEgcm93c1xyXG4gICAqIChGaWdtYTogXCJObyByb3N0ZXIgZGF0YSBmb3VuZC4uLlwiKS5cclxuICAgKi9cclxuICBub0RhdGFNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFRoZSBpbXBvcnQgam9iIGlkIHJldHVybmVkIGJ5IHVwbG9hZCAoa2VwdCBzbyBjYW5jZWwgY2FuIGNsZWFuIGl0IHVwKS4gKi9cclxuICBwcml2YXRlIGltcG9ydElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIGJ5dGVzICgxMCBNQikg4oCUIG1hdGNoZXMgdGhlIEJFIDEwTUIgbGltaXQuICovXHJcbiAgcmVhZG9ubHkgTUFYX0ZJTEVfU0laRSA9IDEwXzQ4NV83NjA7XHJcblxyXG4gIC8qKiBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMgKG11c3QgbWF0Y2ggdGhlIEJFIGNvbnRyYWN0OiBvbmx5IC5jc3YgLyAueGxzeCkuICovXHJcbiAgcmVhZG9ubHkgQUNDRVBURURfRVhURU5TSU9OUyA9IFsnLmNzdicsICcueGxzeCddO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSByb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlOiBSb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3VwU2VydmljZTogR3JvdXBzU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogUmVxdWlyZWQgY29sdW1uIGhlYWRlcnMgZm9yIGRpc3BsYXkgYW5kIHRoZSBzYW1wbGUgZmlsZS4gVGhpcyBpcyB0aGUgc3RhdGljXHJcbiAgICogYmFzZSBzZXQgZnJvbSBjb25zdGFudHMgUExVUyBhbnkgdGVuYW50LWxldmVsIHJlcXVpcmVkIHByb2ZpbGUgZmllbGRzIHRoZVxyXG4gICAqIGhvc3QgYXBwIGNvbmZpZ3VyZWQgKGUuZy4gcGhvbmUgLyBhZGRyZXNzIC8gZW1wbG95ZXIpLCBtYXBwZWQgdG8gZnJpZW5kbHlcclxuICAgKiBoZWFkZXJzIGFuZCBkZS1kdXBsaWNhdGVkIChjYXNlLWluc2Vuc2l0aXZlKSBhZ2FpbnN0IHRoZSBiYXNlIGNvbHVtbnMuXHJcbiAgICogQHJldHVybiB7c3RyaW5nW119XHJcbiAgICovXHJcbiAgZ2V0IHJlcXVpcmVkQ29sdW1ucygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBiYXNlOiBzdHJpbmdbXSA9IHRoaXMuc2NyZWVuVGV4dHM/LnJlcXVpcmVkQ29sdW1ucyA/PyBbXTtcclxuICAgIHJldHVybiB0aGlzLm1lcmdlVGVuYW50Q29sdW1ucyhiYXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgdGhlIHRlbmFudC1jb25maWd1cmVkIGNvbHVtbnMgKGZyb20ge0BsaW5rIHRlbmFudEV4dHJhQ29sdW1uc30pIHRvXHJcbiAgICogdGhlIGJhc2UgY29sdW1uIGhlYWRlcnMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmFzZSAtIFRoZSBzdGF0aWMgYmFzZSBjb2x1bW4gaGVhZGVycy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZVRlbmFudENvbHVtbnMoYmFzZTogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBleHRyYXMgPSB0aGlzLnRlbmFudEV4dHJhQ29sdW1ucyhiYXNlKTtcclxuICAgIHJldHVybiBleHRyYXMubGVuZ3RoID8gWy4uLmJhc2UsIC4uLmV4dHJhcy5tYXAoKGMpID0+IGMubGFiZWwpXSA6IGJhc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgdGVuYW50LWNvbmZpZ3VyZWQgcmVxdWlyZWQgcHJvZmlsZSBmaWVsZHMgaW50byB0aGUgRVhUUkFcclxuICAgKiBjb2x1bW5zIHRvIGFwcGVuZCBhZnRlciB0aGUgYmFzZSBzZXQg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNoYXJlZCBieVxyXG4gICAqIGJvdGggdGhlIGhlYWRlciBsaXN0ICh7QGxpbmsgcmVxdWlyZWRDb2x1bW5zfSkgYW5kIHRoZSBzYW1wbGUgZmlsZVxyXG4gICAqICh7QGxpbmsgZG93bmxvYWRTYW1wbGVGaWxlfSkgc28gdGhlIHR3byBuZXZlciBkcmlmdCBvdXQgb2YgYWxpZ25tZW50LlxyXG4gICAqXHJcbiAgICogRWFjaCBmaWVsZCBiZWNvbWVzIG9uZSBjb2x1bW4gd2l0aCBpdHMgZnJpZW5kbHkgYGxhYmVsYCAoa25vd24ga2V5cyB1c2UgdGhlXHJcbiAgICogbGFiZWwgbWFwOyB1bmtub3duIGtleXMgZmFsbCBiYWNrIHRvIGEgdGl0bGUtY2FzZWQga2V5KSBhbmQgYSBgc2FtcGxlVmFsdWVgXHJcbiAgICogZm9yIHRoZSBzYW1wbGUgcm93LiBGaWVsZHMgd2hvc2UgbGFiZWwgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGJhc2Ugc2V0XHJcbiAgICogKGNhc2UtaW5zZW5zaXRpdmUpIGFyZSBza2lwcGVkIHNvIGEgdGVuYW50IGZpZWxkIGxpa2UgXCJlbXBsb3llclwiIHRoYXQgaXNcclxuICAgKiBhbHJlYWR5IGEgYmFzZSBjb2x1bW4gaXMgbm90IGR1cGxpY2F0ZWQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmFzZSAtIFRoZSBzdGF0aWMgYmFzZSBjb2x1bW4gaGVhZGVycy5cclxuICAgKiBAcmV0dXJuIHt7IGxhYmVsOiBzdHJpbmc7IHNhbXBsZVZhbHVlOiBzdHJpbmcgfVtdfVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHRlbmFudEV4dHJhQ29sdW1ucyhcclxuICAgIGJhc2U6IHN0cmluZ1tdXHJcbiAgKTogeyBsYWJlbDogc3RyaW5nOyBzYW1wbGVWYWx1ZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCB0ZW5hbnRGaWVsZHMgPSB0aGlzLmdyb3VwU2VydmljZT8uZ2V0UmVxdWlyZWRQcm9maWxlRmllbGRzKCkgPz8gW107XHJcbiAgICBpZiAoIXRlbmFudEZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2FtcGxlTWFwID0gdGhpcy5zY3JlZW5UZXh0cz8udGVuYW50RmllbGRTYW1wbGVWYWx1ZXMgPz8ge307XHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldChiYXNlLm1hcCgoY29sKSA9PiBjb2wudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgY29uc3QgZXh0cmFzOiB7IGxhYmVsOiBzdHJpbmc7IHNhbXBsZVZhbHVlOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICB0ZW5hbnRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRlbmFudEZpZWxkTGFiZWwoZmllbGQpO1xyXG4gICAgICBpZiAobGFiZWwgJiYgIXNlZW4uaGFzKGxhYmVsLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgc2Vlbi5hZGQobGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgZXh0cmFzLnB1c2goeyBsYWJlbCwgc2FtcGxlVmFsdWU6IHNhbXBsZU1hcFtmaWVsZF0gPz8gJycgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGV4dHJhcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYSB0ZW5hbnQgZmllbGQga2V5IHRvIGl0cyBkaXNwbGF5IGhlYWRlci4gS25vd24ga2V5cyB1c2UgdGhlIGNvbmZpZ3VyZWRcclxuICAgKiBsYWJlbCBtYXA7IHVua25vd24ga2V5cyBmYWxsIGJhY2sgdG8gYSB0aXRsZS1jYXNlZCBrZXkuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIC0gVGhlIHRlbmFudCBmaWVsZCBrZXkgKGUuZy4gJ3Bob25lJykuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHRlbmFudEZpZWxkTGFiZWwoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLnNjcmVlblRleHRzPy50ZW5hbnRGaWVsZExhYmVscyA/PyB7fTtcclxuICAgIGlmIChsYWJlbHNbZmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBsYWJlbHNbZmllbGRdO1xyXG4gICAgfVxyXG4gICAgLy8gRmFsbGJhY2s6IFwicGhvbmVfbnVtYmVyXCIgLT4gXCJQaG9uZSBOdW1iZXJcIi5cclxuICAgIHJldHVybiBmaWVsZFxyXG4gICAgICAucmVwbGFjZSgvW18tXSsvZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIChjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbW1hLXNlcGFyYXRlZCBhY2NlcHRlZCBmaWxlIHR5cGVzIGZvciB0aGUgaW5wdXQgZWxlbWVudC4gKi9cclxuICBnZXQgYWNjZXB0ZWRGaWxlVHlwZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkFDQ0VQVEVEX0VYVEVOU0lPTlMuam9pbignLCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSB0YXJnZXQgZ3JvdXAgaWQgZnJvbSB0aGUgZGlhbG9nIHBheWxvYWQgKGZhbGxzIGJhY2sgdG8gc2VsZWN0aW9uKS4gKi9cclxuICBwcml2YXRlIGdldCBncm91cElkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmNvbXBvbmVudERhdGE/Lmdyb3VwSWQgPz9cclxuICAgICAgKHRoaXMuZ3JvdXBTZXJ2aWNlPy5nZXRTZWxlY3RlZEdyb3VwSW5mbygpPy5ncm91cElkIGFzIHN0cmluZykgPz9cclxuICAgICAgJydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBBUEkgYmFzZSBVUkwgb24gdGhlIGltcG9ydCBzZXJ2aWNlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZS5zZXRBcGlCYXNlVXJsKHRoaXMuZ3JvdXBTZXJ2aWNlPy5hcGlCYXNlVXJsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFucyB1cCBzdWJzY3JpcHRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhIGZpbGUgc2VsZWN0ZWQgdmlhIHRoZSBicm93c2UgZGlhbG9nLlxyXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGNoYW5nZSBldmVudCBmcm9tIHRoZSBoaWRkZW4gZmlsZSBpbnB1dC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKCFpbnB1dC5maWxlcyB8fCBpbnB1dC5maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0LmZpbGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5zaG93U2luZ2xlRmlsZU9ubHlFcnJvcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2Nlc3NGaWxlKGlucHV0LmZpbGVzWzBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYSBmaWxlIGRyb3BwZWQgb250byB0aGUgZHJvcHpvbmUuXHJcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50IC0gVGhlIGRyb3AgZXZlbnQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRmlsZURyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcbiAgICBpZiAoIWZpbGVzIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLnNob3dTaW5nbGVGaWxlT25seUVycm9yKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBkcmFnLW92ZXIgb24gdGhlIGRyb3B6b25lLlxyXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudCAtIFRoZSBkcmFnb3ZlciBldmVudC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBkcmFnLWxlYXZlIG9uIHRoZSBkcm9wem9uZS5cclxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnQgLSBUaGUgZHJhZ2xlYXZlIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyB0aGUgZmlsZSB0eXBlIGFuZCBzaXplLCB0aGVuIGVpdGhlciBzZXRzIGl0IG9yIHNob3dzIGFuIGVycm9yLlxyXG4gICAqIEBwYXJhbSB7RmlsZX0gZmlsZSAtIFRoZSBjYW5kaWRhdGUgZmlsZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJvY2Vzc0ZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gbnVsbDtcclxuICAgIHRoaXMuaW1wb3J0SWQgPSBudWxsO1xyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzbHkgc2VsZWN0ZWQgKHZhbGlkKSBmaWxlIHNvIGFuIGludmFsaWQgbmV3IHNlbGVjdGlvblxyXG4gICAgLy8gY2FuJ3QgbGVhdmUgdGhlIEltcG9ydCBidXR0b24gZW5hYmxlZCBmb3IgYSBzdGFsZSBmaWxlLlxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBpc1ZhbGlkRXh0ZW5zaW9uID0gdGhpcy5BQ0NFUFRFRF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT5cclxuICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoZXh0KVxyXG4gICAgKTtcclxuICAgIGlmICghaXNWYWxpZEV4dGVuc2lvbikge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udW5zdXBwb3J0ZWRUeXBlID8/XHJcbiAgICAgICAgJ0luY29ycmVjdCBmaWxlIHR5cGUuIFBsZWFzZSB1cGxvYWQgYSB2YWxpZCAuY3N2IG9yIC54bHN4IGZpbGUuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmVtcHR5RmlsZSA/P1xyXG4gICAgICAgICdUaGUgc2VsZWN0ZWQgZmlsZSBpcyBlbXB0eS4gUGxlYXNlIHVwbG9hZCBhIGZpbGUgd2l0aCByb3N0ZXIgcmVjb3Jkcy4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuTUFYX0ZJTEVfU0laRSkge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8uZmlsZVRvb0xhcmdlID8/XHJcbiAgICAgICAgJ0ZpbGUgc2l6ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBvZiAxME1CLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyB0aGUgc2luZ2xlLWZpbGUtb25seSB2YWxpZGF0aW9uIG1lc3NhZ2UuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHNob3dTaW5nbGVGaWxlT25seUVycm9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5zaW5nbGVGaWxlT25seSA/P1xyXG4gICAgICAnUGxlYXNlIHVwbG9hZCBhIHNpbmdsZSBmaWxlIGF0IGEgdGltZS4nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZpbGUgYW5kIHJlc2V0cyB0byB0aGUgdXBsb2FkIHN0YXRlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvblJlbW92ZUZpbGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSBudWxsO1xyXG4gICAgdGhpcy5pbXBvcnRJZCA9IG51bGw7XHJcbiAgICB0aGlzLmltcG9ydFN0YXRlID0gJ3VwbG9hZCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW5zIHRoZSByZWFsIGltcG9ydDogdXBsb2FkIOKGkiB2YWxpZGF0ZSDihpIgY29uZmlybS4gVGhlIHByb2dyZXNzIGJhciBpc1xyXG4gICAqIHNob3duIGluIGluZGV0ZXJtaW5hdGUgbW9kZSB3aGlsZSB0aGUgY2hhaW4gaXMgaW4gZmxpZ2h0LCB0aGVuIHRoZVxyXG4gICAqIGNvbmZpcm1lZCBqb2IncyB0ZXJtaW5hbCBjb3VudHMgKyBwZXItcm93IGVycm9ycyBkcml2ZSB0aGUgcmVzdWx0IHNjcmVlbi5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25JbXBvcnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5ncm91cElkKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy51cGxvYWRGYWlsZWQgPz9cclxuICAgICAgICAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW1wb3J0aW5nIHRoZSByb3N0ZXIuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gbnVsbDtcclxuICAgIHRoaXMuam9iRXJyb3JzID0gW107XHJcbiAgICB0aGlzLmltcG9ydElkID0gbnVsbDtcclxuICAgIHRoaXMuaW1wb3J0U3RhdGUgPSAncHJvY2Vzc2luZyc7XHJcblxyXG4gICAgdGhpcy5yb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlXHJcbiAgICAgIC51cGxvYWRJbXBvcnRGaWxlKHRoaXMuc2VsZWN0ZWRGaWxlLCB0aGlzLmdyb3VwSWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoam9iOiBSb3N0ZXJJbXBvcnRKb2IpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1wb3J0SWQgPSBqb2I/LmltcG9ydElkID8/IG51bGw7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5yb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLnZhbGlkYXRlSW1wb3J0Sm9iKFxyXG4gICAgICAgICAgICB0aGlzLmltcG9ydElkIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZS5jb25maXJtSW1wb3J0Sm9iKHRoaXMuaW1wb3J0SWQgYXMgc3RyaW5nKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGNvbmZpcm1lZEpvYjogUm9zdGVySW1wb3J0Sm9iKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbmFsaXplUmVzdWx0KGNvbmZpcm1lZEpvYik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVJbXBvcnRFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIGEgZmFpbGVkIGltcG9ydCBjYWxsIHRvIGFuIGlubGluZSBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIHRoZSBVSSB0b1xyXG4gICAqIHRoZSB1cGxvYWQgc3RhdGUgc28gdGhlIHVzZXIgY2FuIHJldHJ5LiBLbm93biBCRSBlcnJvciBjb2RlcyAoMTA3MuKAkzEwNzUpXHJcbiAgICogYXJlIG1hcHBlZCB2aWEgY29uc3RhbnRzOyBhbnl0aGluZyBlbHNlIHVzZXMgdGhlIGdlbmVyaWMgbWVzc2FnZS5cclxuICAgKiBAcGFyYW0geyp9IGVycm9yIC0gVGhlIEh0dHBFcnJvclJlc3BvbnNlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHByaXZhdGUgaGFuZGxlSW1wb3J0RXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICd1cGxvYWQnO1xyXG5cclxuICAgIC8vIEJFIGVycm9yIGNvZGVzIHRha2UgcHJpb3JpdHkgd2hlbiBwcmVzZW50IChlLmcuIDEwNzEgbm8gcGVybWlzc2lvbiwgMTA3MlxyXG4gICAgLy8gZm9ybWF0LCAxMDczIHRvbyBsYXJnZSwgMTA3NCByb3cgbGltaXQsIDEwNzUgaW52YWxpZCBzdGF0dXMpLlxyXG4gICAgY29uc3QgZXJyb3JDb2Rlczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBlcnJvcj8uZXJyb3I/LmJvZHk/LmVycm9yQ29kZXM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlcnJvckNvZGVzKSAmJiBlcnJvckNvZGVzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBjb2RlID0gZXJyb3JDb2Rlc1swXSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jb25zdGFudHMuZXJyb3JzO1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5jb25zdGFudHM/LmVycm9ycz8uW2NvZGVdID8/XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udXBsb2FkRmFpbGVkID8/XHJcbiAgICAgICAgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGltcG9ydGluZyB0aGUgcm9zdGVyLiBQbGVhc2UgdHJ5IGFnYWluLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIDQwMyB3aXRoIG5vIGVycm9yLWNvZGUgYm9keSBjb21lcyBmcm9tIHRoZSBlbmRwb2ludCdzIEBQcmVBdXRob3JpemVcclxuICAgIC8vICh0aGUgdXNlciBsYWNrcyBNYW5hZ2UgR3JvdXAgTWVtYmVyIC8gTWFuYWdlIEFsbCBSb3N0ZXJzIGZvciB0aGlzIGdyb3VwKS5cclxuICAgIC8vIFNob3cgdGhlIHBlcm1pc3Npb24gbWVzc2FnZSDigJQgcmV0cnlpbmcgd2lsbCBub3QgaGVscC5cclxuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yPy5zdGF0dXMgPz8gZXJyb3I/LmVycm9yPy5zdGF0dXM7XHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmZvcmJpZGRlbiA/P1xyXG4gICAgICAgICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbXBvcnQgYSByb3N0ZXIgZm9yIHRoaXMgZ3JvdXAuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udXBsb2FkRmFpbGVkID8/XHJcbiAgICAgICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbXBvcnRpbmcgdGhlIHJvc3Rlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSB0ZXJtaW5hbCByZXN1bHQgYW5kIG1vdmVzIHRvIHRoZSByZXN1bHQgc3RhdGUuIFdoZW4gdGhlIGpvYiBoYWRcclxuICAgKiBubyBkYXRhIHJvd3MsIHNob3dzIHRoZSBcIm5vIHJvc3RlciBkYXRhXCIgaW5mbyBiYW5uZXIgaW5zdGVhZCBvZiB0aGUgc3VtbWFyeVxyXG4gICAqIGNhcmRzLlxyXG4gICAqIEBwYXJhbSB7Um9zdGVySW1wb3J0Sm9ifSBqb2IgLSBUaGUgY29uZmlybWVkIGltcG9ydCBqb2IuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGZpbmFsaXplUmVzdWx0KGpvYjogUm9zdGVySW1wb3J0Sm9iKTogdm9pZCB7XHJcbiAgICBjb25zdCB0b3RhbFJlY29yZHMgPSBqb2I/LnRvdGFsUm93cyA/PyAwO1xyXG4gICAgY29uc3Qgc3VjY2Vzc0NvdW50ID0gam9iPy5zdWNjZXNzUm93cyA/PyAwO1xyXG4gICAgY29uc3QgZmFpbHVyZUNvdW50ID0gam9iPy5mYWlsZWRSb3dzID8/IDA7XHJcblxyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSB7IHRvdGFsUmVjb3Jkcywgc3VjY2Vzc0NvdW50LCBmYWlsdXJlQ291bnQgfTtcclxuICAgIHRoaXMuam9iRXJyb3JzID0gdGhpcy5wYXJzZUVycm9yUmVwb3J0KGpvYj8uZXJyb3JSZXBvcnQpO1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICdyZXN1bHQnO1xyXG5cclxuICAgIGlmICh0b3RhbFJlY29yZHMgPT09IDApIHtcclxuICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5ub0RhdGFSZWNvcmRzID8/XHJcbiAgICAgICAgJ05vIHJvc3RlciBkYXRhIGZvdW5kLiBUaGUgc2VsZWN0ZWQgZmlsZSBjb250YWlucyBoZWFkZXJzIGJ1dCBubyByb3N0ZXIgcmVjb3Jkcy4nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXplcyB0aGUgQkUgYGVycm9yX3JlcG9ydGAgaW50byByb3ctZXJyb3IgdmlldyBtb2RlbHMuXHJcbiAgICpcclxuICAgKiBUaGUgQkUgd3JhcHMgdGhlIHBlci1yb3cgZW50cmllcyBpbiBhIGB7IHJvd3M6IFsgeyByb3csIGZpZWxkLCBtZXNzYWdlIH0gXSB9YFxyXG4gICAqIGRvY3VtZW50LCBidXQgdGhhdCB2YWx1ZSBoYXMgYmVlbiBvYnNlcnZlZCB0byBhcnJpdmUgaW4gTVVMVElQTEUgc2hhcGVzOlxyXG4gICAqICAtIGEgcGFyc2VkIG9iamVjdCBgeyByb3dzOiBbLi4uXSB9YCAoY29uZmlybSByZXNwb25zZSDigJQgdGhlIGNvbW1vbiBjYXNlKSxcclxuICAgKiAgLSBhIHJhdyBKU09OIHN0cmluZyBvZiB0aGUgc2FtZSBvYmplY3QgKEpTT05CIHBhc3N0aHJvdWdoKSwgb3JcclxuICAgKiAgLSBhIGJhcmUgYXJyYXkgYFsgeyByb3csIGZpZWxkLCBtZXNzYWdlIH0gXWAuXHJcbiAgICogVGhpcyBoYW5kbGVzIGFsbCB0aHJlZSAoYW5kIGBudWxsYCkgc28gdGhlIGVycm9yIGxvZyByZW5kZXJzIHJlZ2FyZGxlc3Mgb2ZcclxuICAgKiBob3cgdGhlIGZpZWxkIGlzIHNlcmlhbGl6ZWQuXHJcbiAgICogQHBhcmFtIHsqfSBlcnJvclJlcG9ydCAtIFRoZSBCRSBlcnJvcl9yZXBvcnQgKG9iamVjdCwgc3RyaW5nLCBhcnJheSwgb3IgbnVsbCkuXHJcbiAgICogQHJldHVybiB7Um9zdGVySW1wb3J0Um93RXJyb3JbXX1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIHBhcnNlRXJyb3JSZXBvcnQoZXJyb3JSZXBvcnQ/OiBhbnkpOiBSb3N0ZXJJbXBvcnRSb3dFcnJvcltdIHtcclxuICAgIGlmICghZXJyb3JSZXBvcnQpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgcGFyc2UgaXQgZmlyc3Q7IG9uIHBhcnNlIGZhaWx1cmUsIG5vIHJvdyBlcnJvcnMuXHJcbiAgICBsZXQgdmFsdWU6IHVua25vd24gPSBlcnJvclJlcG9ydDtcclxuICAgIGlmICh0eXBlb2YgZXJyb3JSZXBvcnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKGVycm9yUmVwb3J0KTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBBY2NlcHQgZWl0aGVyIGEgYmFyZSBhcnJheSBvciBhIHsgcm93czogWy4uLl0gfSB3cmFwcGVyIG9iamVjdC5cclxuICAgIGNvbnN0IGVudHJpZXM6IFJvc3RlckltcG9ydEVycm9yUmVwb3J0W10gPSBBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgICA/ICh2YWx1ZSBhcyBSb3N0ZXJJbXBvcnRFcnJvclJlcG9ydFtdKVxyXG4gICAgICA6ICgodmFsdWUgYXMgeyByb3dzPzogUm9zdGVySW1wb3J0RXJyb3JSZXBvcnRbXSB9KT8ucm93cyA/PyBbXSk7XHJcbiAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xyXG4gICAgICByb3dOdW1iZXI6IGVudHJ5Py5yb3csXHJcbiAgICAgIGZpZWxkOiBlbnRyeT8uZmllbGQsXHJcbiAgICAgIGVycm9yTWVzc2FnZTogZW50cnk/Lm1lc3NhZ2UsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSByZXN1bHQgc3RhdGUgc2hvdWxkIHNob3cgdGhlIHN1bW1hcnkgY2FyZHMgKGFkZGVkIC8gc2tpcHBlZCkuXHJcbiAgICogSGlkZGVuIGZvciB0aGUgXCJubyBkYXRhIHJlY29yZHNcIiBjYXNlLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBzaG93U3VtbWFyeUNhcmRzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy51cGxvYWRSZXN1bHQgJiYgdGhpcy51cGxvYWRSZXN1bHQudG90YWxSZWNvcmRzID4gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgZXZlcnkgcHJvY2Vzc2VkIHJvdyB3YXMgc2tpcHBlZCAoZHJpdmVzIHRoZSBcIkFsbCBSb3dzIGFyZSBza2lwcGVkXCJcclxuICAgKiBoZWFkZXIgb24gdGhlIGVycm9ycyBjYXJkKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgYWxsUm93c1NraXBwZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMudXBsb2FkUmVzdWx0ICYmXHJcbiAgICAgIHRoaXMudXBsb2FkUmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcclxuICAgICAgdGhpcy51cGxvYWRSZXN1bHQuc3VjY2Vzc0NvdW50ID09PSAwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGEgY2xpZW50LXNpZGUgQ1NWIHNhbXBsZSBmaWxlIGZyb20gdGhlIHJlcXVpcmVkIGNvbHVtbnMgYW5kIHRyaWdnZXJzXHJcbiAgICogYSBicm93c2VyIGRvd25sb2FkLiAoQ2xpZW50LXNpZGUgZ2VuZXJhdGlvbiB1bnRpbCB0aGUgdGVtcGxhdGUgQVBJIGV4aXN0cy4pXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGRvd25sb2FkU2FtcGxlRmlsZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhlYWRlckxpbmUgPSB0aGlzLnJlcXVpcmVkQ29sdW1uc1xyXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMudG9Dc3ZDZWxsKGNvbCkpXHJcbiAgICAgIC5qb2luKCcsJyk7XHJcblxyXG4gICAgLy8gU2FtcGxlIGRhdGEgcm93cyBzbyB0aGUgZG93bmxvYWRlZCBmaWxlIHNob3dzIHRoZSBleHBlY3RlZCBmb3JtYXQsIG5vdFxyXG4gICAgLy8ganVzdCB0aGUgY29sdW1uIGhlYWRlcnMuIFRoZSBiYXNlIHJvdyB2YWx1ZXMgY29tZSBmcm9tIGNvbnN0YW50czsgc2FtcGxlXHJcbiAgICAvLyB2YWx1ZXMgZm9yIGFueSB0ZW5hbnQtY29uZmlndXJlZCBjb2x1bW5zIGFyZSBhcHBlbmRlZCAoZnJvbSB0aGUgU0FNRVxyXG4gICAgLy8gc291cmNlIHRoYXQgYnVpbGRzIHRoZSBoZWFkZXJzKSBzbyBldmVyeSByb3cgbGluZXMgdXAgd2l0aCB0aGVcclxuICAgIC8vIChiYXNlICsgdGVuYW50KSBoZWFkZXIgc2V0LlxyXG4gICAgY29uc3QgYmFzZTogc3RyaW5nW10gPSB0aGlzLnNjcmVlblRleHRzPy5yZXF1aXJlZENvbHVtbnMgPz8gW107XHJcbiAgICBjb25zdCBiYXNlU2FtcGxlUm93czogc3RyaW5nW11bXSA9IHRoaXMuc2NyZWVuVGV4dHM/LnNhbXBsZVJvd3MgPz8gW107XHJcbiAgICBjb25zdCB0ZW5hbnRTYW1wbGVDZWxscyA9IHRoaXMudGVuYW50RXh0cmFDb2x1bW5zKGJhc2UpLm1hcChcclxuICAgICAgKGNvbCkgPT4gY29sLnNhbXBsZVZhbHVlXHJcbiAgICApO1xyXG4gICAgY29uc3QgZGF0YUxpbmVzID0gYmFzZVNhbXBsZVJvd3MubWFwKChyb3cpID0+XHJcbiAgICAgIFsuLi5yb3csIC4uLnRlbmFudFNhbXBsZUNlbGxzXVxyXG4gICAgICAgIC5tYXAoKGNlbGwpID0+IHRoaXMudG9Dc3ZDZWxsKGNlbGwpKVxyXG4gICAgICAgIC5qb2luKCcsJylcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtoZWFkZXJMaW5lLCAuLi5kYXRhTGluZXNdLmpvaW4oJ1xcclxcbicpICsgJ1xcclxcbic7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7XHJcbiAgICAgIHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5zY3JlZW5UZXh0cz8uc2FtcGxlRmlsZU5hbWUgPz8gJ1Jvc3Rlcl9TYW1wbGUuY3N2JztcclxuICAgIHRoaXMudHJpZ2dlckRvd25sb2FkKGJsb2IsIGZpbGVOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyBhIENTViBmcm9tIHRoZSByb3ctbGV2ZWwgZXJyb3JzIGFuZCB0cmlnZ2VycyBhIGJyb3dzZXIgZG93bmxvYWQgc29cclxuICAgKiB0aGUgdXNlciBjYW4gY29ycmVjdCBhbmQgcmUtdXBsb2FkLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBkb3dubG9hZEVycm9yTG9nKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmpvYkVycm9ycy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPSB0aGlzLnNjcmVlblRleHRzPy5lcnJvckxvZz8uaGVhZGVycyA/PyBbXHJcbiAgICAgICdSb3cnLFxyXG4gICAgICAnRmllbGQnLFxyXG4gICAgICAnRXJyb3InLFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmpvYkVycm9ycy5tYXAoKHJvd0VycikgPT5cclxuICAgICAgW3Jvd0Vyci5yb3dOdW1iZXIsIHJvd0Vyci5maWVsZCwgcm93RXJyLmVycm9yTWVzc2FnZV1cclxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4gdGhpcy50b0NzdkNlbGwodmFsdWUpKVxyXG4gICAgICAgIC5qb2luKCcsJylcclxuICAgICk7XHJcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xyXG4gICAgICBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiB0aGlzLnRvQ3N2Q2VsbChoZWFkZXIpKS5qb2luKCcsJyksXHJcbiAgICAgIC4uLnJvd3MsXHJcbiAgICBdLmpvaW4oJ1xcclxcbicpO1xyXG4gICAgY29uc3QgZmlsZU5hbWUgPVxyXG4gICAgICB0aGlzLnNjcmVlblRleHRzPy5lcnJvckxvZz8uZmlsZU5hbWUgPz8gJ1Jvc3Rlcl9JbXBvcnRfRXJyb3JfTG9nLmNzdic7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICB0aGlzLnRyaWdnZXJEb3dubG9hZChibG9iLCBmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHNhZmUgaW5jbHVzaW9uIGluIGEgQ1NWIGNlbGwuXHJcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCl9IHZhbHVlIC0gVGhlIHJhdyBjZWxsIHZhbHVlLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSB0aGUgQ1NWLXNhZmUgY2VsbCBzdHJpbmcuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHRvQ3N2Q2VsbCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByYXcgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpO1xyXG4gICAgaWYgKC9bXCIsXFxyXFxuXS8udGVzdChyYXcpKSB7XHJcbiAgICAgIHJldHVybiBgXCIke3Jhdy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcclxuICAgIH1cclxuICAgIHJldHVybiByYXc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIGRpYWxvZy4gRW1pdHMgc3VibWl0Rm9ybVJlc3BvbnNlIHdoZW4gYXQgbGVhc3Qgb25lIHJvdyB3YXMgYWRkZWRcclxuICAgKiBzbyB0aGUgcGFyZW50IHJlZnJlc2hlczsgb3RoZXJ3aXNlIGVtaXRzIGZvcm1DYW5jZWwuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkUmVzdWx0ICYmIHRoaXMudXBsb2FkUmVzdWx0LnN1Y2Nlc3NDb3VudCA+IDApIHtcclxuICAgICAgdGhpcy5zdWJtaXRGb3JtUmVzcG9uc2UuZW1pdCh0aGlzLnVwbG9hZFJlc3VsdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1DYW5jZWwuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZ2dlcnMgYSBicm93c2VyIGRvd25sb2FkIGZvciBhIGdlbmVyYXRlZCBibG9iLlxyXG4gICAqIEBwYXJhbSB7QmxvYn0gYmxvYiAtIFRoZSBmaWxlIGNvbnRlbnQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gVGhlIHN1Z2dlc3RlZCBmaWxlbmFtZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cmlnZ2VyRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydFwiPlxyXG4gIDwhLS0gU3ViLWhlYWRpbmcgYmFuZDogXCJCdWxrIEltcG9ydCBQYXJ0aWNpcGFudHNcIiBvbiB0aGUgbGVmdCwgSW1wb3J0IFJvc3RlclxyXG4gICAgICAgYWN0aW9uIG9uIHRoZSByaWdodCAoYXBwZWFycyBvbmNlIGEgZmlsZSBpcyBzZWxlY3RlZCkg4oCUIG1hdGNoZXMgdGhlIEZpZ21hLlxyXG4gICAgICAgVGhlIFwi4oaQIEJhY2sgdG8gUm9zdGVycyAvIEltcG9ydCBSb3N0ZXJcIiB0aXRsZSByb3cgKyBYIGFyZSByZW5kZXJlZCBieSB0aGVcclxuICAgICAgIHNoYXJlZCBNb2RhbENvbXBvbmVudCBhYm92ZSB0aGlzLiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1YmhlYWRlclwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3ViaGVhZGVyLXRpdGxlXCI+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5zdWJIZWFkaW5nID8/ICdCdWxrIEltcG9ydCBQYXJ0aWNpcGFudHMnIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWxlXCJcclxuICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uIGllZWVzYS1yb3N0ZXItaW1wb3J0X19pbXBvcnQtYnRuXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZydcIlxyXG4gICAgICAoY2xpY2spPVwib25JbXBvcnQoKVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmltcG9ydCA/PyAnSW1wb3J0IFJvc3RlcidcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ltcG9ydC1idG4taWNvblwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWltcG9ydFwiPjwvdXNlPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmltcG9ydCA/PyAnSW1wb3J0IFJvc3RlcicgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFJlcXVpcmVkIENvbHVtbnMgSW5mbyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jb2x1bW5zLWNvbnRlbnRcIj5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY29sdW1ucy10aXRsZVwiPlxyXG4gICAgICAgIHt7IHNjcmVlblRleHRzPy5yZXF1aXJlZENvbHVtbnNUaXRsZSA/PyAnUmVxdWlyZWQgY29sdW1ucycgfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtY2hpcHNcIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiByZXF1aXJlZENvbHVtbnNcIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY2hpcFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgY29sIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zYW1wbGUtd3JhcHBlclwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fZG93bmxvYWQtYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRTYW1wbGVGaWxlKClcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmFyaWFMYWJlbD8uZG93bmxvYWRTYW1wbGUgPz8gJ0Rvd25sb2FkIFNhbXBsZSBGaWxlJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kb3dubG9hZC1idG4taWNvblwiXHJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWZpbGUtZG9jXCI+PC91c2U+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAge3sgc2NyZWVuVGV4dHM/LmRvd25sb2FkU2FtcGxlTGFiZWwgPz8gJ0Rvd25sb2FkIFNhbXBsZSBGaWxlJyB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtbGFiZWxcIj5cclxuICAgIHt7IHNjcmVlblRleHRzPy51cGxvYWRMYWJlbCA/PyAnVXBsb2FkIHlvdXIgZmlsZScgfX1cclxuICA8L3A+XHJcblxyXG4gIDwhLS0gVXBsb2FkIFN0YXRlIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3VwbG9hZCdcIj5cclxuICAgIDwhLS0gSGlkZGVuIGZpbGUgaW5wdXQgLS0+XHJcbiAgICA8aW5wdXRcclxuICAgICAgI2ZpbGVJbnB1dFxyXG4gICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICBoaWRkZW5cclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8udXBsb2FkTGFiZWwgPz8gJ1VwbG9hZCB5b3VyIGZpbGUnXCJcclxuICAgIC8+XHJcblxyXG4gICAgPCEtLSBEcmFnICYgRHJvcCBab25lIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZVwiXHJcbiAgICAgIFtjbGFzcy5pZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUtLWFjdGl2ZV09XCJpc0RyYWdPdmVyXCJcclxuICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXHJcbiAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgICAgIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KVwiXHJcbiAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgIChrZXlkb3duLnNwYWNlKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kcm9wem9uZSA/PyAnRHJhZyBhbmQgZHJvcCBmaWxlIHVwbG9hZCBhcmVhJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWRGaWxlXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtaWNvblwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS10ZXh0XCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8uZHJvcHpvbmVUZXh0ID8/ICdEcmFnICYgZHJvcCBhIGZpbGUgaGVyZSwgb3IgY2xpY2sgdG8gYnJvd3NlJyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS1oaW50XCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8uZHJvcHpvbmVIaW50ID8/ICdBY2NlcHRlZCBmb3JtYXRzOiAuY3N2LCAueGxzeCcgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGaWxlXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtaWNvblwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ZpbGUtcm93XCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19maWxlLW5hbWVcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIj5cclxuICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1maWxlLWRvY1wiPjwvdXNlPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAge3sgc2VsZWN0ZWRGaWxlLm5hbWUgfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19yZW1vdmUtZmlsZS1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVGaWxlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5hcmlhTGFiZWw/LnJlbW92ZSA/PyAnUmVtb3ZlIHNlbGVjdGVkIGZpbGUnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgJnRpbWVzO1xyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbmxpbmUgRXJyb3IgTWVzc2FnZSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvci1iYW5uZXJcIlxyXG4gICAgICByb2xlPVwiYWxlcnRcIlxyXG4gICAgPlxyXG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIFByb2Nlc3NpbmcgLyBSZXN1bHQgc2hhcmUgdGhlIGZpbGUgZGlzcGxheSArIHByb2dyZXNzIGJhciAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1wb3J0U3RhdGUgPT09ICdwcm9jZXNzaW5nJyB8fCBpbXBvcnRTdGF0ZSA9PT0gJ3Jlc3VsdCdcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lLS1yZXN1bHRcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3VwbG9hZC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCI+XHJcbiAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ZpbGUtbmFtZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCI+XHJcbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1maWxlLWRvY1wiPjwvdXNlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIHt7IHNlbGVjdGVkRmlsZT8ubmFtZSB9fVxyXG4gICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFByb2dyZXNzIGxhYmVsIChwcm9jZXNzaW5nIG9ubHkpIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZydcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19wcm9ncmVzcy1oZWFkXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtbGFiZWxcIj5cclxuICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucHJvY2Vzc2luZ0xhYmVsID8/ICdQcm9jZXNzaW5nIGZpbGUgcmVjb3Jkcy4uLi4nIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXJcclxuICAgICAgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Byb2Nlc3NpbmcnXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtYmFyXCJcclxuICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5wcm9jZXNzaW5nTGFiZWwgPz8gJ1Byb2Nlc3NpbmcgZmlsZSByZWNvcmRzLi4uLidcIlxyXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBSZXN1bHQgU3RhdGUgKHN1bW1hcnkgKyBlcnJvcnMpIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Jlc3VsdCcgJiYgdXBsb2FkUmVzdWx0XCI+XHJcbiAgICA8IS0tIE5vIGRhdGEgcmVjb3JkcyBiYW5uZXIgKGhlYWRlcnMgb25seSwgemVybyByb3dzKSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJub0RhdGFNZXNzYWdlXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fbm8tZGF0YS1iYW5uZXJcIlxyXG4gICAgICByb2xlPVwic3RhdHVzXCJcclxuICAgID5cclxuICAgICAge3sgbm9EYXRhTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdW1tYXJ5IGNhcmRzIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dTdW1tYXJ5Q2FyZHNcIiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmRzXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC0tc3VjY2Vzc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtY291bnRcIj5cclxuICAgICAgICAgIHt7IHVwbG9hZFJlc3VsdC5zdWNjZXNzQ291bnQgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5zdWNjZXNzQ2FyZExhYmVsID8/ICdSb3N0ZXJzIGFkZGVkIHN1Y2Nlc3NmdWxseScgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkIGllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtLXNraXBwZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICB7eyB1cGxvYWRSZXN1bHQuZmFpbHVyZUNvdW50IH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC1sYWJlbFwiPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uc2tpcHBlZENhcmRMYWJlbCA/PyAnU2tpcHBlZCBSb3dzJyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJvdyBFcnJvcnMgQ2FyZCAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJqb2JFcnJvcnMubGVuZ3RoXCIgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWNhcmRcIj5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWhlYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbGxSb3dzU2tpcHBlZDsgZWxzZSBzb21lRXJyb3JzXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5hbGxSb3dzU2tpcHBlZEhlYWRlciA/PyAnQWxsIFJvd3MgYXJlIHNraXBwZWQnIH19XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzb21lRXJyb3JzPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uZXJyb3JzSGVhZGVyID8/ICdSb3cgZXJyb3JzIOKAlCB0aGVzZSByb3dzIHdpbGwgYmUgc2tpcHBlZCcgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWJvZHlcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcm93RXJyIG9mIGpvYkVycm9yc1wiXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvci1yb3dcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLXJvdy10aXRsZVwiPlxyXG4gICAgICAgICAgICBSb3cge3sgcm93RXJyLnJvd051bWJlciB9fSDigJQge3sgcm93RXJyLmVycm9yTWVzc2FnZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEZvb3RlciBhY3Rpb25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtYnV0dG9uXHJcbiAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fY2FuY2VsLWJ0blwiXHJcbiAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5idXR0b25zPy5jYW5jZWwgPz8gJ0NhbmNlbCcgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncmVzdWx0JyAmJiBqb2JFcnJvcnMubGVuZ3RoXCJcclxuICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeS1idXR0b24gaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLWxvZy1idG5cIlxyXG4gICAgICAoY2xpY2spPVwiZG93bmxvYWRFcnJvckxvZygpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kb3dubG9hZEVycm9yTG9nID8/ICdEb3dubG9hZCBFcnJvciBsb2cnXCJcclxuICAgID5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmRvd25sb2FkRXJyb3JMb2cgPz8gJ0Rvd25sb2FkIEVycm9yIGxvZycgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|