@dollhousemcp/mcp-server 2.0.32 → 2.0.35

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.
Files changed (33) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli/convert.js +9 -8
  3. package/dist/converters/DollhouseToAnthropicConverter.js +8 -8
  4. package/dist/elements/agents/AgentManager.js +2 -2
  5. package/dist/elements/skills/Skill.d.ts.map +1 -1
  6. package/dist/elements/skills/Skill.js +2 -2
  7. package/dist/elements/templates/Template.d.ts.map +1 -1
  8. package/dist/elements/templates/Template.js +15 -2
  9. package/dist/elements/templates/TemplateManager.js +3 -3
  10. package/dist/generated/version.d.ts +2 -2
  11. package/dist/generated/version.js +3 -3
  12. package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
  13. package/dist/handlers/element-crud/createElement.js +10 -2
  14. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  15. package/dist/handlers/element-crud/editElement.js +61 -5
  16. package/dist/security/constants.d.ts +1 -0
  17. package/dist/security/constants.d.ts.map +1 -1
  18. package/dist/security/constants.js +2 -1
  19. package/dist/security/secureYamlParser.js +2 -2
  20. package/dist/services/validation/AgentElementValidator.d.ts.map +1 -1
  21. package/dist/services/validation/AgentElementValidator.js +3 -2
  22. package/dist/services/validation/GenericElementValidator.d.ts +1 -0
  23. package/dist/services/validation/GenericElementValidator.d.ts.map +1 -1
  24. package/dist/services/validation/GenericElementValidator.js +14 -6
  25. package/dist/utils/pathSecurity.d.ts +7 -0
  26. package/dist/utils/pathSecurity.d.ts.map +1 -0
  27. package/dist/utils/pathSecurity.js +30 -0
  28. package/dist/web/public/index.html +1 -1
  29. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  30. package/dist/web/routes/permissionRoutes.js +48 -11
  31. package/package.json +21 -5
  32. package/scripts/pretooluse-dollhouse.sh +23 -4
  33. package/server.json +2 -2
@@ -19,6 +19,18 @@ const READ_ONLY_FIELDS = new Set([
19
19
  '_status',
20
20
  '_isDirty'
21
21
  ]);
22
+ function getMaxLengthForFieldType(fieldType) {
23
+ switch (fieldType) {
24
+ case 'name':
25
+ return SECURITY_LIMITS.MAX_NAME_LENGTH;
26
+ case 'description':
27
+ return SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH;
28
+ case 'content':
29
+ return SECURITY_LIMITS.MAX_CONTENT_LENGTH;
30
+ case 'filename':
31
+ return SECURITY_LIMITS.MAX_COMMAND_ARG_LENGTH;
32
+ }
33
+ }
22
34
  /**
23
35
  * Issue #662: Systematic field type validation at the editElement boundary.
24
36
  *
@@ -139,10 +151,7 @@ function validateFieldValue(validationService, field, value) {
139
151
  if (!fieldType) {
140
152
  return null; // No validation rules for this field
141
153
  }
142
- // Determine max length based on field type, using system constants
143
- const maxLength = fieldType === 'name' ? SECURITY_LIMITS.MAX_NAME_LENGTH :
144
- fieldType === 'description' ? SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH :
145
- fieldType === 'content' ? SECURITY_LIMITS.MAX_CONTENT_LENGTH : SECURITY_LIMITS.MAX_COMMAND_ARG_LENGTH;
154
+ const maxLength = getMaxLengthForFieldType(fieldType);
146
155
  const result = validationService.validateAndSanitizeInput(value, {
147
156
  maxLength,
148
157
  allowSpaces: true,
@@ -153,6 +162,49 @@ function validateFieldValue(validationService, field, value) {
153
162
  }
154
163
  return null; // Valid
155
164
  }
165
+ function getTraversalEntries(value, path) {
166
+ if (Array.isArray(value)) {
167
+ return value.map((item, index) => [`${path}[${index}]`, item]);
168
+ }
169
+ return Object.entries(value).map(([key, item]) => [`${path}.${key}`, item]);
170
+ }
171
+ function getDescriptionMaxLengthForPath(fieldPath) {
172
+ if (fieldPath === 'input.description' || fieldPath === 'input.metadata.description') {
173
+ return SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH;
174
+ }
175
+ return SECURITY_LIMITS.MAX_DOCUMENTATION_FIELD_LENGTH;
176
+ }
177
+ function isOversizedDescriptionField(fieldPath, value) {
178
+ const maxLength = getDescriptionMaxLengthForPath(fieldPath);
179
+ return (fieldPath.endsWith('.description') &&
180
+ typeof value === 'string' &&
181
+ value.length > maxLength);
182
+ }
183
+ function formatOversizedDescriptionField(field) {
184
+ return (` • ${field.path} exceeds maximum length of ` +
185
+ `${field.maxLength} characters (${field.length})`);
186
+ }
187
+ function findOversizedDescriptionFields(value, path = 'input', seen = new WeakSet()) {
188
+ if (value === null || typeof value !== 'object') {
189
+ return [];
190
+ }
191
+ if (seen.has(value)) {
192
+ return [];
193
+ }
194
+ seen.add(value);
195
+ const oversized = [];
196
+ for (const [fieldPath, item] of getTraversalEntries(value, path)) {
197
+ if (isOversizedDescriptionField(fieldPath, item)) {
198
+ oversized.push({
199
+ path: fieldPath,
200
+ length: item.length,
201
+ maxLength: getDescriptionMaxLengthForPath(fieldPath),
202
+ });
203
+ }
204
+ oversized.push(...findOversizedDescriptionFields(item, fieldPath, seen));
205
+ }
206
+ return oversized;
207
+ }
156
208
  /**
157
209
  * Validate and normalize ensemble elements input.
158
210
  *
@@ -458,6 +510,10 @@ export async function editElement(context, args, validationService) {
458
510
  if (gatekeeperErrors.length > 0) {
459
511
  return error(formatGatekeeperValidationMessage(gatekeeperErrors));
460
512
  }
513
+ const oversizedDescriptionFields = findOversizedDescriptionFields(input);
514
+ if (oversizedDescriptionFields.length > 0) {
515
+ return error(`Description length validation failed:\n${oversizedDescriptionFields.map(field => formatOversizedDescriptionField(field)).join('\n')}`);
516
+ }
461
517
  // Validate string field values using injected validator
462
518
  for (const [field, value] of Object.entries(input)) {
463
519
  if (typeof value === 'string') {
@@ -780,4 +836,4 @@ function autoIncrementVersion(element) {
780
836
  logger.error('Failed to auto-increment version', { error });
781
837
  }
782
838
  }
783
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdEVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBNEIsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEdBQ2xDLE1BQU0sY0FBYyxDQUFDO0FBaUN0QixnRUFBZ0U7QUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixJQUFJO0lBQ0osTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FJakI7SUFDSCx1Q0FBdUM7SUFDdkMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN0RSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDekUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDL0QsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMvRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNuRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUM1RCxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNsRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUM5RCxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUM3RCxzRUFBc0U7SUFDdEUsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDNUksS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDeEksU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0lBQ3RHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUNsRyx5RkFBeUY7SUFFekYsZ0JBQWdCO0lBQ2hCLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ3ZJLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQzNJLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQzdJLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMs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LENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3NraWxscy9Ta2lsbC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudC5qcyc7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnO1xuaW1wb3J0IHsgRW5zZW1ibGUgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFbnNlbWJsZUVsZW1lbnRJbnB1dCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Q3J1ZENvbnRleHQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWVtb3J5SWQgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy91dGlscy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplVmVyc2lvbiB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlLCB0eXBlIFZhbGlkYXRpb25GaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIERBTkdFUk9VU19QUk9QRVJUSUVTIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGVlcE1lcmdlLmpzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQsXG4gIGZvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCxcbiAgZ2V0RWxlbWVudEZpbGVuYW1lLFxuICBnZXRFbGVtZW50VHlwZUxhYmVsLFxuICByZXNvbHZlRWxlbWVudEJ5TmFtZSxcbiAgRWxlbWVudE1hbmFnZXJPcGVyYXRpb25zLFxuICBLTk9XTl9NRVRBREFUQV9QUk9QRVJUSUVTLFxuICBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzLFxuICBmb3JtYXRVbmtub3duUHJvcGVydHlXYXJuaW5ncyxcbiAgZm9ybWF0RWxlbWVudFJlc29sdXRpb25XYXJuaW5ncyxcbiAgY29sbGVjdEdhdGVrZWVwZXJBdXRob3JpbmdFcnJvcnMsXG4gIGZvcm1hdEdhdGVrZWVwZXJWYWxpZGF0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZUVsZW1lbnRUeXBlc1Jlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG50eXBlIEVsZW1lbnRNYW5hZ2VyV2l0aFBlcnNpc3RlbmNlPFQ+ID0gRWxlbWVudE1hbmFnZXJPcGVyYXRpb25zPFQ+ICYge1xuICBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBkZWxldGU/KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBHcmFwaFFMLWFsaWduZWQgaW5wdXQgZm9yIGVkaXRpbmcgZWxlbWVudHMuXG4gKiBVc2VzIG5lc3RlZCBvYmplY3RzIChsaWtlIGNyZWF0ZV9lbGVtZW50KSBpbnN0ZWFkIG9mIE1vbmdvREItc3R5bGUgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVcGRhdGUgZGVzY3JpcHRpb24gYW5kIG5lc3RlZCBtZXRhZGF0YVxuICoge1xuICogICBuYW1lOiBcIm15LXNraWxsXCIsXG4gKiAgIHR5cGU6IFwic2tpbGxzXCIsXG4gKiAgIGlucHV0OiB7XG4gKiAgICAgZGVzY3JpcHRpb246IFwiVXBkYXRlZCBkZXNjcmlwdGlvblwiLFxuICogICAgIG1ldGFkYXRhOiB7XG4gKiAgICAgICB0cmlnZ2VyczogW1wiY29kZVwiLCBcInJldmlld1wiXSxcbiAqICAgICAgIHNldHRpbmdzOiB7IHRoZW1lOiBcImRhcmtcIiB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEVsZW1lbnRBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBOZXN0ZWQgaW5wdXQgb2JqZWN0IC0gZmllbGRzIGFyZSBkZWVwLW1lcmdlZCB3aXRoIGV4aXN0aW5nIGVsZW1lbnQgKi9cbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBSZWFkLW9ubHkgZmllbGRzIHRoYXQgY2Fubm90IGJlIG1vZGlmaWVkIHRocm91Z2ggdGhlIGVkaXQgQVBJXG5jb25zdCBSRUFEX09OTFlfRklFTERTID0gbmV3IFNldChbXG4gICdpZCcsXG4gICd0eXBlJyxcbiAgJ2ZpbGVQYXRoJyxcbiAgJ2ZpbGVuYW1lJyxcbiAgJ19zdGF0dXMnLFxuICAnX2lzRGlydHknXG5dKTtcblxuLyoqXG4gKiBJc3N1ZSAjNjYyOiBTeXN0ZW1hdGljIGZpZWxkIHR5cGUgdmFsaWRhdGlvbiBhdCB0aGUgZWRpdEVsZW1lbnQgYm91bmRhcnkuXG4gKlxuICogRGVmaW5lcyBleHBlY3RlZCB0eXBlcyBmb3Iga25vd24gbWV0YWRhdGEgZmllbGRzIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlcy5cbiAqIFByZXZlbnRzIHNpbGVudCBkYXRhIGNvcnJ1cHRpb24gd2hlbiBMTE1zIHNlbmQgd3JvbmcgdHlwZXMgKGUuZy4sIGRpY3QgaW5zdGVhZCBvZiBhcnJheSkuXG4gKlxuICogS2V5OiBmaWVsZCBuYW1lLCBWYWx1ZTogeyBleHBlY3RlZDogdHlwZSBkZXNjcmlwdGlvbiwgY2hlY2s6IHZhbGlkYXRvciBmdW5jdGlvbiB9XG4gKi9cbmNvbnN0IEZJRUxEX1RZUEVfUlVMRVM6IFJlY29yZDxzdHJpbmcsIHtcbiAgZXhwZWN0ZWQ6IHN0cmluZztcbiAgY2hlY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgZWxlbWVudFR5cGVzPzogRWxlbWVudFR5cGVbXTtcbn0+ID0ge1xuICAvLyBBcnJheSBmaWVsZHMgKGFjcm9zcyBtdWx0aXBsZSB0eXBlcylcbiAgdGFnczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgdHJpZ2dlcnM6IHsgZXhwZWN0ZWQ6ICdhcnJheSBvZiBzdHJpbmdzJywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGRvbWFpbnM6IHsgZXhwZWN0ZWQ6ICdhcnJheSBvZiBzdHJpbmdzJywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGV4YW1wbGVzOiB7IGV4cGVjdGVkOiAnYXJyYXknLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgcHJlcmVxdWlzaXRlczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgY2FwYWJpbGl0aWVzOiB7IGV4cGVjdGVkOiAnYXJyYXknLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZ29hbHM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBjb25zdHJhaW50czogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGFjdGlvbnM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBza2lsbHM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICAvLyBJc3N1ZSAjNzI0OiBhY3RpdmF0ZXMgYW5kIHRvb2xzIGFyZSBvYmplY3RzIGZvciBhZ2VudHMgKG5vdCBhcnJheXMpXG4gIGFjdGl2YXRlczogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICB0b29sczogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICB2YXJpYWJsZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuVEVNUExBVEVdIH0sXG4gIGVudHJpZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICAvLyBlbGVtZW50cyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgdmFsaWRhdGVBbmROb3JtYWxpemVFbnNlbWJsZUVsZW1lbnRzIChhY2NlcHRzIGRpY3QgdG9vKVxuXG4gIC8vIE9iamVjdCBmaWVsZHNcbiAgZ29hbDogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBhdXRvbm9teTogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICByZXNpbGllbmNlOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIGdhdGVrZWVwZXI6IHsgZXhwZWN0ZWQ6ICdvYmplY3QnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpIH0sXG4gIHJldGVudGlvblBvbGljeTogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcbiAgcmV0ZW50aW9uX3BvbGljeTogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcblxuICAvLyBTdHJpbmcgZmllbGRzXG4gIC8vIElzc3VlICM3MjQ6IHN5c3RlbVByb21wdCB3YXMgbWlzc2luZyBmcm9tIGZpZWxkIHR5cGUgcnVsZXMuXG4gIC8vIEJvdGggY2FtZWxDYXNlIGFuZCBzbmFrZV9jYXNlIHZhcmlhbnRzIGFjY2VwdGVkIGJlY2F1c2UgTExNcyBmcmVxdWVudGx5XG4gIC8vIHBhc3Mgc25ha2VfY2FzZSBrZXlzOyBub3JtYWxpemF0aW9uIHRvIGNhbWVsQ2FzZSBoYXBwZW5zIGRvd25zdHJlYW0gaW5cbiAgLy8gQWdlbnRNYW5hZ2VyLnBhcnNlTWV0YWRhdGEoKSAoSXNzdWUgIzcyMikuXG4gIHN5c3RlbVByb21wdDogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5BR0VOVF0gfSxcbiAgc3lzdGVtX3Byb21wdDogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5BR0VOVF0gfSxcbiAgbmFtZTogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG4gIGRlc2NyaXB0aW9uOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgYXV0aG9yOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgdmVyc2lvbjogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB9LFxuICBjYXRlZ29yeTogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG4gIGRvbWFpbjogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG4gIHRvbmU6IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuXG4gIC8vIE51bWJlciBmaWVsZHNcbiAgbWF4RW50cmllczogeyBleHBlY3RlZDogJ251bWJlcicsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5NRU1PUlldIH0sXG4gIG1heF9lbnRyaWVzOiB7IGV4cGVjdGVkOiAnbnVtYmVyJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcbiAgcHJpb3JpdHk6IHsgZXhwZWN0ZWQ6ICdudW1iZXInLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB9LFxufTtcblxuLyoqXG4gKiBJc3N1ZSAjNjYyOiBWYWxpZGF0ZSBmaWVsZCB0eXBlcyBpbiBpbnB1dCBiZWZvcmUgYXBwbHlpbmcgdG8gZWxlbWVudC5cbiAqXG4gKiBDaGVja3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgYWdhaW5zdCBgRklFTERfVFlQRV9SVUxFU2AuIEZpZWxkcyBub3QgaW4gdGhlXG4gKiBydWxlcyBtYXAgYXJlIHNraXBwZWQgKHRoZXknbGwgYmUgY2F1Z2h0IGJ5IHVua25vd24tcHJvcGVydHkgZGV0ZWN0aW9uIGxhdGVyKS5cbiAqIEVsZW1lbnQtdHlwZS1zY29wZWQgcnVsZXMgb25seSBhcHBseSB3aGVuIHRoZSB0YXJnZXQgdHlwZSBtYXRjaGVzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCAtIFRoZSBlZGl0IGlucHV0IG9iamVjdCBjb250YWluaW5nIGZpZWxkcyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIG5vcm1hbGl6ZWQgZWxlbWVudCB0eXBlIGJlaW5nIGVkaXRlZFxuICogQHJldHVybnMgQXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgZm9yIGZpZWxkcyB3aXRoIHdyb25nIHR5cGVzIChlbXB0eSBpZiBhbGwgdmFsaWQpXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGRUeXBlcyhcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGVcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcnVsZSA9IEZJRUxEX1RZUEVfUlVMRVNbZmllbGRdO1xuICAgIGlmICghcnVsZSkgY29udGludWU7XG5cbiAgICAvLyBTa2lwIGlmIHJ1bGUgZG9lc24ndCBhcHBseSB0byB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIGlmIChydWxlLmVsZW1lbnRUeXBlcyAmJiAhcnVsZS5lbGVtZW50VHlwZXMuaW5jbHVkZXMoZWxlbWVudFR5cGUpKSBjb250aW51ZTtcblxuICAgIGlmICghcnVsZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGV4cGVjdHMgJHtydWxlLmV4cGVjdGVkfSwgZ290ICR7QXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8vIE1lcmdlIG9wdGlvbnMgZm9yIHNlY3VyZSBkZWVwIG1lcmdpbmdcbmNvbnN0IE1FUkdFX09QVElPTlMgPSB7XG4gIHNraXBQcm9wZXJ0aWVzOiBEQU5HRVJPVVNfUFJPUEVSVElFUyxcbiAgcmVhZE9ubHlGaWVsZHM6IFJFQURfT05MWV9GSUVMRFNcbn07XG5cbi8qKlxuICogTWFwIGZpZWxkIG5hbWVzIHRvIHRoZWlyIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24gZmllbGQgdHlwZXMuXG4gKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCB2YWxpZGF0aW9uIGJldHdlZW4gZWRpdCAoaW5wdXQpIGFuZCBsb2FkIChvdXRwdXQpLlxuICovXG5mdW5jdGlvbiBnZXRGaWVsZFR5cGVGb3JWYWxpZGF0aW9uKGZpZWxkTmFtZTogc3RyaW5nKTogVmFsaWRhdGlvbkZpZWxkVHlwZSB8IG51bGwge1xuICAvLyBOb3JtYWxpemUgZmllbGQgbmFtZSAoaGFuZGxlIGJvdGggJ2Rlc2NyaXB0aW9uJyBhbmQgJ21ldGFkYXRhLmRlc2NyaXB0aW9uJylcbiAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGROYW1lLnJlcGxhY2UoL15tZXRhZGF0YVxcLi8sICcnKTtcblxuICBzd2l0Y2ggKG5vcm1hbGl6ZWRGaWVsZCkge1xuICAgIGNhc2UgJ25hbWUnOlxuICAgICAgcmV0dXJuICduYW1lJztcbiAgICBjYXNlICdkZXNjcmlwdGlvbic6XG4gICAgICByZXR1cm4gJ2Rlc2NyaXB0aW9uJztcbiAgICBjYXNlICdjb250ZW50JzpcbiAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsOyAvLyBObyBzcGVjaWFsIHZhbGlkYXRpb24gbmVlZGVkXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uIGFuIGVsZW1lbnQuXG4gKiBSZXR1cm5zIG51bGwgaWYgdmFsaWQsIG9yIGFuIGVycm9yIG1lc3NhZ2UgaWYgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0gdmFsaWRhdGlvblNlcnZpY2UgLSBJbmplY3RlZCB2YWxpZGF0aW9uIHNlcnZpY2UgZm9yIHRlc3RhYmlsaXR5XG4gKiBAcGFyYW0gZmllbGQgLSBUaGUgZmllbGQgbmFtZSBiZWluZyB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpZWxkVmFsdWUoXG4gIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IHN0cmluZyB8IG51bGwge1xuICAvLyBPbmx5IHZhbGlkYXRlIHN0cmluZyB2YWx1ZXMgZm9yIHRleHQgZmllbGRzXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIE5vbi1zdHJpbmcgdmFsdWVzIChhcnJheXMsIG9iamVjdHMsIGJvb2xlYW5zLCBudW1iZXJzKSBza2lwIHRleHQgdmFsaWRhdGlvblxuICB9XG5cbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlRm9yVmFsaWRhdGlvbihmaWVsZCk7XG4gIGlmICghZmllbGRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIE5vIHZhbGlkYXRpb24gcnVsZXMgZm9yIHRoaXMgZmllbGRcbiAgfVxuXG4gIC8vIERldGVybWluZSBtYXggbGVuZ3RoIGJhc2VkIG9uIGZpZWxkIHR5cGUsIHVzaW5nIHN5c3RlbSBjb25zdGFudHNcbiAgY29uc3QgbWF4TGVuZ3RoID0gZmllbGRUeXBlID09PSAnbmFtZScgPyBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIIDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlID09PSAnZGVzY3JpcHRpb24nID8gU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEggOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPT09ICdjb250ZW50JyA/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEggOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDtcblxuICBjb25zdCByZXN1bHQgPSB2YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQodmFsdWUsIHtcbiAgICBtYXhMZW5ndGgsXG4gICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgZmllbGRUeXBlXG4gIH0pO1xuXG4gIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICByZXR1cm4gcmVzdWx0LmVycm9ycz8uam9pbignLCAnKSB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7IC8vIFZhbGlkXG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBlbnNlbWJsZSBlbGVtZW50cyBpbnB1dC5cbiAqXG4gKiBJc3N1ZSAjNjU4OiBMTE1zIG9mdGVuIHNlbmQgZWxlbWVudHMgaW4gZGljdC1rZXllZCBmb3JtYXQgaW5zdGVhZCBvZiBhcnJheSBmb3JtYXQuXG4gKiBUaGlzIGZ1bmN0aW9uIG5vcm1hbGl6ZXMgYm90aCBmb3JtYXRzIHRvIGEgdmFsaWQgYXJyYXkgb2YgRW5zZW1ibGVFbGVtZW50LWxpa2Ugb2JqZWN0cy5cbiAqXG4gKiBBY2NlcHRlZCBmb3JtYXRzOlxuICogLSBBcnJheTogW3sgZWxlbWVudF9uYW1lOiBcImZvb1wiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIC4uLiB9XVxuICogLSBEaWN0OiAgeyBcImZvb1wiOiB7IHR5cGU6IFwibWVtb3J5XCIsIC4uLiB9IH0gIOKGkiBjb252ZXJ0ZWQgdG8gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgZWxlbWVudHMgaW5wdXQgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN1Y2Nlc3MgZmxhZywgbm9ybWFsaXplZCBlbGVtZW50cyBhcnJheSwgYW5kIG9wdGlvbmFsIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQW5kTm9ybWFsaXplRW5zZW1ibGVFbGVtZW50cyh2YWx1ZTogdW5rbm93bik6IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudElucHV0W107XG4gIGVycm9yPzogc3RyaW5nO1xufSB7XG4gIC8vIENhc2UgMTogQWxyZWFkeSBhbiBhcnJheSDigJQgdmFsaWRhdGUgZWFjaCBpdGVtXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBub3JtYWxpemVkOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gdmFsdWVbaV07XG4gICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYEVsZW1lbnQgYXQgaW5kZXggJHtpfSBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIGVsZW1lbnRfbmFtZSBhbmQgZWxlbWVudF90eXBlYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2JqID0gaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG5hbWUgPSBvYmouZWxlbWVudF9uYW1lIHx8IG9iai5uYW1lO1xuICAgICAgY29uc3QgdHlwZSA9IG9iai5lbGVtZW50X3R5cGUgfHwgb2JqLnR5cGU7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYEVsZW1lbnQgYXQgaW5kZXggJHtpfSBpcyBtaXNzaW5nIGVsZW1lbnRfbmFtZSAob3IgbmFtZSlgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBWYWxpZGF0ZSBfcmVtb3ZlIGlzIHN0cmljdGx5IGJvb2xlYW4gaWYgcHJlc2VudFxuICAgICAgaWYgKCdfcmVtb3ZlJyBpbiBvYmogJiYgdHlwZW9mIG9iai5fcmVtb3ZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYEVsZW1lbnQgJyR7U3RyaW5nKG5hbWUpfScgaGFzIGludmFsaWQgX3JlbW92ZSB2YWx1ZSDigJQgbXVzdCBiZSBib29sZWFuIHRydWUsIGdvdCAke3R5cGVvZiBvYmouX3JlbW92ZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBOb3JtYWxpemUgdG8gc3RhbmRhcmQgZmllbGQgbmFtZXMsIG9ubHkgaW5jbHVkaW5nIGRlZmluZWQgdmFsdWVzXG4gICAgICBjb25zdCBlbnRyeTogRW5zZW1ibGVFbGVtZW50SW5wdXQgPSB7IC4uLm9iaiwgZWxlbWVudF9uYW1lOiBTdHJpbmcobmFtZSkgfTtcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIGVudHJ5LmVsZW1lbnRfdHlwZSA9IFN0cmluZyh0eXBlKTtcbiAgICAgIH1cbiAgICAgIG5vcm1hbGl6ZWQucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZWxlbWVudHM6IFtdLCBlcnJvcjogZXJyb3JzLmpvaW4oJzsgJykgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZWxlbWVudHM6IG5vcm1hbGl6ZWQgfTtcbiAgfVxuXG4gIC8vIENhc2UgMjogRGljdC1rZXllZCBmb3JtYXQg4oCUIGNvbnZlcnQgdG8gYXJyYXlcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgZGljdCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IEVuc2VtYmxlRWxlbWVudElucHV0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhkaWN0KSkge1xuICAgICAgaWYgKCF2YWwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZWxlbWVudHM6IFtdLFxuICAgICAgICAgIGVycm9yOiBgRWxlbWVudCAnJHtrZXl9JyBpbiBkaWN0IGZvcm1hdCBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IGVsZW1lbnRfdHlwZSAob3IgdHlwZSkuIGAgK1xuICAgICAgICAgICAgYEV4cGVjdGVkOiB7IFwiJHtrZXl9XCI6IHsgdHlwZTogXCJtZW1vcnlcIiwgcm9sZTogXCJzdXBwb3J0XCIsIC4uLiB9IH1gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lciA9IHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIG5vcm1hbGl6ZWQucHVzaCh7XG4gICAgICAgIC4uLmlubmVyLFxuICAgICAgICBlbGVtZW50X25hbWU6IFN0cmluZyhpbm5lci5lbGVtZW50X25hbWUgfHwgaW5uZXIubmFtZSB8fCBrZXkpLFxuICAgICAgICBlbGVtZW50X3R5cGU6IFN0cmluZyhpbm5lci5lbGVtZW50X3R5cGUgfHwgaW5uZXIudHlwZSksXG4gICAgICAgIHJvbGU6IChpbm5lci5yb2xlIGFzIEVuc2VtYmxlRWxlbWVudElucHV0Wydyb2xlJ10pIHx8ICdzdXBwb3J0JyxcbiAgICAgICAgYWN0aXZhdGlvbjogKGlubmVyLmFjdGl2YXRpb24gYXMgRW5zZW1ibGVFbGVtZW50SW5wdXRbJ2FjdGl2YXRpb24nXSkgfHwgJ2Fsd2F5cycsXG4gICAgICAgIHByaW9yaXR5OiAoaW5uZXIucHJpb3JpdHkgYXMgbnVtYmVyKSA/PyA1MCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbGVtZW50czogbm9ybWFsaXplZCB9O1xuICB9XG5cbiAgLy8gQ2FzZSAzOiBJbnZhbGlkIHR5cGVcbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlbGVtZW50czogW10sXG4gICAgZXJyb3I6IGAnZWxlbWVudHMnIG11c3QgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvciBhIGRpY3Qta2V5ZWQgb2JqZWN0LiBHb3Q6ICR7dHlwZW9mIHZhbHVlfWBcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbmNvbWluZyBlbnNlbWJsZSBlbGVtZW50cyB3aXRoIGV4aXN0aW5nIGVsZW1lbnRzLlxuICpcbiAqIElzc3VlICM2NTgvIzY2MjogVW5pZmllZCBjb2xsZWN0aW9uIGVkaXRpbmcgc2VtYW50aWNzIOKAlCBlYWNoIGl0ZW0gaW4gdGhlIGlucHV0XG4gKiBkZWNsYXJlcyBpdHMgb3duIGludGVudCB2aWEgaXRzIHByb3BlcnRpZXM6XG4gKlxuICogLSBFeGlzdGluZyBlbGVtZW50IHdpdGggdXBkYXRlcyDihpIgbWVyZ2UgcHJvcGVydGllcyAoaW5jb21pbmcgd2lucylcbiAqIC0gTmV3IGVsZW1lbnQgKG5vdCBmb3VuZCBieSBuYW1lKSDihpIgYXBwZW5kZWRcbiAqIC0gRWxlbWVudCB3aXRoIGBfcmVtb3ZlOiB0cnVlYCDihpIgZHJvcHBlZCBmcm9tIGNvbGxlY3Rpb25cbiAqIC0gRXhpc3RpbmcgZWxlbWVudHMgbm90IGluIGluY29taW5nIOKGkiBwcmVzZXJ2ZWQgdW5jaGFuZ2VkXG4gKlxuICogVGhpcyBwYXR0ZXJuIGV4dGVuZHMgdG8gYW55IGZ1dHVyZSBncm91cGluZyB0eXBlICh3b3JrZmxvd3MsIHBpcGVsaW5lcywgdGVhbXMpLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZyAtIEN1cnJlbnQgZWxlbWVudHMgYXJyYXkgZnJvbSB0aGUgZW5zZW1ibGVcbiAqIEBwYXJhbSBpbmNvbWluZyAtIE5ldy91cGRhdGVkL3JlbW92ZWQgZWxlbWVudHMgZnJvbSB0aGUgZWRpdCBpbnB1dFxuICogQHJldHVybnMgT2JqZWN0IHdpdGggbWVyZ2VkIGFycmF5IGFuZCBhbnkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gbWVyZ2VFbnNlbWJsZUVsZW1lbnRzKFxuICBleGlzdGluZzogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSxcbiAgaW5jb21pbmc6IEVuc2VtYmxlRWxlbWVudElucHV0W11cbik6IHsgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudElucHV0W107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgcmVzdWx0OiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdID0gZXhpc3RpbmcubWFwKGUgPT4gKHsgLi4uZSB9KSk7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgaW5jIG9mIGluY29taW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhpbmMuZWxlbWVudF9uYW1lIHx8IGluYy5uYW1lIHx8ICcnKTtcbiAgICBpZiAoIW5hbWUpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHJlc3VsdC5maW5kSW5kZXgoXG4gICAgICBlID0+IFN0cmluZyhlLmVsZW1lbnRfbmFtZSB8fCBlLm5hbWUgfHwgJycpID09PSBuYW1lXG4gICAgKTtcblxuICAgIC8vIElzc3VlICM2NjI6IF9yZW1vdmUgbWFya2VyIOKAlCBkcm9wIGVsZW1lbnQgZnJvbSBjb2xsZWN0aW9uXG4gICAgaWYgKGluYy5fcmVtb3ZlID09PSB0cnVlKSB7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoZXhpc3RpbmdJbmRleCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBFbGVtZW50ICcke25hbWV9JyBub3QgZm91bmQgaW4gZW5zZW1ibGUg4oCUIG5vdGhpbmcgdG8gcmVtb3ZlYCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcCB0cmFuc2llbnQvYWxpYXMgZmllbGRzIHRoYXQgc2hvdWxkbid0IGJlIHBlcnNpc3RlZFxuICAgIGNvbnN0IHsgX3JlbW92ZTogX2Rpc2NhcmRSZW1vdmUsIG5hbWU6IF9kaXNjYXJkTmFtZSwgdHlwZTogX2Rpc2NhcmRUeXBlLCAuLi5wZXJzaXN0YWJsZSB9ID0gaW5jO1xuXG4gICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xuICAgICAgLy8gVXBzZXJ0OiBtZXJnZSBpbmNvbWluZyBwcm9wZXJ0aWVzIGludG8gZXhpc3RpbmcgKGluY29taW5nIHdpbnMpXG4gICAgICByZXN1bHRbZXhpc3RpbmdJbmRleF0gPSB7IC4uLnJlc3VsdFtleGlzdGluZ0luZGV4XSwgLi4ucGVyc2lzdGFibGUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIG5ldyBlbGVtZW50XG4gICAgICByZXN1bHQucHVzaCh7IC4uLnBlcnNpc3RhYmxlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVsZW1lbnRzOiByZXN1bHQsIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUsIG5vcm1hbGl6ZSwgYW5kIG1lcmdlIGVuc2VtYmxlIGVsZW1lbnRzIGludG8gdGhlIHVwZGF0ZSBvYmplY3QuXG4gKiBFeHRyYWN0ZWQgdG8gYXZvaWQgZHVwbGljYXRpb24gYmV0d2VlbiB0aGUgdG9wLWxldmVsIGBlbGVtZW50c2Aga2V5IGhhbmRsZXJcbiAqIGFuZCB0aGUgYG1ldGFkYXRhLmVsZW1lbnRzYCBrZXkgaGFuZGxlciAoQ2xhdWRlIHJldmlldykuXG4gKlxuICogQHJldHVybnMgQW4gZXJyb3Igc3RyaW5nIGlmIHZhbGlkYXRpb24gZmFpbHMsIG9yIG51bGwgb24gc3VjY2Vzc1xuICovXG5mdW5jdGlvbiBpc0Vuc2VtYmxlRWxlbWVudElucHV0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRW5zZW1ibGVFbGVtZW50SW5wdXQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RW5zZW1ibGVFbGVtZW50c1VwZGF0ZShcbiAgZWxlbWVudHNJbnB1dDogdW5rbm93bixcbiAgZWxlbWVudDogdW5rbm93bixcbiAgdXBkYXRlT2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29sbGVjdGlvbldhcm5pbmdzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlQW5kTm9ybWFsaXplRW5zZW1ibGVFbGVtZW50cyhlbGVtZW50c0lucHV0KTtcbiAgaWYgKCF2YWxpZGF0ZWQuc3VjY2Vzcykge1xuICAgIHJldHVybiBgSW52YWxpZCAnZWxlbWVudHMnIGZvcm1hdDogJHt2YWxpZGF0ZWQuZXJyb3J9YDtcbiAgfVxuICBjb25zdCBlbGVtZW50UmVjb3JkID0gZWxlbWVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50UmVjb3JkLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCByYXdFbGVtZW50cyA9IG1ldGFkYXRhPy5lbGVtZW50cztcbiAgY29uc3QgZXhpc3RpbmdUeXBlZDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IEFycmF5LmlzQXJyYXkocmF3RWxlbWVudHMpXG4gICAgPyByYXdFbGVtZW50cy5maWx0ZXIoaXNFbnNlbWJsZUVsZW1lbnRJbnB1dCkubWFwKGUgPT4gKHsgLi4uZSB9KSlcbiAgICA6IFtdO1xuICBjb25zdCBtZXJnZVJlc3VsdCA9IG1lcmdlRW5zZW1ibGVFbGVtZW50cyhleGlzdGluZ1R5cGVkLCB2YWxpZGF0ZWQuZWxlbWVudHMpO1xuICBjb2xsZWN0aW9uV2FybmluZ3MucHVzaCguLi5tZXJnZVJlc3VsdC53YXJuaW5ncyk7XG4gIGlmICghdXBkYXRlT2JqLm1ldGFkYXRhKSB7XG4gICAgdXBkYXRlT2JqLm1ldGFkYXRhID0ge307XG4gIH1cbiAgKHVwZGF0ZU9iai5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZWxlbWVudHMgPSBtZXJnZVJlc3VsdC5lbGVtZW50cztcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogU3luYyBlbnNlbWJsZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIGFmdGVyIGFuIHVwZGF0ZS5cbiAqXG4gKiBFbnNlbWJsZXMgc3RvcmUgdGhlaXIgZWxlbWVudCByZWZlcmVuY2VzIGluIG1ldGFkYXRhLmVsZW1lbnRzLFxuICogYW5kIG5lZWQgdG8gc3luYyB0aGUgaW50ZXJuYWwgZWxlbWVudHMgYXJyYXkgd2hlbiB0aGF0IGNoYW5nZXMuXG4gKlxuICogSXNzdWUgIzQ2NjogQmVmb3JlIHN5bmNpbmcsIHJlc29sdmUgYW55IG1pc3NpbmcgZWxlbWVudF90eXBlIGZpZWxkc1xuICogYnkgc2VhcmNoaW5nIHRoZSBwb3J0Zm9saW8gdmlhIHRoZSBjb250ZXh0IG1hbmFnZXJzLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVuc2VtYmxlIGVsZW1lbnQgdG8gc3luY1xuICogQHBhcmFtIGlucHV0IC0gVGhlIGlucHV0IG9iamVjdCB0byBjaGVjayBmb3IgZWxlbWVudCB1cGRhdGVzXG4gKiBAcGFyYW0gY29udGV4dCAtIEVsZW1lbnQgQ1JVRCBjb250ZXh0IHdpdGggbWFuYWdlcnMgZm9yIHR5cGUgcmVzb2x1dGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jRW5zZW1ibGVFbGVtZW50c0lmTmVlZGVkKFxuICBlbGVtZW50OiB1bmtub3duLFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbnRleHQ/OiBFbGVtZW50Q3J1ZENvbnRleHRcbik6IFByb21pc2U8UmVzb2x2ZUVsZW1lbnRUeXBlc1Jlc3VsdCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBoYXNFbGVtZW50c1VwZGF0ZSA9IGlucHV0LmVsZW1lbnRzIHx8IChpbnB1dC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmVsZW1lbnRzO1xuXG4gIGlmIChoYXNFbGVtZW50c1VwZGF0ZSAmJiBlbGVtZW50IGluc3RhbmNlb2YgRW5zZW1ibGUpIHtcbiAgICAvLyBJc3N1ZSAjNDY2OiBSZXNvbHZlIG1pc3NpbmcgZWxlbWVudF90eXBlIHZpYSBwb3J0Zm9saW8gbG9va3VwIGJlZm9yZSBzeW5jXG4gICAgaWYgKGNvbnRleHQgJiYgZWxlbWVudC5tZXRhZGF0YS5lbGVtZW50cykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZUVsZW1lbnRUeXBlcyhcbiAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5lbGVtZW50cyxcbiAgICAgICAge1xuICAgICAgICAgIHNraWxsTWFuYWdlcjogY29udGV4dC5za2lsbE1hbmFnZXIsXG4gICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyOiBjb250ZXh0LnRlbXBsYXRlTWFuYWdlcixcbiAgICAgICAgICBhZ2VudE1hbmFnZXI6IGNvbnRleHQuYWdlbnRNYW5hZ2VyLFxuICAgICAgICAgIG1lbW9yeU1hbmFnZXI6IGNvbnRleHQubWVtb3J5TWFuYWdlcixcbiAgICAgICAgICBwZXJzb25hTWFuYWdlcjogY29udGV4dC5wZXJzb25hTWFuYWdlcixcbiAgICAgICAgICBlbnNlbWJsZU1hbmFnZXI6IGNvbnRleHQuZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgZWxlbWVudC5tZXRhZGF0YS5lbGVtZW50cyA9IHJlc3VsdC5yZXNvbHZlZDtcbiAgICAgIGVsZW1lbnQuc3luY0VsZW1lbnRzRnJvbU1ldGFkYXRhKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGVsZW1lbnQuc3luY0VsZW1lbnRzRnJvbU1ldGFkYXRhKCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIYW5kbGUgbWVtb3J5IGVudHJ5IHVwZGF0ZXMgd2l0aCB2YWxpZGF0aW9uIGFuZCBub3JtYWxpemF0aW9uLlxuICpcbiAqIE1lbW9yeSBlbnRyaWVzIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlIHRoZXk6XG4gKiAtIE5lZWQgSUQgZ2VuZXJhdGlvbiBpZiBtaXNzaW5nXG4gKiAtIFJlcXVpcmUgdGltZXN0YW1wIHBhcnNpbmcgYW5kIHZhbGlkYXRpb25cbiAqIC0gVXNlIGEgTWFwIHN0cnVjdHVyZSBpbnRlcm5hbGx5XG4gKlxuICogQHBhcmFtIGVudHJpZXMgLSBBcnJheSBvZiBtZW1vcnkgZW50cmllcyBmcm9tIGlucHV0XG4gKiBAcmV0dXJucyBSZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cywgb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSwgYW5kIG5vcm1hbGl6ZWQgZW50cmllcyBtYXBcbiAqL1xuZnVuY3Rpb24gaGFuZGxlTWVtb3J5RW50cnlVcGRhdGUoZW50cmllczogdW5rbm93bltdKToge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBlbnRyaWVzTWFwOiBNYXA8c3RyaW5nLCB1bmtub3duPjtcbn0ge1xuICBjb25zdCBlbnRyaWVzTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3JzLnB1c2goYEVudHJ5IGF0IGluZGV4ICR7aX0gaXMgbm90IGEgdmFsaWQgb2JqZWN0YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeU9iaiA9IGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGVudHJ5SWQgPSBlbnRyeU9iai5pZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbnRyeUlkKSB7XG4gICAgICBlbnRyeU9iai5pZCA9IGdlbmVyYXRlTWVtb3J5SWQoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gZW50cnlPYmoudGltZXN0YW1wID8gbmV3IERhdGUoZW50cnlPYmoudGltZXN0YW1wIGFzIHN0cmluZykgOiBuZXcgRGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih0aW1lc3RhbXAuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZXN0YW1wJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnlPYmosXG4gICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgdGFnczogQXJyYXkuaXNBcnJheShlbnRyeU9iai50YWdzKSA/IGVudHJ5T2JqLnRhZ3MgOiBbXSxcbiAgICAgICAgbWV0YWRhdGE6IHR5cGVvZiBlbnRyeU9iai5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgZW50cnlPYmoubWV0YWRhdGEgIT09IG51bGwgPyBlbnRyeU9iai5tZXRhZGF0YSA6IHt9XG4gICAgICB9O1xuXG4gICAgICBlbnRyaWVzTWFwLnNldChlbnRyeU9iai5pZCwgbm9ybWFsaXplZEVudHJ5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGVycm9ycy5wdXNoKGBFbnRyeSAnJHtlbnRyeU9iai5pZH0nIGhhcyBpbnZhbGlkIHRpbWVzdGFtcGApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvcnMuam9pbignXFxuJyksIGVudHJpZXNNYXAgfTtcbiAgfVxuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVudHJpZXNNYXAgfTtcbn1cblxuLyoqXG4gKiBFZGl0IGFuIGV4aXN0aW5nIGVsZW1lbnQgdXNpbmcgR3JhcGhRTC1hbGlnbmVkIG5lc3RlZCBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEVsZW1lbnQgQ1JVRCBjb250ZXh0IHdpdGggbWFuYWdlcnNcbiAqIEBwYXJhbSBhcmdzIC0gRWRpdCBhcmd1bWVudHMgKG5hbWUsIHR5cGUsIGlucHV0KVxuICogQHBhcmFtIHZhbGlkYXRpb25TZXJ2aWNlIC0gT3B0aW9uYWwgdmFsaWRhdGlvbiBzZXJ2aWNlIGZvciBESSAoY3JlYXRlcyBkZWZhdWx0IGlmIG5vdCBwcm92aWRlZClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRFbGVtZW50KFxuICBjb250ZXh0OiBFbGVtZW50Q3J1ZENvbnRleHQsXG4gIGFyZ3M6IEVkaXRFbGVtZW50QXJncyxcbiAgdmFsaWRhdGlvblNlcnZpY2U/OiBWYWxpZGF0aW9uU2VydmljZVxuKSB7XG4gIGF3YWl0IGNvbnRleHQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAvLyBVc2UgaW5qZWN0ZWQgdmFsaWRhdGlvbiBzZXJ2aWNlIG9yIGNyZWF0ZSBkZWZhdWx0XG4gIGNvbnN0IHZhbGlkYXRvciA9IHZhbGlkYXRpb25TZXJ2aWNlID8/IG5ldyBWYWxpZGF0aW9uU2VydmljZSgpO1xuXG4gIGNvbnN0IHsgbmFtZSwgdHlwZSwgaW5wdXQgfSA9IGFyZ3M7XG5cbiAgLy8gVmFsaWRhdGUgaW5wdXQgaXMgcHJvdmlkZWRcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgaW5wdXQgb2JqZWN0LiBQcm92aWRlIGZpZWxkcyB0byB1cGRhdGUgYXMgYSBuZXN0ZWQgb2JqZWN0LicpO1xuICB9XG5cbiAgY29uc3QgeyB0eXBlOiBub3JtYWxpemVkVHlwZSB9ID0gbm9ybWFsaXplRWxlbWVudFR5cGVJbnB1dCh0eXBlKTtcblxuICBpZiAoIW5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke2Zvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCgpfWApO1xuICB9XG5cbiAgY29uc3QgbWFuYWdlciA9IGdldE1hbmFnZXJGb3JUeXBlKGNvbnRleHQsIG5vcm1hbGl6ZWRUeXBlKTtcbiAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgY29uc3QgbGFiZWxQbHVyYWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlLCB7IHBsdXJhbDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXJyb3IoYEVsZW1lbnQgdHlwZSAnJHtsYWJlbFBsdXJhbH0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlZGl0aW5nYCk7XG4gIH1cblxuICBjb25zdCBlbGVtZW50ID0gYXdhaXQgcmVzb2x2ZUVsZW1lbnRCeU5hbWUobWFuYWdlciwgbm9ybWFsaXplZFR5cGUsIG5hbWUpO1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICBjb25zdCBsYWJlbCA9IGdldEVsZW1lbnRUeXBlTGFiZWwobm9ybWFsaXplZFR5cGUpO1xuICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcihsYWJlbCwgbmFtZSk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdW5rbm93biBwcm9wZXJ0aWVzIGFuZCBnZW5lcmF0ZSB3YXJuaW5nc1xuICBjb25zdCB1bmtub3duUHJvcGVydHlXYXJuaW5ncyA9IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMoXG4gICAgbm9ybWFsaXplZFR5cGUsXG4gICAgaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTtcblxuICAvLyBBbHNvIHZhbGlkYXRlIG5lc3RlZCBtZXRhZGF0YSBzdWItb2JqZWN0ICh0aGUgdG9wLWxldmVsICdtZXRhZGF0YScga2V5IGlzXG4gIC8vIHNraXBwZWQgYnkgZGV0ZWN0VW5rbm93bk1ldGFkYXRhUHJvcGVydGllcyBhcyBhIHNwZWNpYWwgcm91dGUgZmllbGQsIHNvXG4gIC8vIGRhbmdlcm91cy91bmtub3duIHByb3BlcnRpZXMgaW5zaWRlIGl0IHdvdWxkIGdvIHVuY2hlY2tlZCBvdGhlcndpc2UpXG4gIGlmIChpbnB1dC5tZXRhZGF0YSAmJiB0eXBlb2YgaW5wdXQubWV0YWRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGlucHV0Lm1ldGFkYXRhKSkge1xuICAgIGNvbnN0IG5lc3RlZFdhcm5pbmdzID0gZGV0ZWN0VW5rbm93bk1ldGFkYXRhUHJvcGVydGllcyhcbiAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgaW5wdXQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLnB1c2goLi4ubmVzdGVkV2FybmluZ3MpO1xuICB9XG5cbiAgY29uc3Qgd2FybmluZ1RleHQgPSBmb3JtYXRVbmtub3duUHJvcGVydHlXYXJuaW5ncyh1bmtub3duUHJvcGVydHlXYXJuaW5ncyk7XG5cbiAgaWYgKHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIud2FybihgW2VkaXRFbGVtZW50XSBVbmtub3duIHByb3BlcnRpZXMgZGV0ZWN0ZWRgLCB7XG4gICAgICBlbGVtZW50VHlwZTogbm9ybWFsaXplZFR5cGUsXG4gICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgIHdhcm5pbmdDb3VudDogdW5rbm93blByb3BlcnR5V2FybmluZ3MubGVuZ3RoLFxuICAgICAgdW5rbm93blByb3BlcnRpZXM6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLm1hcCh3ID0+ICh7XG4gICAgICAgIHByb3BlcnR5OiB3LnByb3BlcnR5LFxuICAgICAgICBzdWdnZXN0aW9uOiB3LnN1Z2dlc3Rpb25cbiAgICAgIH0pKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gSXNzdWUgIzE1OTE6IFZhbGlkYXRlIGVsZW1lbnQtc3BlY2lmaWMgY29uc3RyYWludHMgYmVmb3JlIGF0dGVtcHRpbmcgZWRpdHNcbiAgLy8gTWVtb3J5IGNvbnRlbnQgaXMgcmVhZC1vbmx5IChhcHBlbmQtb25seSBhcmNoaXRlY3R1cmUpIC0gcmVqZWN0IGF0dGVtcHRzIHRvIGVkaXQgaXRcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkgJiYgJ2NvbnRlbnQnIGluIGlucHV0KSB7XG4gICAgcmV0dXJuIGVycm9yKFxuICAgICAgYE1lbW9yeSBjb250ZW50IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgZWRpdF9lbGVtZW50LiBgICtcbiAgICAgIGBNZW1vcnkgdXNlcyBhbiBhcHBlbmQtb25seSBhcmNoaXRlY3R1cmUuIGAgK1xuICAgICAgYFVzZSB0aGUgJ2FkZEVudHJ5JyBvcGVyYXRpb24gdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgbWVtb3J5LmBcbiAgICApO1xuICB9XG5cbiAgLy8gSXNzdWUgIzY2MjogVmFsaWRhdGUgZmllbGQgdHlwZXMgYmVmb3JlIGFwcGx5aW5nIChwcmV2ZW50cyBzaWxlbnQgZGF0YSBjb3JydXB0aW9uKVxuICBjb25zdCB0eXBlRXJyb3JzID0gdmFsaWRhdGVGaWVsZFR5cGVzKGlucHV0LCBub3JtYWxpemVkVHlwZSk7XG4gIGlmICh0eXBlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoYEZpZWxkIHR5cGUgdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHt0eXBlRXJyb3JzLm1hcChlID0+IGAgIOKAoiAke2V9YCkuam9pbignXFxuJyl9YCk7XG4gIH1cblxuICBjb25zdCBnYXRla2VlcGVyRXJyb3JzID0gY29sbGVjdEdhdGVrZWVwZXJBdXRob3JpbmdFcnJvcnMoaW5wdXQsIGlucHV0Lm1ldGFkYXRhKTtcbiAgaWYgKGdhdGVrZWVwZXJFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBlcnJvcihmb3JtYXRHYXRla2VlcGVyVmFsaWRhdGlvbk1lc3NhZ2UoZ2F0ZWtlZXBlckVycm9ycykpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc3RyaW5nIGZpZWxkIHZhbHVlcyB1c2luZyBpbmplY3RlZCB2YWxpZGF0b3JcbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVGaWVsZFZhbHVlKHZhbGlkYXRvciwgZmllbGQsIHZhbHVlKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciAnJHtmaWVsZH0nOiAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgdXBkYXRlIG9iamVjdCwgbWFwcGluZyB0b3AtbGV2ZWwgZmllbGRzIHRvIG1ldGFkYXRhIHdoZXJlIGFwcHJvcHJpYXRlXG4gIC8vIElzc3VlICM1NjU6IFVzZSB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHByb3BlcnRpZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNvdXJjZVxuICBjb25zdCBtZXRhZGF0YUZpZWxkcyA9IEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVNbbm9ybWFsaXplZFR5cGVdID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IHVucmVjb2duaXplZEZpZWxkV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYXBwbGllZEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcHBlZEZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBGaWVsZHMgaGFuZGxlZCBieSBkZWRpY2F0ZWQgYnJhbmNoZXMgKG5vdCBtZXRhZGF0YSByb3V0aW5nKVxuICBjb25zdCBzcGVjaWFsUm91dGVGaWVsZHMgPSBuZXcgU2V0KFsnaW5zdHJ1Y3Rpb25zJywgJ2NvbnRlbnQnLCAnZWxlbWVudHMnLCAnbWV0YWRhdGEnLCAnZW50cmllcycsICd2ZXJzaW9uJ10pO1xuXG4gIC8vIENvbnRlbnQgY29udGV4dCBtYXAgc2hhcmVkIGJ5IGluc3RydWN0aW9ucyBhbmQgY29udGVudCB2YWxpZGF0aW9uIGJyYW5jaGVzXG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0TWFwOiBSZWNvcmQ8c3RyaW5nLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIC8vIFNraXAgZGFuZ2Vyb3VzIHByb3BlcnRpZXNcbiAgICBpZiAoREFOR0VST1VTX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgc2tpcHBlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHJlYWQtb25seSBmaWVsZHNcbiAgICBpZiAoUkVBRF9PTkxZX0ZJRUxEUy5oYXMoa2V5KSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gU2tpcHBpbmcgcmVhZC1vbmx5IGZpZWxkOiAke2tleX1gKTtcbiAgICAgIHNraXBwZWRGaWVsZHMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgYnJhbmNoIGJlbG93IGFwcGxpZXMgdGhlIGZpZWxkIOKAlCB0cmFjayBvbmNlIGF0IHRoZSBlbmRcbiAgICBsZXQgZmllbGRBcHBsaWVkID0gdHJ1ZTtcblxuICAgIC8vIE1hcCBrbm93biBtZXRhZGF0YSBmaWVsZHMgYXV0b21hdGljYWxseSAodHlwZS1zcGVjaWZpYylcbiAgICBpZiAobWV0YWRhdGFGaWVsZHMuaGFzKGtleSkgJiYgIXNwZWNpYWxSb3V0ZUZpZWxkcy5oYXMoa2V5KSkge1xuICAgICAgaWYgKCF1cGRhdGVPYmoubWV0YWRhdGEpIHtcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICAodXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdlbGVtZW50cycgJiYgbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAvLyBJc3N1ZSAjNjU4OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGVsZW1lbnRzIGlucHV0IChhcnJheSBvciBkaWN0IGZvcm1hdClcbiAgICAgIGNvbnN0IGVsZW1FcnJvciA9IGFwcGx5RW5zZW1ibGVFbGVtZW50c1VwZGF0ZSh2YWx1ZSwgZWxlbWVudCwgdXBkYXRlT2JqLCBjb2xsZWN0aW9uV2FybmluZ3MpO1xuICAgICAgaWYgKGVsZW1FcnJvcikgcmV0dXJuIGVycm9yKGVsZW1FcnJvcik7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdtZXRhZGF0YScgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVZhbHVlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIElmIG1ldGFkYXRhLmVsZW1lbnRzIGlzIHByb3ZpZGVkIGZvciBhbiBlbnNlbWJsZSwgZXh0cmFjdCBhbmQgcm91dGUgdGhyb3VnaFxuICAgICAgLy8gdGhlIGVuc2VtYmxlIGVsZW1lbnRzIGhhbmRsZXIgZm9yIHByb3BlciB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24vbWVyZ2UuXG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFICYmIG1ldGFWYWx1ZS5lbGVtZW50cykge1xuICAgICAgICBjb25zdCBlbGVtRXJyb3IgPSBhcHBseUVuc2VtYmxlRWxlbWVudHNVcGRhdGUobWV0YVZhbHVlLmVsZW1lbnRzLCBlbGVtZW50LCB1cGRhdGVPYmosIGNvbGxlY3Rpb25XYXJuaW5ncyk7XG4gICAgICAgIGlmIChlbGVtRXJyb3IpIHJldHVybiBlcnJvcihlbGVtRXJyb3IpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIHZhbHVlIGJlZm9yZSBkZWVwIG1lcmdlIHRvIGF2b2lkIGRvdWJsZS1wcm9jZXNzaW5nXG4gICAgICAgIGNvbnN0IHsgZWxlbWVudHM6IF9leHRyYWN0ZWQsIC4uLnJlc3RNZXRhZGF0YSB9ID0gbWV0YVZhbHVlO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzdE1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgcmVzdE1ldGFkYXRhLFxuICAgICAgICAgICAgTUVSR0VfT1BUSU9OU1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1lcmdlIG5lc3RlZCBtZXRhZGF0YSB3aXRoIHNlY3VyaXR5IG9wdGlvbnNcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICh1cGRhdGVPYmoubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIG1ldGFWYWx1ZSxcbiAgICAgICAgICBNRVJHRV9PUFRJT05TXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdpbnN0cnVjdGlvbnMnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM2MDIgcmVzb2x2ZWQ6ICdpbnN0cnVjdGlvbnMnIGlzIGEgZmlyc3QtY2xhc3MgZmllbGQgKGJlaGF2aW9yYWwgZGlyZWN0aXZlcylcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgY29udGVudENvbnRleHQ6IGNvbnRlbnRDb250ZXh0TWFwW25vcm1hbGl6ZWRUeXBlXVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgLy8gU2V0IGluc3RydWN0aW9ucyBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEZvciBhZ2VudHMsIGFsc28gdXBkYXRlIGV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXNzdWUgIzU4NS8jNjAyOiBIYW5kbGUgY29udGVudCB1cGRhdGVzIChyZWZlcmVuY2UgbWF0ZXJpYWwpXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIGNvbnRlbnRDb250ZXh0OiBjb250ZW50Q29udGV4dE1hcFtub3JtYWxpemVkVHlwZV1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICAvLyBTZXQgY29udGVudCBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmNvbnRlbnQgPSBzYW5pdGl6ZWRDb250ZW50O1xuICAgIH0gZWxzZSBpZiAoc3BlY2lhbFJvdXRlRmllbGRzLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTcGVjaWFsIHJvdXRlIGZpZWxkIOKAlCBoYW5kbGVkIGVsc2V3aGVyZSwgc2tpcFxuICAgICAgZmllbGRBcHBsaWVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICM1NjU6IEZpZWxkIG5vdCBpbiB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHNldCBhbmQgbm90IGEgc3BlY2lhbCByb3V0ZSDigJRcbiAgICAgIC8vIHN0aWxsIHJvdXRlIHRvIHVwZGF0ZU9iaiBmb3IgYmFja3dhcmQgY29tcGF0LCBidXQgd2FybiB0aGF0IGl0IG1heSBub3QgcGVyc2lzdFxuICAgICAgdXBkYXRlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MucHVzaChcbiAgICAgICAgYEZpZWxkICcke2tleX0nIGlzIG5vdCBhIHJlY29nbml6ZWQgbWV0YWRhdGEgcHJvcGVydHkgZm9yICR7Z2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSl9IOKAlCBpdCBtYXkgbm90IHBlcnNpc3QgYWZ0ZXIgc2F2ZS5gXG4gICAgICApO1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5yZWNvZ25pemVkIGZpZWxkICcke2tleX0nIGZvciAke25vcm1hbGl6ZWRUeXBlfSwgcm91dGluZyB0byBlbGVtZW50IG9iamVjdGAsIHtcbiAgICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChmaWVsZEFwcGxpZWQpIHtcbiAgICAgIGFwcGxpZWRGaWVsZHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZXAgbWVyZ2UgdGhlIHVwZGF0ZSBpbnRvIHRoZSBlbGVtZW50IHdpdGggc2VjdXJpdHkgb3B0aW9uc1xuICBjb25zdCBlbGVtZW50RGF0YSA9IGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbWVyZ2VkRGF0YSA9IGRlZXBNZXJnZShlbGVtZW50RGF0YSwgdXBkYXRlT2JqLCBNRVJHRV9PUFRJT05TKTtcblxuICAvLyBBcHBseSBtZXJnZWQgZGF0YSBiYWNrIHRvIGVsZW1lbnRcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWVyZ2VkRGF0YSkpIHtcbiAgICBpZiAoa2V5ICE9PSAnbWV0YWRhdGEnKSB7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgbWV0YWRhdGEgc2VwYXJhdGVseSB0byBwcmVzZXJ2ZSBlbGVtZW50IHN0cnVjdHVyZVxuICBpZiAobWVyZ2VkRGF0YS5tZXRhZGF0YSAmJiBlbGVtZW50Lm1ldGFkYXRhKSB7XG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50Lm1ldGFkYXRhLCBtZXJnZWREYXRhLm1ldGFkYXRhKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtZW1vcnkgZW50cmllcyBzcGVjaWFsbHkgKGV4dHJhY3RlZCBmb3IgY2xhcml0eSlcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkgJiYgaW5wdXQuZW50cmllcyAmJiBBcnJheS5pc0FycmF5KGlucHV0LmVudHJpZXMpKSB7XG4gICAgY29uc3QgbWVtb3J5UmVzdWx0ID0gaGFuZGxlTWVtb3J5RW50cnlVcGRhdGUoaW5wdXQuZW50cmllcyk7XG4gICAgaWYgKCFtZW1vcnlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIGVycm9yKGBNZW1vcnkgZW50cnkgdmFsaWRhdGlvbiBlcnJvcnM6XFxuJHttZW1vcnlSZXN1bHQubWVzc2FnZX1cXG5cXG5WYWxpZCBlbnRyaWVzIHdlcmUgc2F2ZWQuYCk7XG4gICAgfVxuICAgIChlbGVtZW50IGFzIGFueSkuZW50cmllcyA9IG1lbW9yeVJlc3VsdC5lbnRyaWVzTWFwO1xuICB9XG5cbiAgLy8gU3luYyBlbnNlbWJsZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIChleHRyYWN0ZWQgZm9yIGNsYXJpdHkpXG4gIC8vIElzc3VlICM0NjY6IFJlc29sdmUgZWxlbWVudF90eXBlIHZpYSBwb3J0Zm9saW8gbG9va3VwIGJlZm9yZSBzeW5jLCBzdXJmYWNlIHdhcm5pbmdzXG4gIGxldCByZXNvbHV0aW9uV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBhd2FpdCBzeW5jRW5zZW1ibGVFbGVtZW50c0lmTmVlZGVkKGVsZW1lbnQsIGlucHV0LCBjb250ZXh0KTtcbiAgICBpZiAocmVzb2x1dGlvblJlc3VsdCkge1xuICAgICAgcmVzb2x1dGlvbldhcm5pbmdUZXh0ID0gZm9ybWF0RWxlbWVudFJlc29sdXRpb25XYXJuaW5ncyhyZXNvbHV0aW9uUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXggIzkxMTogTm9ybWFsaXplIG1ldGFkYXRhIGFmdGVyIG1lcmdlIHRvIGVuc3VyZSBzdHJ1Y3R1cmFsIGNvbnNpc3RlbmN5LlxuICAvLyBCYXNlRWxlbWVudCBjb25zdHJ1Y3RvciBydW5zIG5vcm1hbGl6ZU1ldGFkYXRhIG9uIGNyZWF0ZS9sb2FkLCBidXQgdGhlIGVkaXQgcGF0aFxuICAvLyBtb2RpZmllcyBtZXRhZGF0YSBpbi1wbGFjZS4gVGhpcyBlbnN1cmVzIGVzc2VudGlhbCBkZWZhdWx0cyBzdXJ2aXZlIGVkaXRzLlxuICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgIGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz89ICcnO1xuICAgIGVsZW1lbnQubWV0YWRhdGEudGFncyA/Pz0gW107XG4gICAgLy8gVXBkYXRlIG1vZGlmaWVkIHRpbWVzdGFtcFxuICAgIGVsZW1lbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgdmVyc2lvbiB1cGRhdGVzXG4gIGlmIChpbnB1dC52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVWZXJzaW9uRXhwbGljaXQoZWxlbWVudCwgU3RyaW5nKGlucHV0LnZlcnNpb24pKTtcbiAgICBpZiAoIXVwZGF0ZS5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gZXJyb3IodXBkYXRlLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50KTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBmaWxlIHBhdGggZm9yIHNhdmluZ1xuICBjb25zdCBmaWxlUGF0aENhbmRpZGF0ZSA9IHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoKClcbiAgICA6ICgoZWxlbWVudCBhcyBhbnkpLmZpbGVQYXRoIHx8IChlbGVtZW50IGFzIGFueSkuZmlsZW5hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHR5cGVvZiBmaWxlUGF0aENhbmRpZGF0ZSA9PT0gJ3N0cmluZycgJiYgZmlsZVBhdGhDYW5kaWRhdGUubGVuZ3RoID4gMFxuICAgID8gZmlsZVBhdGhDYW5kaWRhdGVcbiAgICA6IGdldEVsZW1lbnRGaWxlbmFtZShub3JtYWxpemVkVHlwZSwgZWxlbWVudC5tZXRhZGF0YT8ubmFtZSB8fCBuYW1lKTtcblxuICB0cnkge1xuICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShlbGVtZW50LCBmaWxlbmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBlcnJvcihgRmFpbGVkIHRvIHNhdmUgZWxlbWVudDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKTtcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBlbGVtZW50Lm1ldGFkYXRhPy5uYW1lIHx8IG5hbWU7XG4gIGNvbnN0IHVwZGF0ZWRGaWVsZHMgPSBhcHBsaWVkRmllbGRzLmpvaW4oJywgJyk7XG5cbiAgLy8gSXNzdWUgIzE2NTY6IElmIGFsbCBmaWVsZHMgd2VyZSBzaWxlbnRseSBza2lwcGVkLCByZXBvcnQgaG9uZXN0bHlcbiAgaWYgKGFwcGxpZWRGaWVsZHMubGVuZ3RoID09PSAwICYmIHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGDimqDvuI8gTm8gZmllbGRzIGFwcGxpZWQgdG8gJHtsYWJlbH0gJyR7ZGlzcGxheU5hbWV9Jy4gYCArXG4gICAgICAgICAgYFNraXBwZWQ6ICR7c2tpcHBlZEZpZWxkcy5qb2luKCcsICcpfSAoZGFuZ2Vyb3VzIG9yIHJlYWQtb25seSBmaWVsZHMgYXJlIG5vdCBlZGl0YWJsZSkuYFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gSXNzdWUgIzU2NTogSW5jbHVkZSB3YXJuaW5ncyBmb3IgdW5yZWNvZ25pemVkIGZpZWxkcyBpbiByZXNwb25zZVxuICBsZXQgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmVzID0gWyfimqDvuI8gKipVbnJlY29nbml6ZWQgRmllbGQgV2FybmluZ3M6KionXTtcbiAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgdW5yZWNvZ25pemVkRmllbGRXYXJuaW5ncykge1xuICAgICAgbGluZXMucHVzaChgICAg4oCiICR7d2FybmluZ31gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IEluY2x1ZGUgY29sbGVjdGlvbiBvcGVyYXRpb24gd2FybmluZ3NcbiAgbGV0IGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9ICcnO1xuICBpZiAoY29sbGVjdGlvbldhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5lcyA9IFsn4pqg77iPICoqQ29sbGVjdGlvbiBXYXJuaW5nczoqKiddO1xuICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBjb2xsZWN0aW9uV2FybmluZ3MpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgIOKAoiAke3dhcm5pbmd9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8gSXNzdWUgIzE2NTY6IFJlcG9ydCBza2lwcGVkIGZpZWxkcyBzbyBMTE1zIGRvbid0IGFzc3VtZSB0aGV5IHdlcmUgYXBwbGllZFxuICBjb25zdCBza2lwcGVkVGV4dCA9IHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMFxuICAgID8gYFxcbuKaoO+4jyBTa2lwcGVkOiAke3NraXBwZWRGaWVsZHMuam9pbignLCAnKX0gKGRhbmdlcm91cyBvciByZWFkLW9ubHkpYFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdGV4dDogYCR7d2FybmluZ1RleHR9JHtyZXNvbHV0aW9uV2FybmluZ1RleHR9JHt1bnJlY29nbml6ZWRXYXJuaW5nVGV4dH0ke2NvbGxlY3Rpb25XYXJuaW5nVGV4dH3inIUgVXBkYXRlZCAke2xhYmVsfSAnJHtkaXNwbGF5TmFtZX0nIC0gZmllbGRzOiAke3VwZGF0ZWRGaWVsZHN9JHtza2lwcGVkVGV4dH1gXG4gICAgfV1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IGDinYwgJHttZXNzYWdlfWBcbiAgICB9XVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyRm9yVHlwZShjb250ZXh0OiBFbGVtZW50Q3J1ZENvbnRleHQsIHR5cGU6IEVsZW1lbnRUeXBlKTogRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PiB8IG51bGwge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICByZXR1cm4gY29udGV4dC5wZXJzb25hTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxhbnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICByZXR1cm4gY29udGV4dC5za2lsbE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8U2tpbGw+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICByZXR1cm4gY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8VGVtcGxhdGU+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICByZXR1cm4gY29udGV4dC5hZ2VudE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8QWdlbnQ+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOlxuICAgICAgcmV0dXJuIGNvbnRleHQubWVtb3J5TWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxNZW1vcnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6XG4gICAgICByZXR1cm4gY29udGV4dC5lbnNlbWJsZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkV4cGxpY2l0KGVsZW1lbnQ6IGFueSwgdmVyc2lvblN0cmluZzogc3RyaW5nKSB7XG4gIGNvbnN0IGlzVmFsaWQgPSAvXihcXGQrKShcXC5cXGQrKT8oXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2ZXJzaW9uU3RyaW5nKTtcbiAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEludmFsaWQgdmVyc2lvbiBmb3JtYXQ6ICcke3ZlcnNpb25TdHJpbmd9Jy4gUGxlYXNlIHVzZSBmb3JtYXQgbGlrZSAxLjAuMCwgMS4wLCBvciAxYFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGVsZW1lbnQudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50OiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBpZiAoZWxlbWVudC52ZXJzaW9uKSB7XG4gICAgICAvLyBGaXJzdCBub3JtYWxpemUgdGhlIHZlcnNpb24gdG8gMy1wYXJ0IGZvcm1hdCAoaGFuZGxlcyBsZWdhY3kgMi1wYXJ0IHZlcnNpb25zKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKGVsZW1lbnQudmVyc2lvbikpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnNcbiAgICAgIGNvbnN0IHByZVJlbGVhc2VNYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL14oXFxkK1xcLlxcZCtcXC5cXGQrKSgtKFthLXpBLVowLTkuLV0rKSk/JC8pO1xuXG4gICAgICBpZiAocHJlUmVsZWFzZU1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VWZXJzaW9uID0gcHJlUmVsZWFzZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBwcmVSZWxlYXNlVGFnID0gcHJlUmVsZWFzZU1hdGNoWzNdO1xuXG4gICAgICAgIGlmIChwcmVSZWxlYXNlVGFnKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHByZS1yZWxlYXNlIHZlcnNpb24gKGUuZy4sIFwiMS4wLjAtYmV0YS4xXCIg4oaSIFwiMS4wLjAtYmV0YS4yXCIpXG4gICAgICAgICAgY29uc3QgcHJlUmVsZWFzZU51bWJlck1hdGNoID0gcHJlUmVsZWFzZVRhZy5tYXRjaCgvXihbYS16QS1aXSspXFwuPyhcXGQrKT8kLyk7XG4gICAgICAgICAgaWYgKHByZVJlbGVhc2VOdW1iZXJNYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgcHJlUmVsZWFzZVR5cGUgPSBwcmVSZWxlYXNlTnVtYmVyTWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlTnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHByZVJlbGVhc2VOdW1iZXJNYXRjaFsyXSB8fCAnMCcpICsgMTtcbiAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IGAke2Jhc2VWZXJzaW9ufS0ke3ByZVJlbGVhc2VUeXBlfS4ke3ByZVJlbGVhc2VOdW1iZXJ9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gcHJlLXJlbGVhc2UgbnVtYmVyLCBidW1wIHBhdGNoXG4gICAgICAgICAgICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBiYXNlVmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0YW5kYXJkIHZlcnNpb24sIGJ1bXAgcGF0Y2ggKGUuZy4sIFwiMS4wLjBcIiDihpIgXCIxLjAuMVwiKVxuICAgICAgICAgIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IGJhc2VWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3VsZG4ndCByZWFjaCBoZXJlIGFmdGVyIG5vcm1hbGl6YXRpb24sIGJ1dCBmYWxsYmFjayB0byBzYWZlIGRlZmF1bHRcbiAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gJzEuMC4xJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gdmVyc2lvbiwgc3RhcnQgYXQgMS4wLjBcbiAgICAgIGVsZW1lbnQudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgfVxuXG4gICAgLy8gU3luYyB2ZXJzaW9uIHRvIG1ldGFkYXRhXG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IGVsZW1lbnQudmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYXV0by1pbmNyZW1lbnQgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gIH1cbn1cbiJdfQ==
839
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdEVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBNEIsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEdBQ2xDLE1BQU0sY0FBYyxDQUFDO0FBaUN0QixnRUFBZ0U7QUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixJQUFJO0lBQ0osTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLFNBQThCO0lBQzlELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQ3pDLEtBQUssYUFBYTtZQUNoQixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRCxLQUFLLFNBQVM7WUFDWixPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztRQUM1QyxLQUFLLFVBQVU7WUFDYixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGdCQUFnQixHQUlqQjtJQUNILHVDQUF1QztJQUN2QyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3RFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDMUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN6RSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMvRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQy9FLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ25FLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzVELFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2xFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzlELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzdELHNFQUFzRTtJQUN0RSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtJQUM1SSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJ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QU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNraWxsIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvc2tpbGxzL1NraWxsLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlLmpzJztcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50LmpzJztcbmltcG9ydCB7IE1lbW9yeSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcyc7XG5pbXBvcnQgeyBFbnNlbWJsZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudElucHV0IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZW5zZW1ibGVzL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRDcnVkQ29udGV4dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNZW1vcnlJZCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL3V0aWxzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVWZXJzaW9uIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UsIHR5cGUgVmFsaWRhdGlvbkZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IGRlZXBNZXJnZSwgREFOR0VST1VTX1BST1BFUlRJRVMgfSBmcm9tICcuLi8uLi91dGlscy9kZWVwTWVyZ2UuanMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplRWxlbWVudFR5cGVJbnB1dCxcbiAgZm9ybWF0VmFsaWRFbGVtZW50VHlwZXNMaXN0LFxuICBnZXRFbGVtZW50RmlsZW5hbWUsXG4gIGdldEVsZW1lbnRUeXBlTGFiZWwsXG4gIHJlc29sdmVFbGVtZW50QnlOYW1lLFxuICBFbGVtZW50TWFuYWdlck9wZXJhdGlvbnMsXG4gIEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVMsXG4gIGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMsXG4gIGZvcm1hdFVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLFxuICBmb3JtYXRFbGVtZW50UmVzb2x1dGlvbldhcm5pbmdzLFxuICBjb2xsZWN0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyxcbiAgZm9ybWF0R2F0ZWtlZXBlclZhbGlkYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRWxlbWVudFR5cGVzUmVzdWx0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5cbnR5cGUgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8VD4gPSBFbGVtZW50TWFuYWdlck9wZXJhdGlvbnM8VD4gJiB7XG4gIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGRlbGV0ZT8oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIEdyYXBoUUwtYWxpZ25lZCBpbnB1dCBmb3IgZWRpdGluZyBlbGVtZW50cy5cbiAqIFVzZXMgbmVzdGVkIG9iamVjdHMgKGxpa2UgY3JlYXRlX2VsZW1lbnQpIGluc3RlYWQgb2YgTW9uZ29EQi1zdHlsZSBkb3Qgbm90YXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVwZGF0ZSBkZXNjcmlwdGlvbiBhbmQgbmVzdGVkIG1ldGFkYXRhXG4gKiB7XG4gKiAgIG5hbWU6IFwibXktc2tpbGxcIixcbiAqICAgdHlwZTogXCJza2lsbHNcIixcbiAqICAgaW5wdXQ6IHtcbiAqICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGVkIGRlc2NyaXB0aW9uXCIsXG4gKiAgICAgbWV0YWRhdGE6IHtcbiAqICAgICAgIHRyaWdnZXJzOiBbXCJjb2RlXCIsIFwicmV2aWV3XCJdLFxuICogICAgICAgc2V0dGluZ3M6IHsgdGhlbWU6IFwiZGFya1wiIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0RWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgLyoqIE5lc3RlZCBpbnB1dCBvYmplY3QgLSBmaWVsZHMgYXJlIGRlZXAtbWVyZ2VkIHdpdGggZXhpc3RpbmcgZWxlbWVudCAqL1xuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIFJlYWQtb25seSBmaWVsZHMgdGhhdCBjYW5ub3QgYmUgbW9kaWZpZWQgdGhyb3VnaCB0aGUgZWRpdCBBUElcbmNvbnN0IFJFQURfT05MWV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ2lkJyxcbiAgJ3R5cGUnLFxuICAnZmlsZVBhdGgnLFxuICAnZmlsZW5hbWUnLFxuICAnX3N0YXR1cycsXG4gICdfaXNEaXJ0eSdcbl0pO1xuXG5mdW5jdGlvbiBnZXRNYXhMZW5ndGhGb3JGaWVsZFR5cGUoZmllbGRUeXBlOiBWYWxpZGF0aW9uRmllbGRUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICBjYXNlICduYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIO1xuICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDtcbiAgICBjYXNlICdjb250ZW50JzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIO1xuICAgIGNhc2UgJ2ZpbGVuYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDtcbiAgfVxufVxuXG4vKipcbiAqIElzc3VlICM2NjI6IFN5c3RlbWF0aWMgZmllbGQgdHlwZSB2YWxpZGF0aW9uIGF0IHRoZSBlZGl0RWxlbWVudCBib3VuZGFyeS5cbiAqXG4gKiBEZWZpbmVzIGV4cGVjdGVkIHR5cGVzIGZvciBrbm93biBtZXRhZGF0YSBmaWVsZHMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzLlxuICogUHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbiB3aGVuIExMTXMgc2VuZCB3cm9uZyB0eXBlcyAoZS5nLiwgZGljdCBpbnN0ZWFkIG9mIGFycmF5KS5cbiAqXG4gKiBLZXk6IGZpZWxkIG5hbWUsIFZhbHVlOiB7IGV4cGVjdGVkOiB0eXBlIGRlc2NyaXB0aW9uLCBjaGVjazogdmFsaWRhdG9yIGZ1bmN0aW9uIH1cbiAqL1xuY29uc3QgRklFTERfVFlQRV9SVUxFUzogUmVjb3JkPHN0cmluZywge1xuICBleHBlY3RlZDogc3RyaW5nO1xuICBjaGVjazogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBlbGVtZW50VHlwZXM/OiBFbGVtZW50VHlwZVtdO1xufT4gPSB7XG4gIC8vIEFycmF5IGZpZWxkcyAoYWNyb3NzIG11bHRpcGxlIHR5cGVzKVxuICB0YWdzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICB0cmlnZ2VyczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZG9tYWluczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZXhhbXBsZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBwcmVyZXF1aXNpdGVzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBjYXBhYmlsaXRpZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBnb2FsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGNvbnN0cmFpbnRzOiB7IGV4cGVjdGVkOiAnYXJyYXknLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgYWN0aW9uczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIHNraWxsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIC8vIElzc3VlICM3MjQ6IGFjdGl2YXRlcyBhbmQgdG9vbHMgYXJlIG9iamVjdHMgZm9yIGFnZW50cyAobm90IGFycmF5cylcbiAgYWN0aXZhdGVzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHRvb2xzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHZhcmlhYmxlczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5URU1QTEFURV0gfSxcbiAgZW50cmllczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5NRU1PUlldIH0sXG4gIC8vIGVsZW1lbnRzIGhhbmRsZWQgc2VwYXJhdGVseSBieSB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHMgKGFjY2VwdHMgZGljdCB0b28pXG5cbiAgLy8gT2JqZWN0IGZpZWxkc1xuICBnb2FsOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIGF1dG9ub215OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHJlc2lsaWVuY2U6IHsgZXhwZWN0ZWQ6ICdvYmplY3QnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5BR0VOVF0gfSxcbiAgZ2F0ZWtlZXBlcjogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikgfSxcbiAgcmV0ZW50aW9uUG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICByZXRlbnRpb25fcG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuXG4gIC8vIFN0cmluZyBmaWVsZHNcbiAgLy8gSXNzdWUgIzcyNDogc3lzdGVtUHJvbXB0IHdhcyBtaXNzaW5nIGZyb20gZmllbGQgdHlwZSBydWxlcy5cbiAgLy8gQm90aCBjYW1lbENhc2UgYW5kIHNuYWtlX2Nhc2UgdmFyaWFudHMgYWNjZXB0ZWQgYmVjYXVzZSBMTE1zIGZyZXF1ZW50bHlcbiAgLy8gcGFzcyBzbmFrZV9jYXNlIGtleXM7IG5vcm1hbGl6YXRpb24gdG8gY2FtZWxDYXNlIGhhcHBlbnMgZG93bnN0cmVhbSBpblxuICAvLyBBZ2VudE1hbmFnZXIucGFyc2VNZXRhZGF0YSgpIChJc3N1ZSAjNzIyKS5cbiAgc3lzdGVtUHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBzeXN0ZW1fcHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBuYW1lOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgZGVzY3JpcHRpb246IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICBhdXRob3I6IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICB2ZXJzaW9uOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHYgPT09ICdudW1iZXInIH0sXG4gIGNhdGVnb3J5OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgZG9tYWluOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgdG9uZTogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG5cbiAgLy8gTnVtYmVyIGZpZWxkc1xuICBtYXhFbnRyaWVzOiB7IGV4cGVjdGVkOiAnbnVtYmVyJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcbiAgbWF4X2VudHJpZXM6IHsgZXhwZWN0ZWQ6ICdudW1iZXInLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJywgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICBwcmlvcml0eTogeyBleHBlY3RlZDogJ251bWJlcicsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIH0sXG59O1xuXG4vKipcbiAqIElzc3VlICM2NjI6IFZhbGlkYXRlIGZpZWxkIHR5cGVzIGluIGlucHV0IGJlZm9yZSBhcHBseWluZyB0byBlbGVtZW50LlxuICpcbiAqIENoZWNrcyBlYWNoIGZpZWxkIGluIHRoZSBpbnB1dCBhZ2FpbnN0IGBGSUVMRF9UWVBFX1JVTEVTYC4gRmllbGRzIG5vdCBpbiB0aGVcbiAqIHJ1bGVzIG1hcCBhcmUgc2tpcHBlZCAodGhleSdsbCBiZSBjYXVnaHQgYnkgdW5rbm93bi1wcm9wZXJ0eSBkZXRlY3Rpb24gbGF0ZXIpLlxuICogRWxlbWVudC10eXBlLXNjb3BlZCBydWxlcyBvbmx5IGFwcGx5IHdoZW4gdGhlIHRhcmdldCB0eXBlIG1hdGNoZXMuXG4gKlxuICogQHBhcmFtIGlucHV0IC0gVGhlIGVkaXQgaW5wdXQgb2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBUaGUgbm9ybWFsaXplZCBlbGVtZW50IHR5cGUgYmVpbmcgZWRpdGVkXG4gKiBAcmV0dXJucyBBcnJheSBvZiBlcnJvciBtZXNzYWdlcyBmb3IgZmllbGRzIHdpdGggd3JvbmcgdHlwZXMgKGVtcHR5IGlmIGFsbCB2YWxpZClcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWVsZFR5cGVzKFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICBjb25zdCBydWxlID0gRklFTERfVFlQRV9SVUxFU1tmaWVsZF07XG4gICAgaWYgKCFydWxlKSBjb250aW51ZTtcblxuICAgIC8vIFNraXAgaWYgcnVsZSBkb2Vzbid0IGFwcGx5IHRvIHRoaXMgZWxlbWVudCB0eXBlXG4gICAgaWYgKHJ1bGUuZWxlbWVudFR5cGVzICYmICFydWxlLmVsZW1lbnRUeXBlcy5pbmNsdWRlcyhlbGVtZW50VHlwZSkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKCFydWxlLmNoZWNrKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnB1c2goYEZpZWxkICcke2ZpZWxkfScgZXhwZWN0cyAke3J1bGUuZXhwZWN0ZWR9LCBnb3QgJHtBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLy8gTWVyZ2Ugb3B0aW9ucyBmb3Igc2VjdXJlIGRlZXAgbWVyZ2luZ1xuY29uc3QgTUVSR0VfT1BUSU9OUyA9IHtcbiAgc2tpcFByb3BlcnRpZXM6IERBTkdFUk9VU19QUk9QRVJUSUVTLFxuICByZWFkT25seUZpZWxkczogUkVBRF9PTkxZX0ZJRUxEU1xufTtcblxuLyoqXG4gKiBNYXAgZmllbGQgbmFtZXMgdG8gdGhlaXIgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbiBmaWVsZCB0eXBlcy5cbiAqIFRoaXMgZW5zdXJlcyBjb25zaXN0ZW50IHZhbGlkYXRpb24gYmV0d2VlbiBlZGl0IChpbnB1dCkgYW5kIGxvYWQgKG91dHB1dCkuXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkVHlwZUZvclZhbGlkYXRpb24oZmllbGROYW1lOiBzdHJpbmcpOiBWYWxpZGF0aW9uRmllbGRUeXBlIHwgbnVsbCB7XG4gIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lIChoYW5kbGUgYm90aCAnZGVzY3JpcHRpb24nIGFuZCAnbWV0YWRhdGEuZGVzY3JpcHRpb24nKVxuICBjb25zdCBub3JtYWxpemVkRmllbGQgPSBmaWVsZE5hbWUucmVwbGFjZSgvXm1ldGFkYXRhXFwuLywgJycpO1xuXG4gIHN3aXRjaCAobm9ybWFsaXplZEZpZWxkKSB7XG4gICAgY2FzZSAnbmFtZSc6XG4gICAgICByZXR1cm4gJ25hbWUnO1xuICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgIHJldHVybiAnZGVzY3JpcHRpb24nO1xuICAgIGNhc2UgJ2NvbnRlbnQnOlxuICAgICAgcmV0dXJuICdjb250ZW50JztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHNwZWNpYWwgdmFsaWRhdGlvbiBuZWVkZWRcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXQgb24gYW4gZWxlbWVudC5cbiAqIFJldHVybnMgbnVsbCBpZiB2YWxpZCwgb3IgYW4gZXJyb3IgbWVzc2FnZSBpZiBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSB2YWxpZGF0aW9uU2VydmljZSAtIEluamVjdGVkIHZhbGlkYXRpb24gc2VydmljZSBmb3IgdGVzdGFiaWxpdHlcbiAqIEBwYXJhbSBmaWVsZCAtIFRoZSBmaWVsZCBuYW1lIGJlaW5nIHZhbGlkYXRlZFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGRWYWx1ZShcbiAgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIE9ubHkgdmFsaWRhdGUgc3RyaW5nIHZhbHVlcyBmb3IgdGV4dCBmaWVsZHNcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gTm9uLXN0cmluZyB2YWx1ZXMgKGFycmF5cywgb2JqZWN0cywgYm9vbGVhbnMsIG51bWJlcnMpIHNraXAgdGV4dCB2YWxpZGF0aW9uXG4gIH1cblxuICBjb25zdCBmaWVsZFR5cGUgPSBnZXRGaWVsZFR5cGVGb3JWYWxpZGF0aW9uKGZpZWxkKTtcbiAgaWYgKCFmaWVsZFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gTm8gdmFsaWRhdGlvbiBydWxlcyBmb3IgdGhpcyBmaWVsZFxuICB9XG5cbiAgY29uc3QgbWF4TGVuZ3RoID0gZ2V0TWF4TGVuZ3RoRm9yRmllbGRUeXBlKGZpZWxkVHlwZSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KHZhbHVlLCB7XG4gICAgbWF4TGVuZ3RoLFxuICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgIGZpZWxkVHlwZVxuICB9KTtcblxuICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJykgfHwgJ1ZhbGlkYXRpb24gZmFpbGVkJztcbiAgfVxuXG4gIHJldHVybiBudWxsOyAvLyBWYWxpZFxufVxuXG5pbnRlcmZhY2UgT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZCB7XG4gIHBhdGg6IHN0cmluZztcbiAgbGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG50eXBlIFRyYXZlcnNhbEVudHJ5ID0gcmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl07XG5cbmZ1bmN0aW9uIGdldFRyYXZlcnNhbEVudHJpZXModmFsdWU6IG9iamVjdCwgcGF0aDogc3RyaW5nKTogVHJhdmVyc2FsRW50cnlbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBbYCR7cGF0aH1bJHtpbmRleH1dYCwgaXRlbV0gYXMgY29uc3QpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBbYCR7cGF0aH0uJHtrZXl9YCwgaXRlbV0gYXMgY29uc3QpO1xufVxuXG5mdW5jdGlvbiBnZXREZXNjcmlwdGlvbk1heExlbmd0aEZvclBhdGgoZmllbGRQYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoZmllbGRQYXRoID09PSAnaW5wdXQuZGVzY3JpcHRpb24nIHx8IGZpZWxkUGF0aCA9PT0gJ2lucHV0Lm1ldGFkYXRhLmRlc2NyaXB0aW9uJykge1xuICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDtcbiAgfVxuXG4gIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RPQ1VNRU5UQVRJT05fRklFTERfTEVOR1RIO1xufVxuXG5mdW5jdGlvbiBpc092ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGRQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gZ2V0RGVzY3JpcHRpb25NYXhMZW5ndGhGb3JQYXRoKGZpZWxkUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZmllbGRQYXRoLmVuZHNXaXRoKCcuZGVzY3JpcHRpb24nKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0T3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZChmaWVsZDogT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZCk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgYCAg4oCiICR7ZmllbGQucGF0aH0gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiBgICtcbiAgICBgJHtmaWVsZC5tYXhMZW5ndGh9IGNoYXJhY3RlcnMgKCR7ZmllbGQubGVuZ3RofSlgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZpbmRPdmVyc2l6ZWREZXNjcmlwdGlvbkZpZWxkcyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhdGggPSAnaW5wdXQnLFxuICBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpLFxuKTogT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZFtdIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHNlZW4uYWRkKHZhbHVlKTtcblxuICBjb25zdCBvdmVyc2l6ZWQ6IE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWVsZFBhdGgsIGl0ZW1dIG9mIGdldFRyYXZlcnNhbEVudHJpZXModmFsdWUsIHBhdGgpKSB7XG4gICAgaWYgKGlzT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZChmaWVsZFBhdGgsIGl0ZW0pKSB7XG4gICAgICBvdmVyc2l6ZWQucHVzaCh7XG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgbGVuZ3RoOiBpdGVtLmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBnZXREZXNjcmlwdGlvbk1heExlbmd0aEZvclBhdGgoZmllbGRQYXRoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVyc2l6ZWQucHVzaCguLi5maW5kT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMoaXRlbSwgZmllbGRQYXRoLCBzZWVuKSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcnNpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBub3JtYWxpemUgZW5zZW1ibGUgZWxlbWVudHMgaW5wdXQuXG4gKlxuICogSXNzdWUgIzY1ODogTExNcyBvZnRlbiBzZW5kIGVsZW1lbnRzIGluIGRpY3Qta2V5ZWQgZm9ybWF0IGluc3RlYWQgb2YgYXJyYXkgZm9ybWF0LlxuICogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGJvdGggZm9ybWF0cyB0byBhIHZhbGlkIGFycmF5IG9mIEVuc2VtYmxlRWxlbWVudC1saWtlIG9iamVjdHMuXG4gKlxuICogQWNjZXB0ZWQgZm9ybWF0czpcbiAqIC0gQXJyYXk6IFt7IGVsZW1lbnRfbmFtZTogXCJmb29cIiwgZWxlbWVudF90eXBlOiBcIm1lbW9yeVwiLCAuLi4gfV1cbiAqIC0gRGljdDogIHsgXCJmb29cIjogeyB0eXBlOiBcIm1lbW9yeVwiLCAuLi4gfSB9ICDihpIgY29udmVydGVkIHRvIGFycmF5XG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGVsZW1lbnRzIGlucHV0IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBzdWNjZXNzIGZsYWcsIG5vcm1hbGl6ZWQgZWxlbWVudHMgYXJyYXksIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHModmFsdWU6IHVua25vd24pOiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdO1xuICBlcnJvcj86IHN0cmluZztcbn0ge1xuICAvLyBDYXNlIDE6IEFscmVhZHkgYW4gYXJyYXkg4oCUIHZhbGlkYXRlIGVhY2ggaXRlbVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgbm9ybWFsaXplZDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50IGF0IGluZGV4ICR7aX0gbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBlbGVtZW50X25hbWUgYW5kIGVsZW1lbnRfdHlwZWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9iaiA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBuYW1lID0gb2JqLmVsZW1lbnRfbmFtZSB8fCBvYmoubmFtZTtcbiAgICAgIGNvbnN0IHR5cGUgPSBvYmouZWxlbWVudF90eXBlIHx8IG9iai50eXBlO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50IGF0IGluZGV4ICR7aX0gaXMgbWlzc2luZyBlbGVtZW50X25hbWUgKG9yIG5hbWUpYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGUgX3JlbW92ZSBpcyBzdHJpY3RseSBib29sZWFuIGlmIHByZXNlbnRcbiAgICAgIGlmICgnX3JlbW92ZScgaW4gb2JqICYmIHR5cGVvZiBvYmouX3JlbW92ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50ICcke1N0cmluZyhuYW1lKX0nIGhhcyBpbnZhbGlkIF9yZW1vdmUgdmFsdWUg4oCUIG11c3QgYmUgYm9vbGVhbiB0cnVlLCBnb3QgJHt0eXBlb2Ygb2JqLl9yZW1vdmV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXplIHRvIHN0YW5kYXJkIGZpZWxkIG5hbWVzLCBvbmx5IGluY2x1ZGluZyBkZWZpbmVkIHZhbHVlc1xuICAgICAgY29uc3QgZW50cnk6IEVuc2VtYmxlRWxlbWVudElucHV0ID0geyAuLi5vYmosIGVsZW1lbnRfbmFtZTogU3RyaW5nKG5hbWUpIH07XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBlbnRyeS5lbGVtZW50X3R5cGUgPSBTdHJpbmcodHlwZSk7XG4gICAgICB9XG4gICAgICBub3JtYWxpemVkLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVsZW1lbnRzOiBbXSwgZXJyb3I6IGVycm9ycy5qb2luKCc7ICcpIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVsZW1lbnRzOiBub3JtYWxpemVkIH07XG4gIH1cblxuICAvLyBDYXNlIDI6IERpY3Qta2V5ZWQgZm9ybWF0IOKAlCBjb252ZXJ0IHRvIGFycmF5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGRpY3QgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZGljdCkpIHtcbiAgICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVsZW1lbnRzOiBbXSxcbiAgICAgICAgICBlcnJvcjogYEVsZW1lbnQgJyR7a2V5fScgaW4gZGljdCBmb3JtYXQgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBlbGVtZW50X3R5cGUgKG9yIHR5cGUpLiBgICtcbiAgICAgICAgICAgIGBFeHBlY3RlZDogeyBcIiR7a2V5fVwiOiB7IHR5cGU6IFwibWVtb3J5XCIsIHJvbGU6IFwic3VwcG9ydFwiLCAuLi4gfSB9YFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXIgPSB2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAgICAuLi5pbm5lcixcbiAgICAgICAgZWxlbWVudF9uYW1lOiBTdHJpbmcoaW5uZXIuZWxlbWVudF9uYW1lIHx8IGlubmVyLm5hbWUgfHwga2V5KSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBTdHJpbmcoaW5uZXIuZWxlbWVudF90eXBlIHx8IGlubmVyLnR5cGUpLFxuICAgICAgICByb2xlOiAoaW5uZXIucm9sZSBhcyBFbnNlbWJsZUVsZW1lbnRJbnB1dFsncm9sZSddKSB8fCAnc3VwcG9ydCcsXG4gICAgICAgIGFjdGl2YXRpb246IChpbm5lci5hY3RpdmF0aW9uIGFzIEVuc2VtYmxlRWxlbWVudElucHV0WydhY3RpdmF0aW9uJ10pIHx8ICdhbHdheXMnLFxuICAgICAgICBwcmlvcml0eTogKGlubmVyLnByaW9yaXR5IGFzIG51bWJlcikgPz8gNTAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZWxlbWVudHM6IG5vcm1hbGl6ZWQgfTtcbiAgfVxuXG4gIC8vIENhc2UgMzogSW52YWxpZCB0eXBlXG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZWxlbWVudHM6IFtdLFxuICAgIGVycm9yOiBgJ2VsZW1lbnRzJyBtdXN0IGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgYSBkaWN0LWtleWVkIG9iamVjdC4gR290OiAke3R5cGVvZiB2YWx1ZX1gXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW5jb21pbmcgZW5zZW1ibGUgZWxlbWVudHMgd2l0aCBleGlzdGluZyBlbGVtZW50cy5cbiAqXG4gKiBJc3N1ZSAjNjU4LyM2NjI6IFVuaWZpZWQgY29sbGVjdGlvbiBlZGl0aW5nIHNlbWFudGljcyDigJQgZWFjaCBpdGVtIGluIHRoZSBpbnB1dFxuICogZGVjbGFyZXMgaXRzIG93biBpbnRlbnQgdmlhIGl0cyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gRXhpc3RpbmcgZWxlbWVudCB3aXRoIHVwZGF0ZXMg4oaSIG1lcmdlIHByb3BlcnRpZXMgKGluY29taW5nIHdpbnMpXG4gKiAtIE5ldyBlbGVtZW50IChub3QgZm91bmQgYnkgbmFtZSkg4oaSIGFwcGVuZGVkXG4gKiAtIEVsZW1lbnQgd2l0aCBgX3JlbW92ZTogdHJ1ZWAg4oaSIGRyb3BwZWQgZnJvbSBjb2xsZWN0aW9uXG4gKiAtIEV4aXN0aW5nIGVsZW1lbnRzIG5vdCBpbiBpbmNvbWluZyDihpIgcHJlc2VydmVkIHVuY2hhbmdlZFxuICpcbiAqIFRoaXMgcGF0dGVybiBleHRlbmRzIHRvIGFueSBmdXR1cmUgZ3JvdXBpbmcgdHlwZSAod29ya2Zsb3dzLCBwaXBlbGluZXMsIHRlYW1zKS5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmcgLSBDdXJyZW50IGVsZW1lbnRzIGFycmF5IGZyb20gdGhlIGVuc2VtYmxlXG4gKiBAcGFyYW0gaW5jb21pbmcgLSBOZXcvdXBkYXRlZC9yZW1vdmVkIGVsZW1lbnRzIGZyb20gdGhlIGVkaXQgaW5wdXRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIG1lcmdlZCBhcnJheSBhbmQgYW55IHdhcm5pbmdzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRW5zZW1ibGVFbGVtZW50cyhcbiAgZXhpc3Rpbmc6IEVuc2VtYmxlRWxlbWVudElucHV0W10sXG4gIGluY29taW5nOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdXG4pOiB7IGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHJlc3VsdDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IGV4aXN0aW5nLm1hcChlID0+ICh7IC4uLmUgfSkpO1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGluYyBvZiBpbmNvbWluZykge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoaW5jLmVsZW1lbnRfbmFtZSB8fCBpbmMubmFtZSB8fCAnJyk7XG4gICAgaWYgKCFuYW1lKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSByZXN1bHQuZmluZEluZGV4KFxuICAgICAgZSA9PiBTdHJpbmcoZS5lbGVtZW50X25hbWUgfHwgZS5uYW1lIHx8ICcnKSA9PT0gbmFtZVxuICAgICk7XG5cbiAgICAvLyBJc3N1ZSAjNjYyOiBfcmVtb3ZlIG1hcmtlciDigJQgZHJvcCBlbGVtZW50IGZyb20gY29sbGVjdGlvblxuICAgIGlmIChpbmMuX3JlbW92ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGV4aXN0aW5nSW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgRWxlbWVudCAnJHtuYW1lfScgbm90IGZvdW5kIGluIGVuc2VtYmxlIOKAlCBub3RoaW5nIHRvIHJlbW92ZWApO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgdHJhbnNpZW50L2FsaWFzIGZpZWxkcyB0aGF0IHNob3VsZG4ndCBiZSBwZXJzaXN0ZWRcbiAgICBjb25zdCB7IF9yZW1vdmU6IF9kaXNjYXJkUmVtb3ZlLCBuYW1lOiBfZGlzY2FyZE5hbWUsIHR5cGU6IF9kaXNjYXJkVHlwZSwgLi4ucGVyc2lzdGFibGUgfSA9IGluYztcblxuICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgIC8vIFVwc2VydDogbWVyZ2UgaW5jb21pbmcgcHJvcGVydGllcyBpbnRvIGV4aXN0aW5nIChpbmNvbWluZyB3aW5zKVxuICAgICAgcmVzdWx0W2V4aXN0aW5nSW5kZXhdID0geyAuLi5yZXN1bHRbZXhpc3RpbmdJbmRleF0sIC4uLnBlcnNpc3RhYmxlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBuZXcgZWxlbWVudFxuICAgICAgcmVzdWx0LnB1c2goeyAuLi5wZXJzaXN0YWJsZSB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBlbGVtZW50czogcmVzdWx0LCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlLCBub3JtYWxpemUsIGFuZCBtZXJnZSBlbnNlbWJsZSBlbGVtZW50cyBpbnRvIHRoZSB1cGRhdGUgb2JqZWN0LlxuICogRXh0cmFjdGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGJldHdlZW4gdGhlIHRvcC1sZXZlbCBgZWxlbWVudHNgIGtleSBoYW5kbGVyXG4gKiBhbmQgdGhlIGBtZXRhZGF0YS5lbGVtZW50c2Aga2V5IGhhbmRsZXIgKENsYXVkZSByZXZpZXcpLlxuICpcbiAqIEByZXR1cm5zIEFuIGVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGZhaWxzLCBvciBudWxsIG9uIHN1Y2Nlc3NcbiAqL1xuZnVuY3Rpb24gaXNFbnNlbWJsZUVsZW1lbnRJbnB1dCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVuc2VtYmxlRWxlbWVudElucHV0IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVuc2VtYmxlRWxlbWVudHNVcGRhdGUoXG4gIGVsZW1lbnRzSW5wdXQ6IHVua25vd24sXG4gIGVsZW1lbnQ6IHVua25vd24sXG4gIHVwZGF0ZU9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW11cbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHMoZWxlbWVudHNJbnB1dCk7XG4gIGlmICghdmFsaWRhdGVkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gYEludmFsaWQgJ2VsZW1lbnRzJyBmb3JtYXQ6ICR7dmFsaWRhdGVkLmVycm9yfWA7XG4gIH1cbiAgY29uc3QgZWxlbWVudFJlY29yZCA9IGVsZW1lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1ldGFkYXRhID0gZWxlbWVudFJlY29yZC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3RWxlbWVudHMgPSBtZXRhZGF0YT8uZWxlbWVudHM7XG4gIGNvbnN0IGV4aXN0aW5nVHlwZWQ6IEVuc2VtYmxlRWxlbWVudElucHV0W10gPSBBcnJheS5pc0FycmF5KHJhd0VsZW1lbnRzKVxuICAgID8gcmF3RWxlbWVudHMuZmlsdGVyKGlzRW5zZW1ibGVFbGVtZW50SW5wdXQpLm1hcChlID0+ICh7IC4uLmUgfSkpXG4gICAgOiBbXTtcbiAgY29uc3QgbWVyZ2VSZXN1bHQgPSBtZXJnZUVuc2VtYmxlRWxlbWVudHMoZXhpc3RpbmdUeXBlZCwgdmFsaWRhdGVkLmVsZW1lbnRzKTtcbiAgY29sbGVjdGlvbldhcm5pbmdzLnB1c2goLi4ubWVyZ2VSZXN1bHQud2FybmluZ3MpO1xuICBpZiAoIXVwZGF0ZU9iai5tZXRhZGF0YSkge1xuICAgIHVwZGF0ZU9iai5tZXRhZGF0YSA9IHt9O1xuICB9XG4gICh1cGRhdGVPYmoubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVsZW1lbnRzID0gbWVyZ2VSZXN1bHQuZWxlbWVudHM7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFN5bmMgZW5zZW1ibGUgZWxlbWVudHMgZnJvbSBtZXRhZGF0YSBhZnRlciBhbiB1cGRhdGUuXG4gKlxuICogRW5zZW1ibGVzIHN0b3JlIHRoZWlyIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiBtZXRhZGF0YS5lbGVtZW50cyxcbiAqIGFuZCBuZWVkIHRvIHN5bmMgdGhlIGludGVybmFsIGVsZW1lbnRzIGFycmF5IHdoZW4gdGhhdCBjaGFuZ2VzLlxuICpcbiAqIElzc3VlICM0NjY6IEJlZm9yZSBzeW5jaW5nLCByZXNvbHZlIGFueSBtaXNzaW5nIGVsZW1lbnRfdHlwZSBmaWVsZHNcbiAqIGJ5IHNlYXJjaGluZyB0aGUgcG9ydGZvbGlvIHZpYSB0aGUgY29udGV4dCBtYW5hZ2Vycy5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbnNlbWJsZSBlbGVtZW50IHRvIHN5bmNcbiAqIEBwYXJhbSBpbnB1dCAtIFRoZSBpbnB1dCBvYmplY3QgdG8gY2hlY2sgZm9yIGVsZW1lbnQgdXBkYXRlc1xuICogQHBhcmFtIGNvbnRleHQgLSBFbGVtZW50IENSVUQgY29udGV4dCB3aXRoIG1hbmFnZXJzIGZvciB0eXBlIHJlc29sdXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0Vuc2VtYmxlRWxlbWVudHNJZk5lZWRlZChcbiAgZWxlbWVudDogdW5rbm93bixcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250ZXh0PzogRWxlbWVudENydWRDb250ZXh0XG4pOiBQcm9taXNlPFJlc29sdmVFbGVtZW50VHlwZXNSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgaGFzRWxlbWVudHNVcGRhdGUgPSBpbnB1dC5lbGVtZW50cyB8fCAoaW5wdXQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5lbGVtZW50cztcblxuICBpZiAoaGFzRWxlbWVudHNVcGRhdGUgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEVuc2VtYmxlKSB7XG4gICAgLy8gSXNzdWUgIzQ2NjogUmVzb2x2ZSBtaXNzaW5nIGVsZW1lbnRfdHlwZSB2aWEgcG9ydGZvbGlvIGxvb2t1cCBiZWZvcmUgc3luY1xuICAgIGlmIChjb250ZXh0ICYmIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVFbGVtZW50VHlwZXMoXG4gICAgICAgIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMsXG4gICAgICAgIHtcbiAgICAgICAgICBza2lsbE1hbmFnZXI6IGNvbnRleHQuc2tpbGxNYW5hZ2VyLFxuICAgICAgICAgIHRlbXBsYXRlTWFuYWdlcjogY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICAgICAgYWdlbnRNYW5hZ2VyOiBjb250ZXh0LmFnZW50TWFuYWdlcixcbiAgICAgICAgICBtZW1vcnlNYW5hZ2VyOiBjb250ZXh0Lm1lbW9yeU1hbmFnZXIsXG4gICAgICAgICAgcGVyc29uYU1hbmFnZXI6IGNvbnRleHQucGVyc29uYU1hbmFnZXIsXG4gICAgICAgICAgZW5zZW1ibGVNYW5hZ2VyOiBjb250ZXh0LmVuc2VtYmxlTWFuYWdlcixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMgPSByZXN1bHQucmVzb2x2ZWQ7XG4gICAgICBlbGVtZW50LnN5bmNFbGVtZW50c0Zyb21NZXRhZGF0YSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnN5bmNFbGVtZW50c0Zyb21NZXRhZGF0YSgpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGFuZGxlIG1lbW9yeSBlbnRyeSB1cGRhdGVzIHdpdGggdmFsaWRhdGlvbiBhbmQgbm9ybWFsaXphdGlvbi5cbiAqXG4gKiBNZW1vcnkgZW50cmllcyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSB0aGV5OlxuICogLSBOZWVkIElEIGdlbmVyYXRpb24gaWYgbWlzc2luZ1xuICogLSBSZXF1aXJlIHRpbWVzdGFtcCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uXG4gKiAtIFVzZSBhIE1hcCBzdHJ1Y3R1cmUgaW50ZXJuYWxseVxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIC0gQXJyYXkgb2YgbWVtb3J5IGVudHJpZXMgZnJvbSBpbnB1dFxuICogQHJldHVybnMgUmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMsIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UsIGFuZCBub3JtYWxpemVkIGVudHJpZXMgbWFwXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU1lbW9yeUVudHJ5VXBkYXRlKGVudHJpZXM6IHVua25vd25bXSk6IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgZW50cmllc01hcDogTWFwPHN0cmluZywgdW5rbm93bj47XG59IHtcbiAgY29uc3QgZW50cmllc01hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXTtcbiAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBFbnRyeSBhdCBpbmRleCAke2l9IGlzIG5vdCBhIHZhbGlkIG9iamVjdGApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlPYmogPSBlbnRyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBlbnRyeUlkID0gZW50cnlPYmouaWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnlJZCkge1xuICAgICAgZW50cnlPYmouaWQgPSBnZW5lcmF0ZU1lbW9yeUlkKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGVudHJ5T2JqLnRpbWVzdGFtcCA/IG5ldyBEYXRlKGVudHJ5T2JqLnRpbWVzdGFtcCBhcyBzdHJpbmcpIDogbmV3IERhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odGltZXN0YW1wLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVzdGFtcCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkRW50cnkgPSB7XG4gICAgICAgIC4uLmVudHJ5T2JqLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkoZW50cnlPYmoudGFncykgPyBlbnRyeU9iai50YWdzIDogW10sXG4gICAgICAgIG1ldGFkYXRhOiB0eXBlb2YgZW50cnlPYmoubWV0YWRhdGEgPT09ICdvYmplY3QnICYmIGVudHJ5T2JqLm1ldGFkYXRhICE9PSBudWxsID8gZW50cnlPYmoubWV0YWRhdGEgOiB7fVxuICAgICAgfTtcblxuICAgICAgZW50cmllc01hcC5zZXQoZW50cnlPYmouaWQsIG5vcm1hbGl6ZWRFbnRyeSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBlcnJvcnMucHVzaChgRW50cnkgJyR7ZW50cnlPYmouaWR9JyBoYXMgaW52YWxpZCB0aW1lc3RhbXBgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3JzLmpvaW4oJ1xcbicpLCBlbnRyaWVzTWFwIH07XG4gIH1cblxuICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbnRyaWVzTWFwIH07XG59XG5cbi8qKlxuICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBFbGVtZW50IENSVUQgY29udGV4dCB3aXRoIG1hbmFnZXJzXG4gKiBAcGFyYW0gYXJncyAtIEVkaXQgYXJndW1lbnRzIChuYW1lLCB0eXBlLCBpbnB1dClcbiAqIEBwYXJhbSB2YWxpZGF0aW9uU2VydmljZSAtIE9wdGlvbmFsIHZhbGlkYXRpb24gc2VydmljZSBmb3IgREkgKGNyZWF0ZXMgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0RWxlbWVudChcbiAgY29udGV4dDogRWxlbWVudENydWRDb250ZXh0LFxuICBhcmdzOiBFZGl0RWxlbWVudEFyZ3MsXG4gIHZhbGlkYXRpb25TZXJ2aWNlPzogVmFsaWRhdGlvblNlcnZpY2Vcbikge1xuICBhd2FpdCBjb250ZXh0LmVuc3VyZUluaXRpYWxpemVkKCk7XG5cbiAgLy8gVXNlIGluamVjdGVkIHZhbGlkYXRpb24gc2VydmljZSBvciBjcmVhdGUgZGVmYXVsdFxuICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uU2VydmljZSA/PyBuZXcgVmFsaWRhdGlvblNlcnZpY2UoKTtcblxuICBjb25zdCB7IG5hbWUsIHR5cGUsIGlucHV0IH0gPSBhcmdzO1xuXG4gIC8vIFZhbGlkYXRlIGlucHV0IGlzIHByb3ZpZGVkXG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBlcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGlucHV0IG9iamVjdC4gUHJvdmlkZSBmaWVsZHMgdG8gdXBkYXRlIGFzIGEgbmVzdGVkIG9iamVjdC4nKTtcbiAgfVxuXG4gIGNvbnN0IHsgdHlwZTogbm9ybWFsaXplZFR5cGUgfSA9IG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQodHlwZSk7XG5cbiAgaWYgKCFub3JtYWxpemVkVHlwZSkge1xuICAgIHJldHVybiBlcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRWYWxpZEVsZW1lbnRUeXBlc0xpc3QoKX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hbmFnZXIgPSBnZXRNYW5hZ2VyRm9yVHlwZShjb250ZXh0LCBub3JtYWxpemVkVHlwZSk7XG4gIGlmICghbWFuYWdlcikge1xuICAgIGNvbnN0IGxhYmVsUGx1cmFsID0gZ2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSwgeyBwbHVyYWw6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVycm9yKGBFbGVtZW50IHR5cGUgJyR7bGFiZWxQbHVyYWx9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZWRpdGluZ2ApO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHJlc29sdmVFbGVtZW50QnlOYW1lKG1hbmFnZXIsIG5vcm1hbGl6ZWRUeXBlLCBuYW1lKTtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKTtcbiAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IobGFiZWwsIG5hbWUpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHVua25vd24gcHJvcGVydGllcyBhbmQgZ2VuZXJhdGUgd2FybmluZ3NcbiAgY29uc3QgdW5rbm93blByb3BlcnR5V2FybmluZ3MgPSBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzKFxuICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgIGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk7XG5cbiAgLy8gQWxzbyB2YWxpZGF0ZSBuZXN0ZWQgbWV0YWRhdGEgc3ViLW9iamVjdCAodGhlIHRvcC1sZXZlbCAnbWV0YWRhdGEnIGtleSBpc1xuICAvLyBza2lwcGVkIGJ5IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMgYXMgYSBzcGVjaWFsIHJvdXRlIGZpZWxkLCBzb1xuICAvLyBkYW5nZXJvdXMvdW5rbm93biBwcm9wZXJ0aWVzIGluc2lkZSBpdCB3b3VsZCBnbyB1bmNoZWNrZWQgb3RoZXJ3aXNlKVxuICBpZiAoaW5wdXQubWV0YWRhdGEgJiYgdHlwZW9mIGlucHV0Lm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXRhZGF0YSkpIHtcbiAgICBjb25zdCBuZXN0ZWRXYXJuaW5ncyA9IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMoXG4gICAgICBub3JtYWxpemVkVHlwZSxcbiAgICAgIGlucHV0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5wdXNoKC4uLm5lc3RlZFdhcm5pbmdzKTtcbiAgfVxuXG4gIGNvbnN0IHdhcm5pbmdUZXh0ID0gZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3ModW5rbm93blByb3BlcnR5V2FybmluZ3MpO1xuXG4gIGlmICh1bmtub3duUHJvcGVydHlXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5rbm93biBwcm9wZXJ0aWVzIGRldGVjdGVkYCwge1xuICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICB3YXJuaW5nQ291bnQ6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCxcbiAgICAgIHVua25vd25Qcm9wZXJ0aWVzOiB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5tYXAodyA9PiAoe1xuICAgICAgICBwcm9wZXJ0eTogdy5wcm9wZXJ0eSxcbiAgICAgICAgc3VnZ2VzdGlvbjogdy5zdWdnZXN0aW9uXG4gICAgICB9KSlcbiAgICB9KTtcbiAgfVxuXG4gIC8vIElzc3VlICMxNTkxOiBWYWxpZGF0ZSBlbGVtZW50LXNwZWNpZmljIGNvbnN0cmFpbnRzIGJlZm9yZSBhdHRlbXB0aW5nIGVkaXRzXG4gIC8vIE1lbW9yeSBjb250ZW50IGlzIHJlYWQtb25seSAoYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlKSAtIHJlamVjdCBhdHRlbXB0cyB0byBlZGl0IGl0XG4gIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZICYmICdjb250ZW50JyBpbiBpbnB1dCkge1xuICAgIHJldHVybiBlcnJvcihcbiAgICAgIGBNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIGVkaXRfZWxlbWVudC4gYCArXG4gICAgICBgTWVtb3J5IHVzZXMgYW4gYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlLiBgICtcbiAgICAgIGBVc2UgdGhlICdhZGRFbnRyeScgb3BlcmF0aW9uIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGlzIG1lbW9yeS5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IFZhbGlkYXRlIGZpZWxkIHR5cGVzIGJlZm9yZSBhcHBseWluZyAocHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbilcbiAgY29uc3QgdHlwZUVycm9ycyA9IHZhbGlkYXRlRmllbGRUeXBlcyhpbnB1dCwgbm9ybWFsaXplZFR5cGUpO1xuICBpZiAodHlwZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGVycm9yKGBGaWVsZCB0eXBlIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7dHlwZUVycm9ycy5tYXAoZSA9PiBgICDigKIgJHtlfWApLmpvaW4oJ1xcbicpfWApO1xuICB9XG5cbiAgY29uc3QgZ2F0ZWtlZXBlckVycm9ycyA9IGNvbGxlY3RHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKGlucHV0LCBpbnB1dC5tZXRhZGF0YSk7XG4gIGlmIChnYXRla2VlcGVyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoZm9ybWF0R2F0ZWtlZXBlclZhbGlkYXRpb25NZXNzYWdlKGdhdGVrZWVwZXJFcnJvcnMpKTtcbiAgfVxuXG4gIGNvbnN0IG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzID0gZmluZE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzKGlucHV0KTtcbiAgaWYgKG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoXG4gICAgICBgRGVzY3JpcHRpb24gbGVuZ3RoIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7b3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMubWFwKGZpZWxkID0+XG4gICAgICAgIGZvcm1hdE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGQpXG4gICAgICApLmpvaW4oJ1xcbicpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc3RyaW5nIGZpZWxkIHZhbHVlcyB1c2luZyBpbmplY3RlZCB2YWxpZGF0b3JcbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVGaWVsZFZhbHVlKHZhbGlkYXRvciwgZmllbGQsIHZhbHVlKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciAnJHtmaWVsZH0nOiAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgdXBkYXRlIG9iamVjdCwgbWFwcGluZyB0b3AtbGV2ZWwgZmllbGRzIHRvIG1ldGFkYXRhIHdoZXJlIGFwcHJvcHJpYXRlXG4gIC8vIElzc3VlICM1NjU6IFVzZSB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHByb3BlcnRpZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNvdXJjZVxuICBjb25zdCBtZXRhZGF0YUZpZWxkcyA9IEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVNbbm9ybWFsaXplZFR5cGVdID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IHVucmVjb2duaXplZEZpZWxkV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYXBwbGllZEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcHBlZEZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBGaWVsZHMgaGFuZGxlZCBieSBkZWRpY2F0ZWQgYnJhbmNoZXMgKG5vdCBtZXRhZGF0YSByb3V0aW5nKVxuICBjb25zdCBzcGVjaWFsUm91dGVGaWVsZHMgPSBuZXcgU2V0KFsnaW5zdHJ1Y3Rpb25zJywgJ2NvbnRlbnQnLCAnZWxlbWVudHMnLCAnbWV0YWRhdGEnLCAnZW50cmllcycsICd2ZXJzaW9uJ10pO1xuXG4gIC8vIENvbnRlbnQgY29udGV4dCBtYXAgc2hhcmVkIGJ5IGluc3RydWN0aW9ucyBhbmQgY29udGVudCB2YWxpZGF0aW9uIGJyYW5jaGVzXG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0TWFwOiBSZWNvcmQ8c3RyaW5nLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIC8vIFNraXAgZGFuZ2Vyb3VzIHByb3BlcnRpZXNcbiAgICBpZiAoREFOR0VST1VTX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgc2tpcHBlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHJlYWQtb25seSBmaWVsZHNcbiAgICBpZiAoUkVBRF9PTkxZX0ZJRUxEUy5oYXMoa2V5KSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gU2tpcHBpbmcgcmVhZC1vbmx5IGZpZWxkOiAke2tleX1gKTtcbiAgICAgIHNraXBwZWRGaWVsZHMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgYnJhbmNoIGJlbG93IGFwcGxpZXMgdGhlIGZpZWxkIOKAlCB0cmFjayBvbmNlIGF0IHRoZSBlbmRcbiAgICBsZXQgZmllbGRBcHBsaWVkID0gdHJ1ZTtcblxuICAgIC8vIE1hcCBrbm93biBtZXRhZGF0YSBmaWVsZHMgYXV0b21hdGljYWxseSAodHlwZS1zcGVjaWZpYylcbiAgICBpZiAobWV0YWRhdGFGaWVsZHMuaGFzKGtleSkgJiYgIXNwZWNpYWxSb3V0ZUZpZWxkcy5oYXMoa2V5KSkge1xuICAgICAgaWYgKCF1cGRhdGVPYmoubWV0YWRhdGEpIHtcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICAodXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdlbGVtZW50cycgJiYgbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAvLyBJc3N1ZSAjNjU4OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGVsZW1lbnRzIGlucHV0IChhcnJheSBvciBkaWN0IGZvcm1hdClcbiAgICAgIGNvbnN0IGVsZW1FcnJvciA9IGFwcGx5RW5zZW1ibGVFbGVtZW50c1VwZGF0ZSh2YWx1ZSwgZWxlbWVudCwgdXBkYXRlT2JqLCBjb2xsZWN0aW9uV2FybmluZ3MpO1xuICAgICAgaWYgKGVsZW1FcnJvcikgcmV0dXJuIGVycm9yKGVsZW1FcnJvcik7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdtZXRhZGF0YScgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVZhbHVlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIElmIG1ldGFkYXRhLmVsZW1lbnRzIGlzIHByb3ZpZGVkIGZvciBhbiBlbnNlbWJsZSwgZXh0cmFjdCBhbmQgcm91dGUgdGhyb3VnaFxuICAgICAgLy8gdGhlIGVuc2VtYmxlIGVsZW1lbnRzIGhhbmRsZXIgZm9yIHByb3BlciB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24vbWVyZ2UuXG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFICYmIG1ldGFWYWx1ZS5lbGVtZW50cykge1xuICAgICAgICBjb25zdCBlbGVtRXJyb3IgPSBhcHBseUVuc2VtYmxlRWxlbWVudHNVcGRhdGUobWV0YVZhbHVlLmVsZW1lbnRzLCBlbGVtZW50LCB1cGRhdGVPYmosIGNvbGxlY3Rpb25XYXJuaW5ncyk7XG4gICAgICAgIGlmIChlbGVtRXJyb3IpIHJldHVybiBlcnJvcihlbGVtRXJyb3IpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIHZhbHVlIGJlZm9yZSBkZWVwIG1lcmdlIHRvIGF2b2lkIGRvdWJsZS1wcm9jZXNzaW5nXG4gICAgICAgIGNvbnN0IHsgZWxlbWVudHM6IF9leHRyYWN0ZWQsIC4uLnJlc3RNZXRhZGF0YSB9ID0gbWV0YVZhbHVlO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzdE1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgcmVzdE1ldGFkYXRhLFxuICAgICAgICAgICAgTUVSR0VfT1BUSU9OU1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1lcmdlIG5lc3RlZCBtZXRhZGF0YSB3aXRoIHNlY3VyaXR5IG9wdGlvbnNcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICh1cGRhdGVPYmoubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIG1ldGFWYWx1ZSxcbiAgICAgICAgICBNRVJHRV9PUFRJT05TXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdpbnN0cnVjdGlvbnMnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM2MDIgcmVzb2x2ZWQ6ICdpbnN0cnVjdGlvbnMnIGlzIGEgZmlyc3QtY2xhc3MgZmllbGQgKGJlaGF2aW9yYWwgZGlyZWN0aXZlcylcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgY29udGVudENvbnRleHQ6IGNvbnRlbnRDb250ZXh0TWFwW25vcm1hbGl6ZWRUeXBlXVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgLy8gU2V0IGluc3RydWN0aW9ucyBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEZvciBhZ2VudHMsIGFsc28gdXBkYXRlIGV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXNzdWUgIzU4NS8jNjAyOiBIYW5kbGUgY29udGVudCB1cGRhdGVzIChyZWZlcmVuY2UgbWF0ZXJpYWwpXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIGNvbnRlbnRDb250ZXh0OiBjb250ZW50Q29udGV4dE1hcFtub3JtYWxpemVkVHlwZV1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICAvLyBTZXQgY29udGVudCBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmNvbnRlbnQgPSBzYW5pdGl6ZWRDb250ZW50O1xuICAgIH0gZWxzZSBpZiAoc3BlY2lhbFJvdXRlRmllbGRzLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTcGVjaWFsIHJvdXRlIGZpZWxkIOKAlCBoYW5kbGVkIGVsc2V3aGVyZSwgc2tpcFxuICAgICAgZmllbGRBcHBsaWVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICM1NjU6IEZpZWxkIG5vdCBpbiB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHNldCBhbmQgbm90IGEgc3BlY2lhbCByb3V0ZSDigJRcbiAgICAgIC8vIHN0aWxsIHJvdXRlIHRvIHVwZGF0ZU9iaiBmb3IgYmFja3dhcmQgY29tcGF0LCBidXQgd2FybiB0aGF0IGl0IG1heSBub3QgcGVyc2lzdFxuICAgICAgdXBkYXRlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MucHVzaChcbiAgICAgICAgYEZpZWxkICcke2tleX0nIGlzIG5vdCBhIHJlY29nbml6ZWQgbWV0YWRhdGEgcHJvcGVydHkgZm9yICR7Z2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSl9IOKAlCBpdCBtYXkgbm90IHBlcnNpc3QgYWZ0ZXIgc2F2ZS5gXG4gICAgICApO1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5yZWNvZ25pemVkIGZpZWxkICcke2tleX0nIGZvciAke25vcm1hbGl6ZWRUeXBlfSwgcm91dGluZyB0byBlbGVtZW50IG9iamVjdGAsIHtcbiAgICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChmaWVsZEFwcGxpZWQpIHtcbiAgICAgIGFwcGxpZWRGaWVsZHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZXAgbWVyZ2UgdGhlIHVwZGF0ZSBpbnRvIHRoZSBlbGVtZW50IHdpdGggc2VjdXJpdHkgb3B0aW9uc1xuICBjb25zdCBlbGVtZW50RGF0YSA9IGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbWVyZ2VkRGF0YSA9IGRlZXBNZXJnZShlbGVtZW50RGF0YSwgdXBkYXRlT2JqLCBNRVJHRV9PUFRJT05TKTtcblxuICAvLyBBcHBseSBtZXJnZWQgZGF0YSBiYWNrIHRvIGVsZW1lbnRcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWVyZ2VkRGF0YSkpIHtcbiAgICBpZiAoa2V5ICE9PSAnbWV0YWRhdGEnKSB7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgbWV0YWRhdGEgc2VwYXJhdGVseSB0byBwcmVzZXJ2ZSBlbGVtZW50IHN0cnVjdHVyZVxuICBpZiAobWVyZ2VkRGF0YS5tZXRhZGF0YSAmJiBlbGVtZW50Lm1ldGFkYXRhKSB7XG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50Lm1ldGFkYXRhLCBtZXJnZWREYXRhLm1ldGFkYXRhKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtZW1vcnkgZW50cmllcyBzcGVjaWFsbHkgKGV4dHJhY3RlZCBmb3IgY2xhcml0eSlcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkgJiYgaW5wdXQuZW50cmllcyAmJiBBcnJheS5pc0FycmF5KGlucHV0LmVudHJpZXMpKSB7XG4gICAgY29uc3QgbWVtb3J5UmVzdWx0ID0gaGFuZGxlTWVtb3J5RW50cnlVcGRhdGUoaW5wdXQuZW50cmllcyk7XG4gICAgaWYgKCFtZW1vcnlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIGVycm9yKGBNZW1vcnkgZW50cnkgdmFsaWRhdGlvbiBlcnJvcnM6XFxuJHttZW1vcnlSZXN1bHQubWVzc2FnZX1cXG5cXG5WYWxpZCBlbnRyaWVzIHdlcmUgc2F2ZWQuYCk7XG4gICAgfVxuICAgIChlbGVtZW50IGFzIGFueSkuZW50cmllcyA9IG1lbW9yeVJlc3VsdC5lbnRyaWVzTWFwO1xuICB9XG5cbiAgLy8gU3luYyBlbnNlbWJsZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIChleHRyYWN0ZWQgZm9yIGNsYXJpdHkpXG4gIC8vIElzc3VlICM0NjY6IFJlc29sdmUgZWxlbWVudF90eXBlIHZpYSBwb3J0Zm9saW8gbG9va3VwIGJlZm9yZSBzeW5jLCBzdXJmYWNlIHdhcm5pbmdzXG4gIGxldCByZXNvbHV0aW9uV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBhd2FpdCBzeW5jRW5zZW1ibGVFbGVtZW50c0lmTmVlZGVkKGVsZW1lbnQsIGlucHV0LCBjb250ZXh0KTtcbiAgICBpZiAocmVzb2x1dGlvblJlc3VsdCkge1xuICAgICAgcmVzb2x1dGlvbldhcm5pbmdUZXh0ID0gZm9ybWF0RWxlbWVudFJlc29sdXRpb25XYXJuaW5ncyhyZXNvbHV0aW9uUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXggIzkxMTogTm9ybWFsaXplIG1ldGFkYXRhIGFmdGVyIG1lcmdlIHRvIGVuc3VyZSBzdHJ1Y3R1cmFsIGNvbnNpc3RlbmN5LlxuICAvLyBCYXNlRWxlbWVudCBjb25zdHJ1Y3RvciBydW5zIG5vcm1hbGl6ZU1ldGFkYXRhIG9uIGNyZWF0ZS9sb2FkLCBidXQgdGhlIGVkaXQgcGF0aFxuICAvLyBtb2RpZmllcyBtZXRhZGF0YSBpbi1wbGFjZS4gVGhpcyBlbnN1cmVzIGVzc2VudGlhbCBkZWZhdWx0cyBzdXJ2aXZlIGVkaXRzLlxuICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgIGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz89ICcnO1xuICAgIGVsZW1lbnQubWV0YWRhdGEudGFncyA/Pz0gW107XG4gICAgLy8gVXBkYXRlIG1vZGlmaWVkIHRpbWVzdGFtcFxuICAgIGVsZW1lbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgdmVyc2lvbiB1cGRhdGVzXG4gIGlmIChpbnB1dC52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVWZXJzaW9uRXhwbGljaXQoZWxlbWVudCwgU3RyaW5nKGlucHV0LnZlcnNpb24pKTtcbiAgICBpZiAoIXVwZGF0ZS5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gZXJyb3IodXBkYXRlLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50KTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBmaWxlIHBhdGggZm9yIHNhdmluZ1xuICBjb25zdCBmaWxlUGF0aENhbmRpZGF0ZSA9IHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoKClcbiAgICA6ICgoZWxlbWVudCBhcyBhbnkpLmZpbGVQYXRoIHx8IChlbGVtZW50IGFzIGFueSkuZmlsZW5hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHR5cGVvZiBmaWxlUGF0aENhbmRpZGF0ZSA9PT0gJ3N0cmluZycgJiYgZmlsZVBhdGhDYW5kaWRhdGUubGVuZ3RoID4gMFxuICAgID8gZmlsZVBhdGhDYW5kaWRhdGVcbiAgICA6IGdldEVsZW1lbnRGaWxlbmFtZShub3JtYWxpemVkVHlwZSwgZWxlbWVudC5tZXRhZGF0YT8ubmFtZSB8fCBuYW1lKTtcblxuICB0cnkge1xuICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShlbGVtZW50LCBmaWxlbmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBlcnJvcihgRmFpbGVkIHRvIHNhdmUgZWxlbWVudDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKTtcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBlbGVtZW50Lm1ldGFkYXRhPy5uYW1lIHx8IG5hbWU7XG4gIGNvbnN0IHVwZGF0ZWRGaWVsZHMgPSBhcHBsaWVkRmllbGRzLmpvaW4oJywgJyk7XG5cbiAgLy8gSXNzdWUgIzE2NTY6IElmIGFsbCBmaWVsZHMgd2VyZSBzaWxlbnRseSBza2lwcGVkLCByZXBvcnQgaG9uZXN0bHlcbiAgaWYgKGFwcGxpZWRGaWVsZHMubGVuZ3RoID09PSAwICYmIHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGDimqDvuI8gTm8gZmllbGRzIGFwcGxpZWQgdG8gJHtsYWJlbH0gJyR7ZGlzcGxheU5hbWV9Jy4gYCArXG4gICAgICAgICAgYFNraXBwZWQ6ICR7c2tpcHBlZEZpZWxkcy5qb2luKCcsICcpfSAoZGFuZ2Vyb3VzIG9yIHJlYWQtb25seSBmaWVsZHMgYXJlIG5vdCBlZGl0YWJsZSkuYFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gSXNzdWUgIzU2NTogSW5jbHVkZSB3YXJuaW5ncyBmb3IgdW5yZWNvZ25pemVkIGZpZWxkcyBpbiByZXNwb25zZVxuICBsZXQgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmVzID0gWyfimqDvuI8gKipVbnJlY29nbml6ZWQgRmllbGQgV2FybmluZ3M6KionXTtcbiAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgdW5yZWNvZ25pemVkRmllbGRXYXJuaW5ncykge1xuICAgICAgbGluZXMucHVzaChgICAg4oCiICR7d2FybmluZ31gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IEluY2x1ZGUgY29sbGVjdGlvbiBvcGVyYXRpb24gd2FybmluZ3NcbiAgbGV0IGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9ICcnO1xuICBpZiAoY29sbGVjdGlvbldhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5lcyA9IFsn4pqg77iPICoqQ29sbGVjdGlvbiBXYXJuaW5nczoqKiddO1xuICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBjb2xsZWN0aW9uV2FybmluZ3MpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgIOKAoiAke3dhcm5pbmd9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8gSXNzdWUgIzE2NTY6IFJlcG9ydCBza2lwcGVkIGZpZWxkcyBzbyBMTE1zIGRvbid0IGFzc3VtZSB0aGV5IHdlcmUgYXBwbGllZFxuICBjb25zdCBza2lwcGVkVGV4dCA9IHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMFxuICAgID8gYFxcbuKaoO+4jyBTa2lwcGVkOiAke3NraXBwZWRGaWVsZHMuam9pbignLCAnKX0gKGRhbmdlcm91cyBvciByZWFkLW9ubHkpYFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdGV4dDogYCR7d2FybmluZ1RleHR9JHtyZXNvbHV0aW9uV2FybmluZ1RleHR9JHt1bnJlY29nbml6ZWRXYXJuaW5nVGV4dH0ke2NvbGxlY3Rpb25XYXJuaW5nVGV4dH3inIUgVXBkYXRlZCAke2xhYmVsfSAnJHtkaXNwbGF5TmFtZX0nIC0gZmllbGRzOiAke3VwZGF0ZWRGaWVsZHN9JHtza2lwcGVkVGV4dH1gXG4gICAgfV1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IGDinYwgJHttZXNzYWdlfWBcbiAgICB9XVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyRm9yVHlwZShjb250ZXh0OiBFbGVtZW50Q3J1ZENvbnRleHQsIHR5cGU6IEVsZW1lbnRUeXBlKTogRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PiB8IG51bGwge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICByZXR1cm4gY29udGV4dC5wZXJzb25hTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxhbnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICByZXR1cm4gY29udGV4dC5za2lsbE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8U2tpbGw+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICByZXR1cm4gY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8VGVtcGxhdGU+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICByZXR1cm4gY29udGV4dC5hZ2VudE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8QWdlbnQ+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOlxuICAgICAgcmV0dXJuIGNvbnRleHQubWVtb3J5TWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxNZW1vcnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6XG4gICAgICByZXR1cm4gY29udGV4dC5lbnNlbWJsZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkV4cGxpY2l0KGVsZW1lbnQ6IGFueSwgdmVyc2lvblN0cmluZzogc3RyaW5nKSB7XG4gIGNvbnN0IGlzVmFsaWQgPSAvXihcXGQrKShcXC5cXGQrKT8oXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2ZXJzaW9uU3RyaW5nKTtcbiAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEludmFsaWQgdmVyc2lvbiBmb3JtYXQ6ICcke3ZlcnNpb25TdHJpbmd9Jy4gUGxlYXNlIHVzZSBmb3JtYXQgbGlrZSAxLjAuMCwgMS4wLCBvciAxYFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGVsZW1lbnQudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50OiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBpZiAoZWxlbWVudC52ZXJzaW9uKSB7XG4gICAgICAvLyBGaXJzdCBub3JtYWxpemUgdGhlIHZlcnNpb24gdG8gMy1wYXJ0IGZvcm1hdCAoaGFuZGxlcyBsZWdhY3kgMi1wYXJ0IHZlcnNpb25zKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKGVsZW1lbnQudmVyc2lvbikpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnNcbiAgICAgIGNvbnN0IHByZVJlbGVhc2VNYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL14oXFxkK1xcLlxcZCtcXC5cXGQrKSgtKFthLXpBLVowLTkuLV0rKSk/JC8pO1xuXG4gICAgICBpZiAocHJlUmVsZWFzZU1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VWZXJzaW9uID0gcHJlUmVsZWFzZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBwcmVSZWxlYXNlVGFnID0gcHJlUmVsZWFzZU1hdGNoWzNdO1xuXG4gICAgICAgIGlmIChwcmVSZWxlYXNlVGFnKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHByZS1yZWxlYXNlIHZlcnNpb24gKGUuZy4sIFwiMS4wLjAtYmV0YS4xXCIg4oaSIFwiMS4wLjAtYmV0YS4yXCIpXG4gICAgICAgICAgY29uc3QgcHJlUmVsZWFzZU51bWJlck1hdGNoID0gcHJlUmVsZWFzZVRhZy5tYXRjaCgvXihbYS16QS1aXSspXFwuPyhcXGQrKT8kLyk7XG4gICAgICAgICAgaWYgKHByZVJlbGVhc2VOdW1iZXJNYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgcHJlUmVsZWFzZVR5cGUgPSBwcmVSZWxlYXNlTnVtYmVyTWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlTnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHByZVJlbGVhc2VOdW1iZXJNYXRjaFsyXSB8fCAnMCcpICsgMTtcbiAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IGAke2Jhc2VWZXJzaW9ufS0ke3ByZVJlbGVhc2VUeXBlfS4ke3ByZVJlbGVhc2VOdW1iZXJ9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gcHJlLXJlbGVhc2UgbnVtYmVyLCBidW1wIHBhdGNoXG4gICAgICAgICAgICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBiYXNlVmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0YW5kYXJkIHZlcnNpb24sIGJ1bXAgcGF0Y2ggKGUuZy4sIFwiMS4wLjBcIiDihpIgXCIxLjAuMVwiKVxuICAgICAgICAgIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IGJhc2VWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3VsZG4ndCByZWFjaCBoZXJlIGFmdGVyIG5vcm1hbGl6YXRpb24sIGJ1dCBmYWxsYmFjayB0byBzYWZlIGRlZmF1bHRcbiAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gJzEuMC4xJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gdmVyc2lvbiwgc3RhcnQgYXQgMS4wLjBcbiAgICAgIGVsZW1lbnQudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgfVxuXG4gICAgLy8gU3luYyB2ZXJzaW9uIHRvIG1ldGFkYXRhXG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IGVsZW1lbnQudmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYXV0by1pbmNyZW1lbnQgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -16,6 +16,7 @@ export declare const SECURITY_LIMITS: {
16
16
  MAX_BATCH_OPERATIONS: number;
17
17
  MAX_NAME_LENGTH: number;
18
18
  MAX_DESCRIPTION_LENGTH: number;
19
+ MAX_DOCUMENTATION_FIELD_LENGTH: number;
19
20
  MAX_ENUM_FIELD_LENGTH: number;
20
21
  MAX_TAG_LENGTH: number;
21
22
  MAX_COMMAND_ARG_LENGTH: number;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/security/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;CAkC3B,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,WAAW,EAAE,qBAAqB,GACjC,qBAAqB,CAIvB;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;;;CA4B/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAwCA,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/security/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;CAmC3B,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,WAAW,EAAE,qBAAqB,GACjC,qBAAqB,CAIvB;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;;;CA4B/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAwCA,CAAC"}
@@ -19,6 +19,7 @@ export const SECURITY_LIMITS = {
19
19
  // Centralized here so a single change applies everywhere and grep finds all usages.
20
20
  MAX_NAME_LENGTH: 100, // Element name field
21
21
  MAX_DESCRIPTION_LENGTH: 500, // Element description field
22
+ MAX_DOCUMENTATION_FIELD_LENGTH: 64 * 1024, // Nested help/example docs in YAML/frontmatter
22
23
  MAX_ENUM_FIELD_LENGTH: 20, // Short enum-like fields (strategy, role, activation)
23
24
  MAX_TAG_LENGTH: 50, // Individual tag / category values
24
25
  MAX_COMMAND_ARG_LENGTH: 1000, // CLI command argument validation
@@ -117,4 +118,4 @@ export const PATTERN_DESCRIPTIONS = {
117
118
  charTest: /^[^\s@]$/,
118
119
  },
119
120
  };
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGtDQUFrQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0Isc0JBQXNCLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUcsNEJBQTRCO0lBQ3RFLG1CQUFtQixFQUFFLEdBQUcsRUFBbUIsc0JBQXNCO0lBQ2pFLGNBQWMsRUFBRSxFQUFFLEVBQXdCLGdDQUFnQztJQUMxRSxrQkFBa0IsRUFBRSxNQUFNLEVBQWdCLHdEQUF3RDtJQUNsRyxlQUFlLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBZ0IscUNBQXFDO0lBQy9FLHlCQUF5QixFQUFFLElBQUksRUFBVyw2Q0FBNkM7SUFDdkYsYUFBYSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFXLHNCQUFzQjtJQUMvRCxtQkFBbUIsRUFBRSxHQUFHLEVBQWtCLDBCQUEwQjtJQUNwRSxvQkFBb0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFVLGtCQUFrQjtJQUMzRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQWMscUJBQXFCO0lBQzlELGtCQUFrQixFQUFFLEVBQUUsRUFBb0IsK0JBQStCO0lBQ3pFLG9CQUFvQixFQUFFLEVBQUUsRUFBa0IscURBQXFEO0lBRS9GLCtFQUErRTtJQUMvRSxvRkFBb0Y7SUFDcEYsZUFBZSxFQUFFLEdBQUcsRUFBc0IscUJBQXFCO0lBQy9ELHNCQUFzQixFQUFFLEdBQUcsRUFBZSw0QkFBNEI7SUFDdEUscUJBQXFCLEVBQUUsRUFBRSxFQUFpQixzREFBc0Q7SUFDaEcsY0FBYyxFQUFFLEVBQUUsRUFBd0IsbUNBQW1DO0lBQzdFLHNCQUFzQixFQUFFLElBQUksRUFBYyxrQ0FBa0M7SUFFNUUsc0VBQXNFO0lBQ3RFLHNGQUFzRjtJQUN0Riw4RUFBOEU7SUFDOUUsb0ZBQW9GO0lBQ3BGLHNCQUFzQixFQUFFLEtBQUssRUFBYSwrQ0FBK0M7SUFFekYscURBQXFEO0lBQ3JELHNEQUFzRDtJQUN0RCxpR0FBaUc7SUFDakcsb0ZBQW9GO0lBQ3BGLDRFQUE0RTtJQUM1RSxpQ0FBaUMsRUFBRSxDQUFDO0NBQ3JDLENBQUM7QUFLRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE9BQTBDLEVBQzFDLFdBQWtDO0lBRWxDLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsYUFBYSxFQUFFLGdEQUFnRDtJQUMvRCxTQUFTLEVBQUUsNkJBQTZCO0lBQ3hDLGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsYUFBYSxFQUFFLGdDQUFnQztJQUMvQyxVQUFVLEVBQUUsNENBQTRDLEVBQUcsNEJBQTRCO0lBRXZGLGlFQUFpRTtJQUNqRSxrRkFBa0Y7SUFFbEYsOEZBQThGO0lBQzlGLGlFQUFpRTtJQUNqRSxTQUFTLEVBQUUsd0JBQXdCO0lBRW5DLDREQUE0RDtJQUM1RCxzRUFBc0U7SUFDdEUscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSxzREFBc0Q7SUFDdEQseURBQXlEO0lBQ3pELGdCQUFnQixFQUFFLDRDQUE0QztJQUU5RCwyRUFBMkU7SUFDM0Usd0VBQXdFO0lBQ3hFLFlBQVksRUFBRSxXQUFXO0lBRXpCLCtHQUErRztJQUMvRyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FJNUI7SUFDSCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsc0RBQXNEO1FBQy9ELFFBQVEsRUFBRSx1QkFBdUI7S0FDbEM7SUFDRCxnQkFBZ0IsRUFBRTtRQUNoQixPQUFPLEVBQUUsMkRBQTJEO1FBQ3BFLFFBQVEsRUFBRSwyQ0FBMkM7S0FDdEQ7SUFDRCxZQUFZLEVBQUU7UUFDWixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLFFBQVEsRUFBRSxVQUFVO0tBQ3JCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsT0FBTyxFQUFFLDhDQUE4QztRQUN2RCxRQUFRLEVBQUUsbUJBQW1CO0tBQzlCO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsT0FBTyxFQUFFLDhDQUE4QztRQUN2RCxRQUFRLEVBQUUsbUJBQW1CO1FBQzdCLFVBQVUsRUFBRSxzREFBc0Q7S0FDbkU7SUFDRCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsdUVBQXVFO1FBQ2hGLFFBQVEsRUFBRSxzQkFBc0I7S0FDakM7SUFDRCxhQUFhLEVBQUU7UUFDYixPQUFPLEVBQUUsOENBQThDO1FBQ3ZELFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsVUFBVSxFQUFFLG1EQUFtRDtLQUNoRTtJQUNELGFBQWEsRUFBRTtRQUNiLE9BQU8sRUFBRSx3Q0FBd0M7UUFDakQsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixVQUFVLEVBQUUseUNBQXlDO0tBQ3REO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsT0FBTyxFQUFFLGlEQUFpRDtRQUMxRCxRQUFRLEVBQUUsVUFBVTtLQUNyQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5LXJlbGF0ZWQgY29uc3RhbnRzIGFuZCBsaW1pdHNcbiAqL1xuXG4vLyBTZWN1cml0eSBhbmQgcGVyZm9ybWFuY2UgbGltaXRzXG5leHBvcnQgY29uc3QgU0VDVVJJVFlfTElNSVRTID0ge1xuICBNQVhfUEVSU09OQV9TSVpFX0JZVEVTOiAxMDI0ICogMTAyNCAqIDIsICAvLyAyTUIgbWF4IHBlcnNvbmEgZmlsZSBzaXplXG4gIE1BWF9GSUxFTkFNRV9MRU5HVEg6IDI1NSwgICAgICAgICAgICAgICAgICAvLyBNYXggZmlsZW5hbWUgbGVuZ3RoXG4gIE1BWF9QQVRIX0RFUFRIOiAxMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heCBkaXJlY3RvcnkgZGVwdGggZm9yIHBhdGhzXG4gIE1BWF9DT05URU5UX0xFTkdUSDogNTAwMDAwLCAgICAgICAgICAgICAgIC8vIE1heCBlbGVtZW50IGNvbnRlbnQgbGVuZ3RoICg1MDBLQiwgfjEtNW1zIHJlZ2V4IHNjYW4pXG4gIE1BWF9ZQU1MX0xFTkdUSDogNjQgKiAxMDI0LCAgICAgICAgICAgICAgIC8vIE1heCBZQU1MIGZyb250bWF0dGVyIGxlbmd0aCAoNjRLQilcbiAgTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSDogMTAyNCwgICAgICAgICAgLy8gTWF4IGluZGl2aWR1YWwgbWV0YWRhdGEgZmllbGQgbGVuZ3RoICgxS0IpXG4gIE1BWF9GSUxFX1NJWkU6IDEwMjQgKiAxMDI0ICogMiwgICAgICAgICAgLy8gTWF4IGZpbGUgc2l6ZSAoMk1CKVxuICBSQVRFX0xJTUlUX1JFUVVFU1RTOiAxMDAsICAgICAgICAgICAgICAgICAvLyBNYXggcmVxdWVzdHMgcGVyIHdpbmRvd1xuICBSQVRFX0xJTUlUX1dJTkRPV19NUzogNjAgKiAxMDAwLCAgICAgICAgIC8vIDEgbWludXRlIHdpbmRvd1xuICBDQUNIRV9UVExfTVM6IDUgKiA2MCAqIDEwMDAsICAgICAgICAgICAgIC8vIDUgbWludXRlIGNhY2hlIFRUTFxuICBNQVhfU0VBUkNIX1JFU1VMVFM6IDUwLCAgICAgICAgICAgICAgICAgICAvLyBNYXggc2VhcmNoIHJlc3VsdHMgdG8gcmV0dXJuXG4gIE1BWF9CQVRDSF9PUEVSQVRJT05TOiA1MCwgICAgICAgICAgICAgICAgIC8vIE1heCBvcGVyYXRpb25zIHBlciBiYXRjaCByZXF1ZXN0IChJc3N1ZSAjMjIxLyM1NDMpXG5cbiAgLy8gRmllbGQtbGV2ZWwgdmFsaWRhdGlvbiBsaW1pdHMg4oCUIHVzZWQgYWNyb3NzIGVsZW1lbnQgbWFuYWdlcnMgYW5kIHZhbGlkYXRvcnMuXG4gIC8vIENlbnRyYWxpemVkIGhlcmUgc28gYSBzaW5nbGUgY2hhbmdlIGFwcGxpZXMgZXZlcnl3aGVyZSBhbmQgZ3JlcCBmaW5kcyBhbGwgdXNhZ2VzLlxuICBNQVhfTkFNRV9MRU5HVEg6IDEwMCwgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5hbWUgZmllbGRcbiAgTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDogNTAwLCAgICAgICAgICAgICAgLy8gRWxlbWVudCBkZXNjcmlwdGlvbiBmaWVsZFxuICBNQVhfRU5VTV9GSUVMRF9MRU5HVEg6IDIwLCAgICAgICAgICAgICAgICAvLyBTaG9ydCBlbnVtLWxpa2UgZmllbGRzIChzdHJhdGVneSwgcm9sZSwgYWN0aXZhdGlvbilcbiAgTUFYX1RBR19MRU5HVEg6IDUwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaXZpZHVhbCB0YWcgLyBjYXRlZ29yeSB2YWx1ZXNcbiAgTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDogMTAwMCwgICAgICAgICAgICAgLy8gQ0xJIGNvbW1hbmQgYXJndW1lbnQgdmFsaWRhdGlvblxuXG4gIC8vIFJlZ2V4IHZhbGlkYXRpb24g4oCUIGNvbnRlbnQgbGVuZ3RoIGNhcHMgcGVyIHBhdHRlcm4gY29tcGxleGl0eSB0aWVyLlxuICAvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzIHVzZWQgYnkgUmVnZXhWYWxpZGF0b3Igd2hlbiBubyBleHBsaWNpdCBtYXhMZW5ndGggaXMgcGFzc2VkLlxuICAvLyBMb3cvbWVkaXVtIGFyZSBzYWZlIGF0IE1BWF9DT05URU5UX0xFTkdUSCBiZWNhdXNlIHRoZXkncmUgTyhuKSBsaW5lYXIgdGltZS5cbiAgLy8gSGlnaC1jb21wbGV4aXR5IHBhdHRlcm5zIChuZXN0ZWQgcXVhbnRpZmllcnMsIFJlRG9TIHJpc2spIGFyZSBoYXJkLWNhcHBlZCBhdCAxS0IuXG4gIE1BWF9SRUdFWF9JTlBVVF9MRU5HVEg6IDEwMDAwLCAgICAgICAgICAgIC8vIFNhZmVSZWdleCBkZWZhdWx0IGZvciB1c2VyLXN1cHBsaWVkIHBhdHRlcm5zXG5cbiAgLy8gWUFNTCBib21iIGRldGVjdGlvbiB0aHJlc2hvbGQgKFNFQ1VSSVRZIEZJWCAjMTI5OClcbiAgLy8gTWF4aW11bSBhbGxvd2VkIGFsaWFzLXRvLWFuY2hvciBhbXBsaWZpY2F0aW9uIHJhdGlvXG4gIC8vIFNldCB0byA1OjEgLSBiYWxhbmNlcyBzZWN1cml0eSAoZWFybHkgRG9TIGRldGVjdGlvbikgd2l0aCB1c2FiaWxpdHkgKGxlZ2l0aW1hdGUgWUFNTCBwYXR0ZXJucylcbiAgLy8gUmF0aW9uYWxlOiBNb3N0IGxlZ2l0aW1hdGUgWUFNTCB1c2VzIOKJpDPDlyBhbXBsaWZpY2F0aW9uOyA1w5cgcHJvdmlkZXMgc2FmZXR5IG1hcmdpblxuICAvLyB3aGlsZSBibG9ja2luZyBleHBvbmVudGlhbCBleHBhbnNpb24gYXR0YWNrcyB0aGF0IHR5cGljYWxseSBzdGFydCBhdCAxMMOXK1xuICBZQU1MX0JPTUJfQU1QTElGSUNBVElPTl9USFJFU0hPTEQ6IDVcbn07XG5cbi8qKiBTaGFyZWQgc2V2ZXJpdHkgdHlwZSB1c2VkIGFjcm9zcyBzZWN1cml0eSB2YWxpZGF0b3JzICgjMTc4Mi03KSAqL1xuZXhwb3J0IHR5cGUgU2VjdXJpdHlTZXZlcml0eUxldmVsID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG5cbi8qKlxuICogRXNjYWxhdGUgc2V2ZXJpdHkgbGV2ZWwg4oCUIGhpZ2hlciBzZXZlcml0eSB0YWtlcyBwcmVjZWRlbmNlLlxuICogRXh0cmFjdGVkIGZyb20gVW5pY29kZVZhbGlkYXRvciBhbmQgSW5wdXROb3JtYWxpemVyIHRvIGVsaW1pbmF0ZSBkdXBsaWNhdGlvbiAoIzE3ODItNykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhbGF0ZVNldmVyaXR5KFxuICBjdXJyZW50OiBTZWN1cml0eVNldmVyaXR5TGV2ZWwgfCB1bmRlZmluZWQsXG4gIG5ld1NldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5TGV2ZWxcbik6IFNlY3VyaXR5U2V2ZXJpdHlMZXZlbCB7XG4gIGNvbnN0IGxldmVscyA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGN1cnJlbnQgPyBsZXZlbHNbY3VycmVudF0gOiAwO1xuICByZXR1cm4gbGV2ZWxzW25ld1NldmVyaXR5XSA+IGN1cnJlbnRMZXZlbCA/IG5ld1NldmVyaXR5IDogKGN1cnJlbnQgfHwgJ2xvdycpO1xufVxuXG4vLyBJbnB1dCB2YWxpZGF0aW9uIHBhdHRlcm5zXG5leHBvcnQgY29uc3QgVkFMSURBVElPTl9QQVRURVJOUyA9IHtcbiAgU0FGRV9GSUxFTkFNRTogL15bYS16QS1aMC05XVthLXpBLVowLTlcXC1fLl17MCwyNTB9W2EtekEtWjAtOV0kLyxcbiAgU0FGRV9QQVRIOiAvXlthLXpBLVowLTk6L1xcLV8ufl17MSw1MDB9JC8sXG4gIFNBRkVfVVNFUk5BTUU6IC9eW2EtekEtWjAtOV1bYS16QS1aMC05XFwtXy5dezAsMzB9W2EtekEtWjAtOV0kLyxcbiAgU0FGRV9DQVRFR09SWTogL15bYS16QS1aXVthLXpBLVowLTlcXC1fXXswLDIwfSQvLFxuICBTQUZFX0VNQUlMOiAvXlteXFxzQF17MSw2NH1AW15cXHNAXXsxLDI1M31cXC5bXlxcc0BdezEsNjN9JC8sICAvLyBSRkMgNTMyMSBjb21wbGlhbnQgbGltaXRzXG5cbiAgLy8gRmllbGQtYXBwcm9wcmlhdGUgcGF0dGVybnMgZm9yIHNhbml0aXplLXRoZW4tdmFsaWRhdGUgYXBwcm9hY2hcbiAgLy8gVGhlc2UgcGF0dGVybnMgdmFsaWRhdGUgQUZURVIgc2FuaXRpemF0aW9uLCBzbyB0aGV5IGFsbG93IGxlZ2l0aW1hdGUgY2hhcmFjdGVyc1xuXG4gIC8vIEZvciBuYW1lczogYWxsb3cgbGV0dGVycyAoaW5jbHVkaW5nIGFjY2VudGVkIExhdGluKSwgbnVtYmVycywgc3BhY2VzLCBhbmQgYmFzaWMgcHVuY3R1YXRpb25cbiAgLy8gVXNlcyBVbmljb2RlIHByb3BlcnR5IGVzY2FwZXMgZm9yIHByb3BlciBpbnRlcm5hdGlvbmFsIHN1cHBvcnRcbiAgU0FGRV9OQU1FOiAvXltcXHB7TH1cXHB7Tn1cXHNcXC1fLl0rJC91LFxuXG4gIC8vIEZvciBkZXNjcmlwdGlvbnM6IGFsbG93IGJyb2FkIHB1bmN0dWF0aW9uIGZvciByZWFkYWJpbGl0eVxuICAvLyBJbmNsdWRlcyBjb21tb24gc3ltYm9scyBmb3VuZCBpbiByZWFsLXdvcmxkIHBvcnRmb2xpbyBkZXNjcmlwdGlvbnM6XG4gIC8vICMoQyMvaGFzaHRhZ3MpICsoQysrKSAlKHBlcmNlbnRhZ2VzKSA9KGtleT12YWx1ZSkgQChlbWFpbC9oYW5kbGVzKVxuICAvLyAmKGFuZCkgfihhcHByb3hpbWF0ZSkgKihlbXBoYXNpcykgfChzZXBhcmF0b3JzKSB7fSh0ZW1wbGF0ZXMpXG4gIC8vIDw+KGFuZ2xlIGJyYWNrZXRzKSAkKGN1cnJlbmN5KSBeKGNhcmV0KSBgKGJhY2t0aWNrKVxuICAvLyDihpLihpTihpDihpHihpMoYXJyb3dzKSDinJPinJcoY2hlY2ttYXJrcykgYW5kIG90aGVyIFVuaWNvZGUgc3ltYm9sc1xuICBTQUZFX0RFU0NSSVBUSU9OOiAvXltcXHB7TH1cXHB7Tn1cXHB7UH1cXHB7U31cXHNAIyQlXiYqKz1+YHxcXFxcXSskL3UsXG5cbiAgLy8gRm9yIGNvbnRlbnQ6IG1vc3QgcGVybWlzc2l2ZSAtIENvbnRlbnRWYWxpZGF0b3IgaGFuZGxlcyBzZWN1cml0eSB0aHJlYXRzXG4gIC8vIFRoaXMgYWxsb3dzIGVzc2VudGlhbGx5IGFueXRoaW5nIHNpbmNlIGNvbnRlbnQgdmFsaWRhdGlvbiBpcyBzZXBhcmF0ZVxuICBTQUZFX0NPTlRFTlQ6IC9eW1xcc1xcU10qJC8sXG5cbiAgLy8gRm9yIGZpbGVuYW1lcyBpbiBjcmVhdGUgb3BlcmF0aW9uczogc3RyaWN0IEFTQ0lJIG9ubHkgKGRpZmZlcmVudCBmcm9tIFNBRkVfRklMRU5BTUUgd2hpY2ggaGFzIGxlbmd0aCBsaW1pdHMpXG4gIFNBRkVfRklMRU5BTUVfQ1JFQVRFOiAvXlthLXpBLVowLTlcXC1fLl0rJC9cbn07XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb25zIGZvciBlYWNoIHZhbGlkYXRpb24gcGF0dGVybi5cbiAqIFVzZWQgYnkgVmFsaWRhdGlvblNlcnZpY2UgdG8gcHJvZHVjZSBhY3Rpb25hYmxlIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIC0gYGFsbG93ZWRgOiBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHNldFxuICogLSBgY2hhclRlc3RgOiBzaW5nbGUtY2hhcmFjdGVyIHJlZ2V4IHRvIGlkZW50aWZ5IHdoaWNoIGNoYXJzIGFyZSBpbnZhbGlkXG4gKiAtIGBzdHJ1Y3R1cmFsYCAob3B0aW9uYWwpOiBleHRyYSBjb25zdHJhaW50IG5vdCBjYXB0dXJlZCBieSBjaGFyVGVzdFxuICovXG5leHBvcnQgY29uc3QgUEFUVEVSTl9ERVNDUklQVElPTlM6IFJlY29yZDxzdHJpbmcsIHtcbiAgYWxsb3dlZDogc3RyaW5nO1xuICBjaGFyVGVzdDogUmVnRXhwO1xuICBzdHJ1Y3R1cmFsPzogc3RyaW5nO1xufT4gPSB7XG4gIFNBRkVfTkFNRToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzJyxcbiAgICBjaGFyVGVzdDogL15bXFxwe0x9XFxwe059XFxzXFwtXy5dJC91LFxuICB9LFxuICBTQUZFX0RFU0NSSVBUSU9OOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIHN5bWJvbHMsIHNwYWNlcywgYW5kIGNvbW1vbiBwdW5jdHVhdGlvbicsXG4gICAgY2hhclRlc3Q6IC9eW1xccHtMfVxccHtOfVxccHtQfVxccHtTfVxcc0AjJCVeJiorPX5gfFxcXFxdJC91LFxuICB9LFxuICBTQUZFX0NPTlRFTlQ6IHtcbiAgICBhbGxvd2VkOiAnYW55IGNoYXJhY3RlcnMnLFxuICAgIGNoYXJUZXN0OiAvXltcXHNcXFNdJC8sXG4gIH0sXG4gIFNBRkVfRklMRU5BTUVfQ1JFQVRFOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05XFwtXy5dJC8sXG4gIH0sXG4gIFNBRkVfRklMRU5BTUU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fLl0kLyxcbiAgICBzdHJ1Y3R1cmFsOiAnbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYWxwaGFudW1lcmljIChtYXggMjUyIGNoYXJzKScsXG4gIH0sXG4gIFNBRkVfUEFUSDoge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBjb2xvbnMsIHNsYXNoZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCB0aWxkZXMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTk6L1xcLV8ufl0kLyxcbiAgfSxcbiAgU0FGRV9VU0VSTkFNRToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOVxcLV8uXSQvLFxuICAgIHN0cnVjdHVyYWw6ICdtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMgKDMtMzIgY2hhcnMpJyxcbiAgfSxcbiAgU0FGRV9DQVRFR09SWToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOVxcLV9dJC8sXG4gICAgc3RydWN0dXJhbDogJ211c3Qgc3RhcnQgd2l0aCBhIGxldHRlciAobWF4IDIxIGNoYXJzKScsXG4gIH0sXG4gIFNBRkVfRU1BSUw6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgZG90cywgaHlwaGVucywgdW5kZXJzY29yZXMsIEAnLFxuICAgIGNoYXJUZXN0OiAvXlteXFxzQF0kLyxcbiAgfSxcbn07XG4iXX0=
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGtDQUFrQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0Isc0JBQXNCLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUcsNEJBQTRCO0lBQ3RFLG1CQUFtQixFQUFFLEdBQUcsRUFBbUIsc0JBQXNCO0lBQ2pFLGNBQWMsRUFBRSxFQUFFLEVBQXdCLGdDQUFnQztJQUMxRSxrQkFBa0IsRUFBRSxNQUFNLEVBQWdCLHdEQUF3RDtJQUNsRyxlQUFlLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBZ0IscUNBQXFDO0lBQy9FLHlCQUF5QixFQUFFLElBQUksRUFBVyw2Q0FBNkM7SUFDdkYsYUFBYSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFXLHNCQUFzQjtJQUMvRCxtQkFBbUIsRUFBRSxHQUFHLEVBQWtCLDBCQUEwQjtJQUNwRSxvQkFBb0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFVLGtCQUFrQjtJQUMzRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQWMscUJBQXFCO0lBQzlELGtCQUFrQixFQUFFLEVBQUUsRUFBb0IsK0JBQStCO0lBQ3pFLG9CQUFvQixFQUFFLEVBQUUsRUFBa0IscURBQXFEO0lBRS9GLCtFQUErRTtJQUMvRSxvRkFBb0Y7SUFDcEYsZUFBZSxFQUFFLEdBQUcsRUFBc0IscUJBQXFCO0lBQy9ELHNCQUFzQixFQUFFLEdBQUcsRUFBZSw0QkFBNEI7SUFDdEUsOEJBQThCLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSwrQ0FBK0M7SUFDMUYscUJBQXFCLEVBQUUsRUFBRSxFQUFpQixzREFBc0Q7SUFDaEcsY0FBYyxFQUFFLEVBQUUsRUFBd0IsbUNBQW1DO0lBQzdFLHNCQUFzQixFQUFF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IGFuZCBsaW1pdHNcbiAqL1xuXG4vLyBTZWN1cml0eSBhbmQgcGVyZm9ybWFuY2UgbGltaXRzXG5leHBvcnQgY29uc3QgU0VDVVJJVFlfTElNSVRTID0ge1xuICBNQVhfUEVSU09OQV9TSVpFX0JZVEVTOiAxMDI0ICogMTAyNCAqIDIsICAvLyAyTUIgbWF4IHBlcnNvbmEgZmlsZSBzaXplXG4gIE1BWF9GSUxFTkFNRV9MRU5HVEg6IDI1NSwgICAgICAgICAgICAgICAgICAvLyBNYXggZmlsZW5hbWUgbGVuZ3RoXG4gIE1BWF9QQVRIX0RFUFRIOiAxMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heCBkaXJlY3RvcnkgZGVwdGggZm9yIHBhdGhzXG4gIE1BWF9DT05URU5UX0xFTkdUSDogNTAwMDAwLCAgICAgICAgICAgICAgIC8vIE1heCBlbGVtZW50IGNvbnRlbnQgbGVuZ3RoICg1MDBLQiwgfjEtNW1zIHJlZ2V4IHNjYW4pXG4gIE1BWF9ZQU1MX0xFTkdUSDogNjQgKiAxMDI0LCAgICAgICAgICAgICAgIC8vIE1heCBZQU1MIGZyb250bWF0dGVyIGxlbmd0aCAoNjRLQilcbiAgTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSDogMTAyNCwgICAgICAgICAgLy8gTWF4IGluZGl2aWR1YWwgbWV0YWRhdGEgZmllbGQgbGVuZ3RoICgxS0IpXG4gIE1BWF9GSUxFX1NJWkU6IDEwMjQgKiAxMDI0ICogMiwgICAgICAgICAgLy8gTWF4IGZpbGUgc2l6ZSAoMk1CKVxuICBSQVRFX0xJTUlUX1JFUVVFU1RTOiAxMDAsICAgICAgICAgICAgICAgICAvLyBNYXggcmVxdWVzdHMgcGVyIHdpbmRvd1xuICBSQVRFX0xJTUlUX1dJTkRPV19NUzogNjAgKiAxMDAwLCAgICAgICAgIC8vIDEgbWludXRlIHdpbmRvd1xuICBDQUNIRV9UVExfTVM6IDUgKiA2MCAqIDEwMDAsICAgICAgICAgICAgIC8vIDUgbWludXRlIGNhY2hlIFRUTFxuICBNQVhfU0VBUkNIX1JFU1VMVFM6IDUwLCAgICAgICAgICAgICAgICAgICAvLyBNYXggc2VhcmNoIHJlc3VsdHMgdG8gcmV0dXJuXG4gIE1BWF9CQVRDSF9PUEVSQVRJT05TOiA1MCwgICAgICAgICAgICAgICAgIC8vIE1heCBvcGVyYXRpb25zIHBlciBiYXRjaCByZXF1ZXN0IChJc3N1ZSAjMjIxLyM1NDMpXG5cbiAgLy8gRmllbGQtbGV2ZWwgdmFsaWRhdGlvbiBsaW1pdHMg4oCUIHVzZWQgYWNyb3NzIGVsZW1lbnQgbWFuYWdlcnMgYW5kIHZhbGlkYXRvcnMuXG4gIC8vIENlbnRyYWxpemVkIGhlcmUgc28gYSBzaW5nbGUgY2hhbmdlIGFwcGxpZXMgZXZlcnl3aGVyZSBhbmQgZ3JlcCBmaW5kcyBhbGwgdXNhZ2VzLlxuICBNQVhfTkFNRV9MRU5HVEg6IDEwMCwgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5hbWUgZmllbGRcbiAgTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDogNTAwLCAgICAgICAgICAgICAgLy8gRWxlbWVudCBkZXNjcmlwdGlvbiBmaWVsZFxuICBNQVhfRE9DVU1FTlRBVElPTl9GSUVMRF9MRU5HVEg6IDY0ICogMTAyNCwgLy8gTmVzdGVkIGhlbHAvZXhhbXBsZSBkb2NzIGluIFlBTUwvZnJvbnRtYXR0ZXJcbiAgTUFYX0VOVU1fRklFTERfTEVOR1RIOiAyMCwgICAgICAgICAgICAgICAgLy8gU2hvcnQgZW51bS1saWtlIGZpZWxkcyAoc3RyYXRlZ3ksIHJvbGUsIGFjdGl2YXRpb24pXG4gIE1BWF9UQUdfTEVOR1RIOiA1MCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGl2aWR1YWwgdGFnIC8gY2F0ZWdvcnkgdmFsdWVzXG4gIE1BWF9DT01NQU5EX0FSR19MRU5HVEg6IDEwMDAsICAgICAgICAgICAgIC8vIENMSSBjb21tYW5kIGFyZ3VtZW50IHZhbGlkYXRpb25cblxuICAvLyBSZWdleCB2YWxpZGF0aW9uIOKAlCBjb250ZW50IGxlbmd0aCBjYXBzIHBlciBwYXR0ZXJuIGNvbXBsZXhpdHkgdGllci5cbiAgLy8gVGhlc2UgYXJlIHRoZSBkZWZhdWx0cyB1c2VkIGJ5IFJlZ2V4VmFsaWRhdG9yIHdoZW4gbm8gZXhwbGljaXQgbWF4TGVuZ3RoIGlzIHBhc3NlZC5cbiAgLy8gTG93L21lZGl1bSBhcmUgc2FmZSBhdCBNQVhfQ09OVEVOVF9MRU5HVEggYmVjYXVzZSB0aGV5J3JlIE8obikgbGluZWFyIHRpbWUuXG4gIC8vIEhpZ2gtY29tcGxleGl0eSBwYXR0ZXJucyAobmVzdGVkIHF1YW50aWZpZXJzLCBSZURvUyByaXNrKSBhcmUgaGFyZC1jYXBwZWQgYXQgMUtCLlxuICBNQVhfUkVHRVhfSU5QVVRfTEVOR1RIOiAxMDAwMCwgICAgICAgICAgICAvLyBTYWZlUmVnZXggZGVmYXVsdCBmb3IgdXNlci1zdXBwbGllZCBwYXR0ZXJuc1xuXG4gIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gdGhyZXNob2xkIChTRUNVUklUWSBGSVggIzEyOTgpXG4gIC8vIE1heGltdW0gYWxsb3dlZCBhbGlhcy10by1hbmNob3IgYW1wbGlmaWNhdGlvbiByYXRpb1xuICAvLyBTZXQgdG8gNToxIC0gYmFsYW5jZXMgc2VjdXJpdHkgKGVhcmx5IERvUyBkZXRlY3Rpb24pIHdpdGggdXNhYmlsaXR5IChsZWdpdGltYXRlIFlBTUwgcGF0dGVybnMpXG4gIC8vIFJhdGlvbmFsZTogTW9zdCBsZWdpdGltYXRlIFlBTUwgdXNlcyDiiaQzw5cgYW1wbGlmaWNhdGlvbjsgNcOXIHByb3ZpZGVzIHNhZmV0eSBtYXJnaW5cbiAgLy8gd2hpbGUgYmxvY2tpbmcgZXhwb25lbnRpYWwgZXhwYW5zaW9uIGF0dGFja3MgdGhhdCB0eXBpY2FsbHkgc3RhcnQgYXQgMTDDlytcbiAgWUFNTF9CT01CX0FNUExJRklDQVRJT05fVEhSRVNIT0xEOiA1XG59O1xuXG4vKiogU2hhcmVkIHNldmVyaXR5IHR5cGUgdXNlZCBhY3Jvc3Mgc2VjdXJpdHkgdmFsaWRhdG9ycyAoIzE3ODItNykgKi9cbmV4cG9ydCB0eXBlIFNlY3VyaXR5U2V2ZXJpdHlMZXZlbCA9ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnO1xuXG4vKipcbiAqIEVzY2FsYXRlIHNldmVyaXR5IGxldmVsIOKAlCBoaWdoZXIgc2V2ZXJpdHkgdGFrZXMgcHJlY2VkZW5jZS5cbiAqIEV4dHJhY3RlZCBmcm9tIFVuaWNvZGVWYWxpZGF0b3IgYW5kIElucHV0Tm9ybWFsaXplciB0byBlbGltaW5hdGUgZHVwbGljYXRpb24gKCMxNzgyLTcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYWxhdGVTZXZlcml0eShcbiAgY3VycmVudDogU2VjdXJpdHlTZXZlcml0eUxldmVsIHwgdW5kZWZpbmVkLFxuICBuZXdTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eUxldmVsXG4pOiBTZWN1cml0eVNldmVyaXR5TGV2ZWwge1xuICBjb25zdCBsZXZlbHMgPSB7IGxvdzogMSwgbWVkaXVtOiAyLCBoaWdoOiAzLCBjcml0aWNhbDogNCB9O1xuICBjb25zdCBjdXJyZW50TGV2ZWwgPSBjdXJyZW50ID8gbGV2ZWxzW2N1cnJlbnRdIDogMDtcbiAgcmV0dXJuIGxldmVsc1tuZXdTZXZlcml0eV0gPiBjdXJyZW50TGV2ZWwgPyBuZXdTZXZlcml0eSA6IChjdXJyZW50IHx8ICdsb3cnKTtcbn1cblxuLy8gSW5wdXQgdmFsaWRhdGlvbiBwYXR0ZXJuc1xuZXhwb3J0IGNvbnN0IFZBTElEQVRJT05fUEFUVEVSTlMgPSB7XG4gIFNBRkVfRklMRU5BTUU6IC9eW2EtekEtWjAtOV1bYS16QS1aMC05XFwtXy5dezAsMjUwfVthLXpBLVowLTldJC8sXG4gIFNBRkVfUEFUSDogL15bYS16QS1aMC05Oi9cXC1fLn5dezEsNTAwfSQvLFxuICBTQUZFX1VTRVJOQU1FOiAvXlthLXpBLVowLTldW2EtekEtWjAtOVxcLV8uXXswLDMwfVthLXpBLVowLTldJC8sXG4gIFNBRkVfQ0FURUdPUlk6IC9eW2EtekEtWl1bYS16QS1aMC05XFwtX117MCwyMH0kLyxcbiAgU0FGRV9FTUFJTDogL15bXlxcc0BdezEsNjR9QFteXFxzQF17MSwyNTN9XFwuW15cXHNAXXsxLDYzfSQvLCAgLy8gUkZDIDUzMjEgY29tcGxpYW50IGxpbWl0c1xuXG4gIC8vIEZpZWxkLWFwcHJvcHJpYXRlIHBhdHRlcm5zIGZvciBzYW5pdGl6ZS10aGVuLXZhbGlkYXRlIGFwcHJvYWNoXG4gIC8vIFRoZXNlIHBhdHRlcm5zIHZhbGlkYXRlIEFGVEVSIHNhbml0aXphdGlvbiwgc28gdGhleSBhbGxvdyBsZWdpdGltYXRlIGNoYXJhY3RlcnNcblxuICAvLyBGb3IgbmFtZXM6IGFsbG93IGxldHRlcnMgKGluY2x1ZGluZyBhY2NlbnRlZCBMYXRpbiksIG51bWJlcnMsIHNwYWNlcywgYW5kIGJhc2ljIHB1bmN0dWF0aW9uXG4gIC8vIFVzZXMgVW5pY29kZSBwcm9wZXJ0eSBlc2NhcGVzIGZvciBwcm9wZXIgaW50ZXJuYXRpb25hbCBzdXBwb3J0XG4gIFNBRkVfTkFNRTogL15bXFxwe0x9XFxwe059XFxzXFwtXy5dKyQvdSxcblxuICAvLyBGb3IgZGVzY3JpcHRpb25zOiBhbGxvdyBicm9hZCBwdW5jdHVhdGlvbiBmb3IgcmVhZGFiaWxpdHlcbiAgLy8gSW5jbHVkZXMgY29tbW9uIHN5bWJvbHMgZm91bmQgaW4gcmVhbC13b3JsZCBwb3J0Zm9saW8gZGVzY3JpcHRpb25zOlxuICAvLyAjKEMjL2hhc2h0YWdzKSArKEMrKykgJShwZXJjZW50YWdlcykgPShrZXk9dmFsdWUpIEAoZW1haWwvaGFuZGxlcylcbiAgLy8gJihhbmQpIH4oYXBwcm94aW1hdGUpICooZW1waGFzaXMpIHwoc2VwYXJhdG9ycykge30odGVtcGxhdGVzKVxuICAvLyA8PihhbmdsZSBicmFja2V0cykgJChjdXJyZW5jeSkgXihjYXJldCkgYChiYWNrdGljaylcbiAgLy8g4oaS4oaU4oaQ4oaR4oaTKGFycm93cykg4pyT4pyXKGNoZWNrbWFya3MpIGFuZCBvdGhlciBVbmljb2RlIHN5bWJvbHNcbiAgU0FGRV9ERVNDUklQVElPTjogL15bXFxwe0x9XFxwe059XFxwe1B9XFxwe1N9XFxzQCMkJV4mKis9fmB8XFxcXF0rJC91LFxuXG4gIC8vIEZvciBjb250ZW50OiBtb3N0IHBlcm1pc3NpdmUgLSBDb250ZW50VmFsaWRhdG9yIGhhbmRsZXMgc2VjdXJpdHkgdGhyZWF0c1xuICAvLyBUaGlzIGFsbG93cyBlc3NlbnRpYWxseSBhbnl0aGluZyBzaW5jZSBjb250ZW50IHZhbGlkYXRpb24gaXMgc2VwYXJhdGVcbiAgU0FGRV9DT05URU5UOiAvXltcXHNcXFNdKiQvLFxuXG4gIC8vIEZvciBmaWxlbmFtZXMgaW4gY3JlYXRlIG9wZXJhdGlvbnM6IHN0cmljdCBBU0NJSSBvbmx5IChkaWZmZXJlbnQgZnJvbSBTQUZFX0ZJTEVOQU1FIHdoaWNoIGhhcyBsZW5ndGggbGltaXRzKVxuICBTQUZFX0ZJTEVOQU1FX0NSRUFURTogL15bYS16QS1aMC05XFwtXy5dKyQvXG59O1xuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgZWFjaCB2YWxpZGF0aW9uIHBhdHRlcm4uXG4gKiBVc2VkIGJ5IFZhbGlkYXRpb25TZXJ2aWNlIHRvIHByb2R1Y2UgYWN0aW9uYWJsZSBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiAtIGBhbGxvd2VkYDogc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGNoYXJhY3RlciBzZXRcbiAqIC0gYGNoYXJUZXN0YDogc2luZ2xlLWNoYXJhY3RlciByZWdleCB0byBpZGVudGlmeSB3aGljaCBjaGFycyBhcmUgaW52YWxpZFxuICogLSBgc3RydWN0dXJhbGAgKG9wdGlvbmFsKTogZXh0cmEgY29uc3RyYWludCBub3QgY2FwdHVyZWQgYnkgY2hhclRlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IFBBVFRFUk5fREVTQ1JJUFRJT05TOiBSZWNvcmQ8c3RyaW5nLCB7XG4gIGFsbG93ZWQ6IHN0cmluZztcbiAgY2hhclRlc3Q6IFJlZ0V4cDtcbiAgc3RydWN0dXJhbD86IHN0cmluZztcbn0+ID0ge1xuICBTQUZFX05BTUU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgc3BhY2VzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW1xccHtMfVxccHtOfVxcc1xcLV8uXSQvdSxcbiAgfSxcbiAgU0FGRV9ERVNDUklQVElPTjoge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBzeW1ib2xzLCBzcGFjZXMsIGFuZCBjb21tb24gcHVuY3R1YXRpb24nLFxuICAgIGNoYXJUZXN0OiAvXltcXHB7TH1cXHB7Tn1cXHB7UH1cXHB7U31cXHNAIyQlXiYqKz1+YHxcXFxcXSQvdSxcbiAgfSxcbiAgU0FGRV9DT05URU5UOiB7XG4gICAgYWxsb3dlZDogJ2FueSBjaGFyYWN0ZXJzJyxcbiAgICBjaGFyVGVzdDogL15bXFxzXFxTXSQvLFxuICB9LFxuICBTQUZFX0ZJTEVOQU1FX0NSRUFURToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOVxcLV8uXSQvLFxuICB9LFxuICBTQUZFX0ZJTEVOQU1FOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05XFwtXy5dJC8sXG4gICAgc3RydWN0dXJhbDogJ211c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYyAobWF4IDI1MiBjaGFycyknLFxuICB9LFxuICBTQUZFX1BBVEg6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgY29sb25zLCBzbGFzaGVzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cywgdGlsZGVzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05Oi9cXC1fLn5dJC8sXG4gIH0sXG4gIFNBRkVfVVNFUk5BTUU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fLl0kLyxcbiAgICBzdHJ1Y3R1cmFsOiAnbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYWxwaGFudW1lcmljICgzLTMyIGNoYXJzKScsXG4gIH0sXG4gIFNBRkVfQ0FURUdPUlk6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fXSQvLFxuICAgIHN0cnVjdHVyYWw6ICdtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKG1heCAyMSBjaGFycyknLFxuICB9LFxuICBTQUZFX0VNQUlMOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGRvdHMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBAJyxcbiAgICBjaGFyVGVzdDogL15bXlxcc0BdJC8sXG4gIH0sXG59O1xuIl19