@cqa-lib/cqa-ui 1.1.541 → 1.1.542-gamma.10

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 (66) hide show
  1. package/.github/workflows/README.md +8 -1
  2. package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
  3. package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +32 -3
  4. package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
  5. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
  6. package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
  7. package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +30 -10
  8. package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +129 -0
  9. package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +16 -5
  10. package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
  11. package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +50 -51
  12. package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.mjs +1 -1
  13. package/esm2020/lib/segment-control/segment-control.component.mjs +12 -4
  14. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +21 -3
  15. package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +59 -23
  16. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +21 -3
  17. package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +88 -47
  18. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +16 -3
  19. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +495 -29
  20. package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +24 -6
  21. package/esm2020/lib/templates/table-template.component.mjs +5 -3
  22. package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +3 -3
  23. package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +3 -3
  24. package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +32 -7
  25. package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.component.mjs +116 -0
  26. package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.models.mjs +2 -0
  27. package/esm2020/lib/test-case-details/data-library-panel/element-card.component.mjs +36 -0
  28. package/esm2020/lib/test-case-details/data-library-panel/test-data-profile-card.component.mjs +38 -0
  29. package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +43 -4
  30. package/esm2020/lib/test-case-details/test-case-details.models.mjs +3 -1
  31. package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +1 -1
  32. package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +137 -7
  33. package/esm2020/lib/ui-kit.module.mjs +23 -3
  34. package/esm2020/public-api.mjs +6 -1
  35. package/fesm2015/cqa-lib-cqa-ui.mjs +1478 -267
  36. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  37. package/fesm2020/cqa-lib-cqa-ui.mjs +1384 -194
  38. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  39. package/lib/execution-screen/condition-debug-step/condition-branch-editor.component.d.ts +26 -1
  40. package/lib/new-global-variable-dialog/global-variable-tags-input.component.d.ts +39 -0
  41. package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +5 -2
  42. package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +8 -0
  43. package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.d.ts +9 -10
  44. package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.d.ts +1 -1
  45. package/lib/segment-control/segment-control.component.d.ts +3 -1
  46. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +19 -1
  47. package/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.d.ts +23 -2
  48. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +19 -1
  49. package/lib/step-builder/step-builder-database/step-builder-database.component.d.ts +40 -11
  50. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +15 -1
  51. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +103 -4
  52. package/lib/templates/modular-table-template/modular-table-template.component.d.ts +15 -2
  53. package/lib/templates/table-template.component.d.ts +8 -1
  54. package/lib/test-case-details/api-edit-step/api-edit-step.component.d.ts +14 -1
  55. package/lib/test-case-details/data-library-panel/data-library-panel.component.d.ts +42 -0
  56. package/lib/test-case-details/data-library-panel/data-library-panel.models.d.ts +17 -0
  57. package/lib/test-case-details/data-library-panel/element-card.component.d.ts +13 -0
  58. package/lib/test-case-details/data-library-panel/test-data-profile-card.component.d.ts +13 -0
  59. package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +7 -0
  60. package/lib/test-case-details/test-case-details.models.d.ts +2 -0
  61. package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +23 -1
  62. package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +40 -6
  63. package/lib/ui-kit.module.d.ts +100 -96
  64. package/package.json +1 -1
  65. package/public-api.d.ts +5 -0
  66. package/styles.css +1 -1
@@ -4,10 +4,11 @@ import * as i0 from "@angular/core";
4
4
  import * as i1 from "../../custom-input/custom-input.component";
5
5
  import * as i2 from "@angular/material/slide-toggle";
6
6
  import * as i3 from "../../dynamic-select/dynamic-select-field.component";
7
- import * as i4 from "../../mixed-variable-input/mixed-variable-input.component";
8
- import * as i5 from "../../test-case-details/element-popup/element-form/element-form.component";
9
- import * as i6 from "@angular/common";
10
- import * as i7 from "../../pipes/camel-to-title.pipe";
7
+ import * as i4 from "../../segment-control/segment-control.component";
8
+ import * as i5 from "../../mixed-variable-input/mixed-variable-input.component";
9
+ import * as i6 from "../../test-case-details/element-popup/element-form/element-form.component";
10
+ import * as i7 from "@angular/common";
11
+ import * as i8 from "../../pipes/camel-to-title.pipe";
11
12
  export class TemplateVariablesFormComponent {
12
13
  constructor(cdr) {
13
14
  this.cdr = cdr;
@@ -42,6 +43,10 @@ export class TemplateVariablesFormComponent {
42
43
  this.hasMoreEnvironments = false;
43
44
  /** True while parent is loading environments (search or load more) */
44
45
  this.isLoadingEnvironments = false;
46
+ /** Global Data variables (workspace-scoped) for the new Global Data tab */
47
+ this.globalVariableOptions = [];
48
+ /** True while parent is loading global variables */
49
+ this.isLoadingGlobalVariables = false;
45
50
  /** True when the edited step is inside a FOR loop. */
46
51
  this.isInsideForLoopStep = false;
47
52
  /** True when the parent test case has a test data profile configured (testCase.testDataId is set). */
@@ -65,6 +70,7 @@ export class TemplateVariablesFormComponent {
65
70
  this.loadMoreUploads = new EventEmitter(); // Emit when user scrolls to load more uploads
66
71
  this.searchEnvironments = new EventEmitter(); // Emit when user searches for environments
67
72
  this.loadMoreEnvironments = new EventEmitter(); // Emit when user scrolls to load more environments
73
+ this.searchGlobalVariables = new EventEmitter(); // Emit when user searches global variables
68
74
  this.cancelElementForm = new EventEmitter(); // Emit when element form is cancelled
69
75
  this.elementFormVisibilityChange = new EventEmitter(); // Emit when element form visibility changes
70
76
  // Cache for select configs to avoid recalculating on every change detection
@@ -75,8 +81,19 @@ export class TemplateVariablesFormComponent {
75
81
  this.parameterSelectConfigCache = new Map();
76
82
  // Cache for environment select configs
77
83
  this.environmentSelectConfigCache = new Map();
84
+ // Cache for the AI Ask / AI Verify environment-name dropdown configs.
85
+ // MUST be cached: the config builder is called from the template binding on
86
+ // every change-detection cycle. Returning a fresh object/array/closure each
87
+ // time triggers cqa-dynamic-select to re-emit, which re-runs CD, which calls
88
+ // this getter again — a tight loop that pegs CPU at 100%.
89
+ this.environmentNameSelectConfigCache = new Map();
78
90
  // Cache for environment parameter select configs
79
91
  this.environmentParameterSelectConfigCache = new Map();
92
+ // Cache for global-variable select configs. Without this, the template's
93
+ // `[config]="getGlobalVariableSelectConfig(...)"` allocates a new config
94
+ // every CD pass — cqa-dynamic-select sees the new reference and triggers
95
+ // another CD, pegging the tab at 100% CPU.
96
+ this.globalVariableSelectConfigCache = new Map();
80
97
  // Cache for screen name select configs (for element variables)
81
98
  this.screenNameSelectConfigCache = new Map();
82
99
  // Cache for element select configs (filtered by screen name)
@@ -103,18 +120,63 @@ export class TemplateVariablesFormComponent {
103
120
  this.needsDataTypeDropdownCache = new Map();
104
121
  this.shouldShowDropdownCache = new Map();
105
122
  // Pre-computed data type options (static, no need to recreate)
123
+ // Order matches the design: Plain Text · Run Time · Env Variable · Global Data · Test Data Profile
106
124
  this.dataTypeOptions = [
107
125
  { id: 'plain-text', value: 'plain-text', name: 'Plain Text', label: 'Plain Text' },
108
- { id: 'parameter', value: 'parameter', name: '@|Parameter|', label: '@|Parameter|' },
109
- { id: 'runtime', value: 'runtime', name: '$|Runtime|', label: '$|Runtime|' },
110
- { id: 'environment', value: 'environment', name: '*|Environment|', label: '*|Environment|' }
126
+ { id: 'runtime', value: 'runtime', name: 'Run Time Variable', label: 'Run Time Variable' },
127
+ { id: 'environment', value: 'environment', name: 'Environment Variable', label: 'Environment Variable' },
128
+ { id: 'global', value: 'global', name: 'Global Data', label: 'Global Data' },
129
+ { id: 'parameter', value: 'parameter', name: 'Test Data Profile', label: 'Test Data Profile' }
111
130
  ];
131
+ /**
132
+ * Stable segment options for the Value Source segment strip. MUST be a field
133
+ * (not a getter) — see feedback_segment_control_no_getter_input.md: a getter
134
+ * triggers a CD loop in cqa-segment-control.
135
+ */
136
+ this.dataTypeSegments = [
137
+ { value: 'plain-text', label: 'Plain Text' },
138
+ { value: 'runtime', label: 'Run Time Variable' },
139
+ { value: 'environment', label: 'Environment Variable' },
140
+ { value: 'global', label: 'Global Data' },
141
+ { value: 'parameter', label: 'Test Data Profile' },
142
+ ];
143
+ /**
144
+ * Memoized filtered segments — drops Test Data Profile when neither TC nor FOR loop has a TDP.
145
+ * Held as a field (not a getter) so cqa-segment-control's [segments] stays a stable reference.
146
+ * Recomputed in ngOnChanges when isInsideForLoopStep / hasTestDataProfile change.
147
+ */
148
+ this.visibleDataTypeSegments = this.dataTypeSegments;
112
149
  this.createElementVisible = false;
113
150
  // Tracks active variable-syntax errors by variable name. The validator below
114
151
  // reads from this map so errors survive control re-validation on setValue().
115
152
  this.variableSyntaxErrors = new Map();
116
153
  this.controlsWithSyntaxValidator = new WeakSet();
117
154
  }
155
+ /**
156
+ * True only under Tier 1 of the env-on-test-case 3-tier resolution
157
+ * (testCase.environmentId set). Hides the redundant "Environment Name"
158
+ * picker — the env banner already states it.
159
+ * Tier 2 (legacy step env, depth-modal): deprecation message set → false.
160
+ * Tier 3 (workspace default): labelSuffix='(default)' + deprecation set → false.
161
+ * Both 'no suffix' AND 'no deprecation' are required because in the depth
162
+ * modal Tier 2 leaves suffix undefined but populates testCaseEnvironmentName
163
+ * with the legacy step env name — the deprecation message is what
164
+ * distinguishes Tier 1 from Tier 2.
165
+ */
166
+ get hideEnvironmentNameField() {
167
+ const name = (this.testCaseEnvironmentName ?? '').trim();
168
+ const suffix = (this.testCaseEnvironmentLabelSuffix ?? '').trim();
169
+ const deprecation = (this.environmentLegacyDeprecationMessage ?? '').trim();
170
+ return !!name && !suffix && !deprecation;
171
+ }
172
+ recomputeVisibleSegments() {
173
+ if (!this.isInsideForLoopStep && !this.hasTestDataProfile) {
174
+ this.visibleDataTypeSegments = this.dataTypeSegments.filter(s => s.value !== 'parameter');
175
+ }
176
+ else {
177
+ this.visibleDataTypeSegments = this.dataTypeSegments;
178
+ }
179
+ }
118
180
  onCreateElement(payload) {
119
181
  this.createElement.emit(payload);
120
182
  this.elementFormVisibilityChange.emit(false);
@@ -142,10 +204,13 @@ export class TemplateVariablesFormComponent {
142
204
  changes['hasMoreElements'] || changes['isLoadingElements'] ||
143
205
  changes['parameterOptions'] || changes['hasMoreParameters'] || changes['isLoadingParameters'] ||
144
206
  changes['environmentOptions'] || changes['hasMoreEnvironments'] || changes['isLoadingEnvironments'] ||
207
+ changes['globalVariableOptions'] || changes['isLoadingGlobalVariables'] || changes['testCaseEnvironmentName'] ||
208
+ changes['testCaseEnvironmentLabelSuffix'] || changes['environmentLegacyDeprecationMessage'] ||
145
209
  changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex'] || changes['defaultTestDataEndIndex'] || changes['isInsideForLoopStep'] || changes['hasTestDataProfile']) {
146
210
  // Drop dataType option cache so dropdown options are re-filtered on input change.
147
211
  if (changes['isInsideForLoopStep'] || changes['hasTestDataProfile']) {
148
212
  this.dataTypeSelectConfigCache.clear();
213
+ this.recomputeVisibleSegments();
149
214
  }
150
215
  // Only clear caches for changed inputs, not all caches
151
216
  if (changes['templateVariables'] || changes['variablesForm']) {
@@ -154,7 +219,9 @@ export class TemplateVariablesFormComponent {
154
219
  this.dataTypeSelectConfigCache.clear();
155
220
  this.parameterSelectConfigCache.clear();
156
221
  this.environmentSelectConfigCache.clear();
222
+ this.environmentNameSelectConfigCache.clear();
157
223
  this.environmentParameterSelectConfigCache.clear();
224
+ this.globalVariableSelectConfigCache.clear();
158
225
  this.selectedEnvironmentOptionsSnapshot.clear();
159
226
  this.selectedParameterProfileSnapshot.clear();
160
227
  this.screenNameSelectConfigCache.clear();
@@ -205,14 +272,49 @@ export class TemplateVariablesFormComponent {
205
272
  const searchVar = this.activeEnvironmentSearchVariable;
206
273
  this.environmentSelectConfigCache.delete(`${searchVar}_environment`);
207
274
  this.environmentParameterSelectConfigCache.delete(`${searchVar}_envParam`);
275
+ this.environmentNameSelectConfigCache.delete(`${searchVar}_environmentName`);
208
276
  this.activeEnvironmentSearchVariable = null;
209
277
  }
210
278
  else {
211
279
  // No specific variable triggered this — clear all (e.g. initial load, load more)
212
280
  this.environmentSelectConfigCache.clear();
213
281
  this.environmentParameterSelectConfigCache.clear();
282
+ this.environmentNameSelectConfigCache.clear();
214
283
  }
215
284
  }
285
+ // testCaseEnvironmentName arrives asynchronously (parent resolves env name
286
+ // via environmentService.show). When it lands, drop the env caches so the
287
+ // auto-default seed in getEnvironmentSelectConfig runs once and the
288
+ // "Environment Name" dropdown pre-selects the test case's env instead of
289
+ // showing the "Select Environment" placeholder. The synthetic env-name
290
+ // dropdown (AI Ask / AI Verify) also depends on these for its lock state
291
+ // and '(default)' suffix decoration, so its cache is dropped here too.
292
+ if (changes['testCaseEnvironmentName'] || changes['testCaseEnvironmentLabelSuffix']) {
293
+ this.environmentSelectConfigCache.clear();
294
+ this.environmentParameterSelectConfigCache.clear();
295
+ this.environmentNameSelectConfigCache.clear();
296
+ }
297
+ // Global Data dropdown's options/loading state changed — drop the global
298
+ // config cache so the next render rebuilds with the fresh list.
299
+ if (changes['globalVariableOptions'] || changes['isLoadingGlobalVariables']) {
300
+ this.globalVariableSelectConfigCache.clear();
301
+ }
302
+ // When globalVariableOptions arrive (or change) after templateVariables are loaded,
303
+ // backfill selectedGlobalVariableId on any global-type variable that has a name but
304
+ // still lacks the numeric id (the lookup couldn't run during initial init because
305
+ // options were empty).
306
+ if (changes['globalVariableOptions'] && this.templateVariables) {
307
+ this.backfillGlobalVariableIds();
308
+ }
309
+ // Proactively seed env-type variables with the test case's environment.
310
+ // Runs whenever any input that could unlock the seed changes — relying on
311
+ // a lazy seed inside getEnvironmentSelectConfig misses the case where the
312
+ // segment is clicked before environmentOptions / testCaseEnvironmentName
313
+ // both arrive.
314
+ if (changes['templateVariables'] || changes['environmentOptions'] ||
315
+ changes['testCaseEnvironmentName']) {
316
+ this.seedDefaultEnvironmentForVariables();
317
+ }
216
318
  // Initialize data types and raw values for test-data variables
217
319
  // NOTE: We do NOT include 'parameterOptions' here because it changes on every search,
218
320
  // which would reset the test-data type dropdown. Instead, parameterOptions initialization
@@ -480,6 +582,27 @@ export class TemplateVariablesFormComponent {
480
582
  this.cdr.markForCheck();
481
583
  }
482
584
  }
585
+ backfillGlobalVariableIds() {
586
+ if (!this.templateVariables || !this.templateVariables.length)
587
+ return;
588
+ const opts = this.globalVariableOptions || [];
589
+ if (!opts.length)
590
+ return;
591
+ this.templateVariables.forEach(variable => {
592
+ if (variable.dataType !== 'global')
593
+ return;
594
+ if (variable.selectedGlobalVariableId != null)
595
+ return;
596
+ const name = (variable.selectedGlobalVariable && variable.selectedGlobalVariable.trim())
597
+ || (variable.rawValue ? String(variable.rawValue).trim() : '');
598
+ if (!name)
599
+ return;
600
+ const matched = opts.find(g => g.name === name);
601
+ if (matched && matched.id != null && !isNaN(Number(matched.id))) {
602
+ variable.selectedGlobalVariableId = Number(matched.id);
603
+ }
604
+ });
605
+ }
483
606
  initializeTestDataVariables() {
484
607
  this.templateVariables.forEach((variable, index) => {
485
608
  if (this.needsDataTypeDropdown(variable)) {
@@ -725,6 +848,31 @@ export class TemplateVariablesFormComponent {
725
848
  }
726
849
  }
727
850
  }
851
+ // For global type, rehydrate selectedGlobalVariable + selectedGlobalVariableId from
852
+ // the parsed `{{name}}` value by looking the option up in globalVariableOptions.
853
+ if (finalDataType === 'global') {
854
+ const globalName = (variable.selectedGlobalVariable && variable.selectedGlobalVariable.trim())
855
+ || (rawValue ? String(rawValue).trim() : '');
856
+ if (globalName) {
857
+ variable.selectedGlobalVariable = globalName;
858
+ if (!variableGroup.get('selectedGlobalVariable')) {
859
+ variableGroup.addControl('selectedGlobalVariable', new FormControl(globalName));
860
+ }
861
+ else {
862
+ variableGroup.get('selectedGlobalVariable')?.setValue(globalName, { emitEvent: false });
863
+ }
864
+ if (variable.selectedGlobalVariableId == null && (this.globalVariableOptions || []).length > 0) {
865
+ const matched = (this.globalVariableOptions || []).find(g => g.name === globalName);
866
+ if (matched && matched.id != null && !isNaN(Number(matched.id))) {
867
+ variable.selectedGlobalVariableId = Number(matched.id);
868
+ }
869
+ }
870
+ if (variableGroup.get('value')) {
871
+ variableGroup.get('value')?.setValue(`{{${globalName}}}`, { emitEvent: false });
872
+ }
873
+ variable.value = this.formatTestDataValue(globalName, 'global');
874
+ }
875
+ }
728
876
  // For environment type, use finalDataType (from testDataList) — value may not parse as *|...| yet.
729
877
  if (finalDataType === 'environment') {
730
878
  const parsedEnv = this.parseTestDataValue(variable.value || '');
@@ -983,22 +1131,23 @@ export class TemplateVariablesFormComponent {
983
1131
  if (!value || typeof value !== 'string') {
984
1132
  return { dataType: 'plain-text', rawValue: '' };
985
1133
  }
986
- // Check for parameter format: @|value|
1134
+ // Global Data: `{{name}}` (new format — no leading `$`).
1135
+ if (value.startsWith('{{') && value.endsWith('}}')) {
1136
+ return { dataType: 'global', rawValue: value.slice(2, -2) };
1137
+ }
1138
+ // Parameter: @|name|
987
1139
  if (value.startsWith('@|') && value.endsWith('|')) {
988
1140
  return { dataType: 'parameter', rawValue: value.slice(2, -1) };
989
1141
  }
990
- // Check for runtime format: $|value|
991
- else if (value.startsWith('$|') && value.endsWith('|')) {
1142
+ // Runtime: $|name|
1143
+ if (value.startsWith('$|') && value.endsWith('|')) {
992
1144
  return { dataType: 'runtime', rawValue: value.slice(2, -1) };
993
1145
  }
994
- // Check for environment format: *|value|
995
- else if (value.startsWith('*|') && value.endsWith('|')) {
1146
+ // Environment: *|name|
1147
+ if (value.startsWith('*|') && value.endsWith('|')) {
996
1148
  return { dataType: 'environment', rawValue: value.slice(2, -1) };
997
1149
  }
998
- // Plain text (no formatting)
999
- else {
1000
- return { dataType: 'plain-text', rawValue: value };
1001
- }
1150
+ return { dataType: 'plain-text', rawValue: value };
1002
1151
  }
1003
1152
  formatTestDataValue(rawValue, dataType) {
1004
1153
  if (!rawValue) {
@@ -1011,6 +1160,8 @@ export class TemplateVariablesFormComponent {
1011
1160
  return `$|${rawValue}|`;
1012
1161
  case 'environment':
1013
1162
  return `*|${rawValue}|`;
1163
+ case 'global':
1164
+ return `{{${rawValue}}}`;
1014
1165
  case 'plain-text':
1015
1166
  default:
1016
1167
  return rawValue;
@@ -1179,6 +1330,11 @@ export class TemplateVariablesFormComponent {
1179
1330
  this.variableBooleanChange.emit({ name: variableName, value: value });
1180
1331
  }
1181
1332
  shouldShowDropdown(variable) {
1333
+ // Type-override short-circuit (mirrors needsDataTypeDropdown): never show
1334
+ // the generic dropdown for AI Ask / AI Verify's textarea or env-name fields.
1335
+ if (variable?.type === 'textarea' || variable?.type === 'environment-name') {
1336
+ return false;
1337
+ }
1182
1338
  // Use cache to avoid repeated calculations
1183
1339
  if (this.shouldShowDropdownCache.has(variable.name)) {
1184
1340
  return this.shouldShowDropdownCache.get(variable.name);
@@ -1190,6 +1346,12 @@ export class TemplateVariablesFormComponent {
1190
1346
  return result;
1191
1347
  }
1192
1348
  needsDataTypeDropdown(variable) {
1349
+ // Type-override short-circuit: AI Ask / AI Verify mark `query` as
1350
+ // 'textarea' and inject an 'environment-name' variable. Neither should
1351
+ // surface the data-type dropdown.
1352
+ if (variable?.type === 'textarea' || variable?.type === 'environment-name') {
1353
+ return false;
1354
+ }
1193
1355
  // Use cache to avoid repeated calculations
1194
1356
  if (this.needsDataTypeDropdownCache.has(variable.name)) {
1195
1357
  return this.needsDataTypeDropdownCache.get(variable.name);
@@ -1199,6 +1361,135 @@ export class TemplateVariablesFormComponent {
1199
1361
  this.needsDataTypeDropdownCache.set(variable.name, result);
1200
1362
  return result;
1201
1363
  }
1364
+ /** True when the variable is the synthetic AI Ask / AI Verify environment dropdown. */
1365
+ isEnvironmentNameType(variable) {
1366
+ return variable?.type === 'environment-name';
1367
+ }
1368
+ /**
1369
+ * Builds the dynamic-select config for the synthetic AI Ask / AI Verify
1370
+ * environment dropdown. Prepends a sentinel "None" entry (empty value) so
1371
+ * the user can explicitly clear the choice — the empty value round-trips
1372
+ * through onVariableValueChange → setValue('') → backend reads
1373
+ * `event.environment` as '' and treats it as no environment context.
1374
+ *
1375
+ * Deduplicates by environment name to mirror getUniqueEnvironments() used
1376
+ * by the existing test-data environment selector.
1377
+ */
1378
+ getEnvironmentNameSelectConfig(variable) {
1379
+ const cacheKey = `${variable.name}_environmentName`;
1380
+ const cached = this.environmentNameSelectConfigCache.get(cacheKey);
1381
+ if (cached) {
1382
+ return cached;
1383
+ }
1384
+ // `environmentOptions` is a flat list of (environment × parameter) tuples
1385
+ // shaped { id, name, value, environment }. We want one entry per unique
1386
+ // environment, mirroring getUniqueEnvironments() used by the existing
1387
+ // environment selector. Using `env.name` here would surface parameter
1388
+ // names instead of environment names — that was the previous bug.
1389
+ // Sentinel for the "None" option. Using the same string for `id` AND
1390
+ // `value` matters: cqa-dynamic-select writes the option's `id` to the
1391
+ // bound form control, so a mismatched `value: ''` would never round-trip
1392
+ // — picking None would store the literal '__none__' in the form, the
1393
+ // dropdown's pre-select would never match, and onChange wouldn't see a
1394
+ // truly "cleared" signal. Keeping them aligned avoids that whole class.
1395
+ const NONE_SENTINEL = '__none__';
1396
+ // env-on-test-case lock: when the test case binds an env (Tier 1) or
1397
+ // the parent forced a workspace-default fallback (Tier 3, suffix set),
1398
+ // the dropdown must be disabled. Tier 2 (legacy step env) leaves both
1399
+ // unset → dropdown stays editable so the user can pick / clear.
1400
+ const labelSuffix = (this.testCaseEnvironmentLabelSuffix ?? '').trim();
1401
+ const lockToTestCaseEnv = !!(this.testCaseEnvironmentName ?? '').trim() || !!labelSuffix;
1402
+ const uniqueEnvironments = this.getUniqueEnvironments();
1403
+ const envOptions = uniqueEnvironments.map(env => ({
1404
+ id: env.id,
1405
+ value: env.name,
1406
+ name: labelSuffix ? `${env.name} ${labelSuffix}` : env.name,
1407
+ label: labelSuffix ? `${env.name} ${labelSuffix}` : env.name,
1408
+ }));
1409
+ const none = {
1410
+ id: NONE_SENTINEL,
1411
+ value: NONE_SENTINEL,
1412
+ name: 'None',
1413
+ label: 'None',
1414
+ };
1415
+ // Pre-select on first render. Two paths:
1416
+ // (a) selectedEnvironmentId set → resolve env name from environmentOptions
1417
+ // (parses "env-74-test" → 74) and pre-set the form to that name.
1418
+ // (b) selectedEnvironmentId null → pre-set the form to NONE_SENTINEL so
1419
+ // the dropdown actively shows "None" instead of an empty placeholder
1420
+ // (per user request: "when environment id is not available or null
1421
+ // we should display none as selected").
1422
+ const variableGroup = this.getVariableFormGroup(variable.name);
1423
+ if (variable.selectedEnvironmentId != null) {
1424
+ const envName = this.resolveEnvironmentNameById(Number(variable.selectedEnvironmentId));
1425
+ if (envName) {
1426
+ variable.value = envName;
1427
+ variableGroup?.get('value')?.setValue(envName, { emitEvent: false });
1428
+ }
1429
+ else {
1430
+ // Env id present but not yet resolvable (env list still loading).
1431
+ // Leave variable.value alone; the cache invalidation in ngOnChanges
1432
+ // when environmentOptions arrives will rebuild this config.
1433
+ }
1434
+ }
1435
+ else {
1436
+ variable.value = NONE_SENTINEL;
1437
+ variableGroup?.get('value')?.setValue(NONE_SENTINEL, { emitEvent: false });
1438
+ }
1439
+ // The form group built by the parent (initializeVariablesForm) has
1440
+ // controls { name, value } per variable. cqa-dynamic-select binds
1441
+ // internally via formControlName, so the `key` here MUST match an
1442
+ // existing control in the group — using `variable.name` ('environment')
1443
+ // makes Angular look up a control that doesn't exist and throws
1444
+ // `Cannot read properties of null (reading '_rawValidators')`.
1445
+ const config = {
1446
+ key: 'value',
1447
+ placeholder: 'Select Environment',
1448
+ multiple: false,
1449
+ searchable: !lockToTestCaseEnv,
1450
+ serverSearch: !lockToTestCaseEnv,
1451
+ disabled: lockToTestCaseEnv,
1452
+ options: [none, ...envOptions],
1453
+ onChange: (value) => {
1454
+ // None / empty / nullish all collapse to the cleared signal.
1455
+ const isNone = value == null || value === '' || value === NONE_SENTINEL;
1456
+ const envName = isNone ? NONE_SENTINEL : String(value);
1457
+ this.onVariableValueChange(variable.name, envName);
1458
+ if (isNone) {
1459
+ // Cleared via None — explicitly drop the previous env id so the
1460
+ // parent's save logic (edit-depth-modal.onSave, lines ~1714-1735)
1461
+ // sees the cleared state and nulls testStep.environmentId.
1462
+ variable.selectedEnvironmentId = undefined;
1463
+ return;
1464
+ }
1465
+ // Mirror getEnvironmentSelectConfig: extract numeric env id from
1466
+ // environmentOptions[].id (format "env-74-test" → 74) and store on
1467
+ // the variable so edit-depth-modal.onSave() picks it up via the
1468
+ // existing dataType==='environment' + selectedEnvironmentId path
1469
+ // that derives step.environmentId.
1470
+ const envOption = this.environmentOptions.find(env => env.environment === envName);
1471
+ if (envOption) {
1472
+ const idMatch = envOption.id.match(/env-(\d+)-/);
1473
+ if (idMatch && idMatch[1]) {
1474
+ variable.selectedEnvironmentId = parseInt(idMatch[1], 10);
1475
+ }
1476
+ }
1477
+ },
1478
+ };
1479
+ this.environmentNameSelectConfigCache.set(cacheKey, config);
1480
+ return config;
1481
+ }
1482
+ /** Look up an environment's display name from the numeric id stored on the variable. */
1483
+ resolveEnvironmentNameById(envId) {
1484
+ if (envId == null || !Number.isFinite(envId))
1485
+ return null;
1486
+ const target = String(envId);
1487
+ const match = (this.environmentOptions || []).find(env => {
1488
+ const m = (env.id || '').match(/env-(\d+)-/);
1489
+ return m && m[1] === target;
1490
+ });
1491
+ return match ? match.environment : null;
1492
+ }
1202
1493
  getDataTypeOptions() {
1203
1494
  // Hide @|Parameter| when the step is not inside a FOR loop AND the test case has no test data profile.
1204
1495
  if (!this.isInsideForLoopStep && !this.hasTestDataProfile) {
@@ -1234,6 +1525,64 @@ export class TemplateVariablesFormComponent {
1234
1525
  getCurrentDataType(variable) {
1235
1526
  return variable.dataType || 'plain-text';
1236
1527
  }
1528
+ /** Whether the variable is currently using the Global Data tab. */
1529
+ isGlobalType(variable) {
1530
+ return (variable.dataType || 'plain-text') === 'global';
1531
+ }
1532
+ /** Whether the user has picked a global variable on this row. */
1533
+ hasSelectedGlobalVariable(variable) {
1534
+ return !!variable.selectedGlobalVariable;
1535
+ }
1536
+ /**
1537
+ * Build select config for the Global Data dropdown.
1538
+ * Each row inserts `{{name}}` on selection.
1539
+ */
1540
+ getGlobalVariableSelectConfig(variable, index) {
1541
+ const cacheKey = `${variable.name}_globalVariable`;
1542
+ const cached = this.globalVariableSelectConfigCache.get(cacheKey);
1543
+ if (cached) {
1544
+ return cached;
1545
+ }
1546
+ const variableGroup = this.getVariableFormGroup(variable.name);
1547
+ if (variableGroup && !variableGroup.get('selectedGlobalVariable')) {
1548
+ variableGroup.addControl('selectedGlobalVariable', new FormControl(variable.selectedGlobalVariable || ''));
1549
+ }
1550
+ const options = (this.globalVariableOptions || []).map(g => ({
1551
+ id: g.name,
1552
+ value: g.name,
1553
+ name: g.name,
1554
+ label: g.name,
1555
+ }));
1556
+ const config = {
1557
+ key: 'selectedGlobalVariable',
1558
+ placeholder: 'Search global variable',
1559
+ multiple: false,
1560
+ searchable: true,
1561
+ serverSearch: true,
1562
+ isLoading: this.isLoadingGlobalVariables,
1563
+ options,
1564
+ onSearch: (query) => this.searchGlobalVariables.emit(query),
1565
+ onChange: (value) => {
1566
+ const name = value != null ? String(value) : '';
1567
+ const matched = (this.globalVariableOptions || []).find(g => g.name === name);
1568
+ const numericId = matched && matched.id != null && !isNaN(Number(matched.id))
1569
+ ? Number(matched.id)
1570
+ : undefined;
1571
+ variable.selectedGlobalVariable = name;
1572
+ variable.selectedGlobalVariableId = numericId;
1573
+ variable.rawValue = name;
1574
+ const formatted = this.formatTestDataValue(name, 'global');
1575
+ variable.value = formatted;
1576
+ const grp = this.getVariableFormGroup(variable.name);
1577
+ if (grp?.get('value'))
1578
+ grp.get('value')?.setValue(formatted, { emitEvent: false });
1579
+ this.variableValueChange.emit({ name: variable.name, value: formatted });
1580
+ this.cdr.markForCheck();
1581
+ },
1582
+ };
1583
+ this.globalVariableSelectConfigCache.set(cacheKey, config);
1584
+ return config;
1585
+ }
1237
1586
  getRawValue(variable) {
1238
1587
  return variable.rawValue || '';
1239
1588
  }
@@ -1276,6 +1625,15 @@ export class TemplateVariablesFormComponent {
1276
1625
  return;
1277
1626
  // Update stored data type on the variable object
1278
1627
  variable.dataType = dataType;
1628
+ // Clear global-tab state if leaving the global tab.
1629
+ if (dataType !== 'global') {
1630
+ variable.selectedGlobalVariable = undefined;
1631
+ variable.selectedGlobalVariableId = undefined;
1632
+ const grp = this.getVariableFormGroup(variableName);
1633
+ if (grp?.get('selectedGlobalVariable')) {
1634
+ grp.get('selectedGlobalVariable')?.setValue('', { emitEvent: false });
1635
+ }
1636
+ }
1279
1637
  // Clear parameter and environment select config caches since data type changed
1280
1638
  this.testDataProfileSelectConfigCache.delete(`${variableName}_testDataProfile`);
1281
1639
  this.dataSetSelectConfigCache.delete(`${variableName}_dataSet`);
@@ -1358,12 +1716,19 @@ export class TemplateVariablesFormComponent {
1358
1716
  if (variableGroup.get('value')) {
1359
1717
  // For all types, start with empty value when switching
1360
1718
  variableGroup.get('value')?.setValue('', { emitEvent: false });
1361
- // For environment type, also clear selectedEnvironment
1362
- if (dataType === 'environment' && variableGroup.get('selectedEnvironment')) {
1363
- variableGroup.get('selectedEnvironment')?.setValue('', { emitEvent: false });
1364
- }
1365
1719
  }
1366
1720
  }
1721
+ // Env-on-test-case: when the user picks the "Environment Variable" segment,
1722
+ // pre-select the test case's env via the shared seed helper. Runs outside
1723
+ // the `variableGroup.get('value')` guard so it works even when the value
1724
+ // control hasn't been added yet for this variable.
1725
+ if (dataType === 'environment') {
1726
+ // Mark the variable as env-type so the seed pass picks it up.
1727
+ variable.dataType = 'environment';
1728
+ this.environmentSelectConfigCache.delete(`${variable.name}_environment`);
1729
+ this.environmentParameterSelectConfigCache.delete(`${variable.name}_envParam`);
1730
+ this.seedDefaultEnvironmentForVariables();
1731
+ }
1367
1732
  // If switching to parameter type, check for default values and initialize them
1368
1733
  if (dataType === 'parameter') {
1369
1734
  const index = this.templateVariables.indexOf(variable);
@@ -2048,6 +2413,65 @@ export class TemplateVariablesFormComponent {
2048
2413
  this.parameterForDataSetSelectConfigCache.set(cacheKey, config);
2049
2414
  return config;
2050
2415
  }
2416
+ /**
2417
+ * Env-on-test-case contract: a test case has exactly one environment, so the
2418
+ * "Environment Name" dropdown has nothing meaningful to choose from. We trust
2419
+ * `testCaseEnvironmentName` as the source of truth — even if it's not in the
2420
+ * loaded `environmentOptions` yet (those are async, env-scoped, and may be
2421
+ * empty when the env has no parameters). The dropdown's `optionsArray.unshift`
2422
+ * fallback in `getEnvironmentSelectConfig` ensures the value renders even when
2423
+ * missing from the option list.
2424
+ */
2425
+ resolveDefaultEnvironmentName() {
2426
+ const tcName = (this.testCaseEnvironmentName ?? '').trim();
2427
+ if (tcName) {
2428
+ return tcName;
2429
+ }
2430
+ const unique = this.getUniqueEnvironments();
2431
+ return unique.length === 1 ? unique[0].name : '';
2432
+ }
2433
+ /**
2434
+ * Proactive companion to `resolveDefaultEnvironmentName`: walks every env-type
2435
+ * template variable that hasn't been seeded yet and pre-fills its
2436
+ * `selectedEnvironment` (plus the matching form control) with the test case's
2437
+ * environment. Idempotent — variables that already have a selection are
2438
+ * skipped. Called from `ngOnChanges` whenever the inputs that could unlock the
2439
+ * seed (`testCaseEnvironmentName`, `environmentOptions`, `templateVariables`)
2440
+ * change.
2441
+ */
2442
+ seedDefaultEnvironmentForVariables() {
2443
+ const auto = this.resolveDefaultEnvironmentName();
2444
+ if (!auto) {
2445
+ return;
2446
+ }
2447
+ for (const variable of this.templateVariables ?? []) {
2448
+ if (!this.isEnvironmentType(variable)) {
2449
+ continue;
2450
+ }
2451
+ if (variable.selectedEnvironment) {
2452
+ continue;
2453
+ }
2454
+ variable.selectedEnvironment = auto;
2455
+ const envOption = this.environmentOptions.find(env => env.environment === auto);
2456
+ if (envOption) {
2457
+ const idMatch = envOption.id.match(/env-(\d+)-/);
2458
+ if (idMatch && idMatch[1]) {
2459
+ variable.selectedEnvironmentId = parseInt(idMatch[1], 10);
2460
+ }
2461
+ }
2462
+ const grp = this.getVariableFormGroup(variable.name);
2463
+ if (grp) {
2464
+ if (!grp.get('selectedEnvironment')) {
2465
+ grp.addControl('selectedEnvironment', new FormControl(auto));
2466
+ }
2467
+ else {
2468
+ grp.get('selectedEnvironment').setValue(auto, { emitEvent: false });
2469
+ }
2470
+ }
2471
+ this.environmentSelectConfigCache.delete(`${variable.name}_environment`);
2472
+ this.environmentParameterSelectConfigCache.delete(`${variable.name}_envParam`);
2473
+ }
2474
+ }
2051
2475
  /**
2052
2476
  * Get unique environments from environment options
2053
2477
  */
@@ -2084,11 +2508,13 @@ export class TemplateVariablesFormComponent {
2084
2508
  }
2085
2509
  // Get unique environments
2086
2510
  const uniqueEnvironments = this.getUniqueEnvironments();
2511
+ const labelSuffix = (this.testCaseEnvironmentLabelSuffix ?? '').trim();
2512
+ const decorateLabel = (envName) => labelSuffix ? `${envName} ${labelSuffix}` : envName;
2087
2513
  const optionsArray = uniqueEnvironments.map(env => ({
2088
2514
  id: env.id,
2089
2515
  value: env.name,
2090
2516
  name: env.name,
2091
- label: env.name
2517
+ label: decorateLabel(env.name)
2092
2518
  }));
2093
2519
  // Ensure the currently selected environment is always present in the options
2094
2520
  // (it may be missing if the list was refreshed by a search in another variable's dropdown)
@@ -2097,21 +2523,47 @@ export class TemplateVariablesFormComponent {
2097
2523
  id: variable.selectedEnvironment,
2098
2524
  value: variable.selectedEnvironment,
2099
2525
  name: variable.selectedEnvironment,
2100
- label: variable.selectedEnvironment
2526
+ label: decorateLabel(variable.selectedEnvironment)
2101
2527
  });
2102
2528
  }
2103
- // Ensure form control exists for environment selection
2529
+ // Ensure form control exists for environment selection. Auto-default to the
2530
+ // test case's env when the variable doesn't already have a selection — the
2531
+ // env-on-test-case contract leaves nothing to choose between.
2104
2532
  const variableGroup = this.getVariableFormGroup(variable.name);
2533
+ const autoDefault = this.resolveDefaultEnvironmentName();
2534
+ const currentEnv = variable.selectedEnvironment || autoDefault || '';
2535
+ if (currentEnv && currentEnv !== variable.selectedEnvironment) {
2536
+ variable.selectedEnvironment = currentEnv;
2537
+ const envOption = this.environmentOptions.find(env => env.environment === currentEnv);
2538
+ if (envOption) {
2539
+ const idMatch = envOption.id.match(/env-(\d+)-/);
2540
+ if (idMatch && idMatch[1]) {
2541
+ variable.selectedEnvironmentId = parseInt(idMatch[1], 10);
2542
+ }
2543
+ }
2544
+ }
2105
2545
  if (variableGroup && !variableGroup.get('selectedEnvironment')) {
2106
- const currentEnv = variable.selectedEnvironment || '';
2107
2546
  variableGroup.addControl('selectedEnvironment', new FormControl(currentEnv));
2108
2547
  }
2548
+ else if (variableGroup) {
2549
+ const ctrl = variableGroup.get('selectedEnvironment');
2550
+ if (ctrl && !ctrl.value && currentEnv) {
2551
+ ctrl.setValue(currentEnv, { emitEvent: false });
2552
+ }
2553
+ }
2554
+ // env-on-test-case: when the test case is bound to a specific environment,
2555
+ // there is no other valid choice — disable the dropdown so the user can't
2556
+ // accidentally pick a different env. Auto-select continues to populate it.
2557
+ // testCaseEnvironmentLabelSuffix is set only when the parent forces a tier-3
2558
+ // (workspace default) fallback, which also implies lock.
2559
+ const lockToTestCaseEnv = !!(this.testCaseEnvironmentName ?? '').trim() || !!labelSuffix;
2109
2560
  const config = {
2110
2561
  key: 'selectedEnvironment',
2111
2562
  placeholder: `Select Environment`,
2112
2563
  multiple: false,
2113
- searchable: true,
2114
- serverSearch: true,
2564
+ searchable: !lockToTestCaseEnv,
2565
+ serverSearch: !lockToTestCaseEnv,
2566
+ disabled: lockToTestCaseEnv,
2115
2567
  options: optionsArray,
2116
2568
  hasMore: this.hasMoreEnvironments,
2117
2569
  isLoading: this.isLoadingEnvironments,
@@ -2644,10 +3096,10 @@ export class TemplateVariablesFormComponent {
2644
3096
  }
2645
3097
  }
2646
3098
  TemplateVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2647
- TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", hasTestDataProfile: "hasTestDataProfile", isEditInDepth: "isEditInDepth", isDebug: "isDebug", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Textarea variables -->\n <ng-container *ngIf=\"variable.type === 'textarea'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <textarea class=\"cqa-w-full cqa-border cqa-border-gray-300 cqa-rounded-lg cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-gray-900 cqa-resize-y focus:cqa-outline-none focus:cqa-ring-1 focus:cqa-ring-indigo-500 focus:cqa-border-indigo-500\"\n [value]=\"variable.value || ''\"\n rows=\"4\"\n style=\"min-height: 42px;\"\n (input)=\"onVariableValueChange(variable.name, $any($event.target).value)\"></textarea>\n </div>\n </ng-container>\n\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && variable.type !== 'textarea' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Type<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <ng-container *ngIf=\"isPlainTextType(variable); else runtimePlainInput\">\n <cqa-mixed-variable-input\n [placeholder]=\"'Text Input'\"\n [value]=\"getRawValue(variable)\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\"\n (validityChange)=\"onTestDataValidityChange(variable.name, $event)\">\n </cqa-mixed-variable-input>\n </ng-container>\n <ng-template #runtimePlainInput>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.MixedVariableInputComponent, selector: "cqa-mixed-variable-input", inputs: ["value", "placeholder", "disabled"], outputs: ["valueChange", "validityChange"] }, { type: i5.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "elements", "hasMoreScreenNames", "isLoadingScreenNames", "hasMoreElements", "isLoadingElements", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "searchElements", "loadMoreElements", "searchElementsByScreenName", "cancel", "editInDepth"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "cqaCamelToTitle": i7.CamelToTitlePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
3099
+ TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", globalVariableOptions: "globalVariableOptions", isLoadingGlobalVariables: "isLoadingGlobalVariables", testCaseEnvironmentName: "testCaseEnvironmentName", testCaseEnvironmentLabelSuffix: "testCaseEnvironmentLabelSuffix", environmentLegacyDeprecationMessage: "environmentLegacyDeprecationMessage", testCaseTestDataId: "testCaseTestDataId", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", hasTestDataProfile: "hasTestDataProfile", isEditInDepth: "isEditInDepth", isDebug: "isDebug", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", searchGlobalVariables: "searchGlobalVariables", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Textarea variables -->\n <ng-container *ngIf=\"variable.type === 'textarea'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <textarea class=\"cqa-w-full cqa-border cqa-border-gray-300 cqa-rounded-lg cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-gray-900 cqa-resize-y focus:cqa-outline-none focus:cqa-ring-1 focus:cqa-ring-indigo-500 focus:cqa-border-indigo-500\"\n [value]=\"variable.value || ''\"\n rows=\"4\"\n style=\"min-height: 42px;\"\n (input)=\"onVariableValueChange(variable.name, $any($event.target).value)\"></textarea>\n </div>\n </ng-container>\n\n <!-- Environment-name dropdown (synthetic var injected for AI Ask / AI Verify only).\n Hidden under Tier 1 (testCase.environmentId set) \u2014 banner above already names the env.\n Tier 2 (legacy step env): visible + editable + deprecation note.\n Tier 3 (workspace default): visible + locked + '(default)' suffix on option labels + deprecation note. -->\n <ng-container *ngIf=\"isEnvironmentNameType(variable) && !hideEnvironmentNameField\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentNameSelectConfig(variable)\">\n </cqa-dynamic-select>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-mt-1 cqa-mb-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n </div>\n </ng-container>\n\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && variable.type !== 'textarea' && variable.type !== 'environment-name' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with Value Source segment strip -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n Value Source<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-segment-control\n *ngIf=\"!isEditInDepth\"\n [segments]=\"visibleDataTypeSegments\"\n [value]=\"variable.dataType || 'plain-text'\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDataTypeChange(variable.name, $any($event))\">\n </cqa-segment-control>\n <cqa-dynamic-select\n *ngIf=\"isEditInDepth\"\n [form]=\"getFormGroupAt(i)!\"\n [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable) && !hideEnvironmentNameField\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-mt-1 cqa-mb-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [style.height]=\"'fit-content'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isGlobalType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Global Data<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getGlobalVariableSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <ng-container *ngIf=\"isPlainTextType(variable); else runtimePlainInput\">\n <cqa-mixed-variable-input\n [placeholder]=\"'Text Input'\"\n [value]=\"getRawValue(variable)\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\"\n (validityChange)=\"onTestDataValidityChange(variable.name, $event)\">\n </cqa-mixed-variable-input>\n </ng-container>\n <ng-template #runtimePlainInput>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i5.MixedVariableInputComponent, selector: "cqa-mixed-variable-input", inputs: ["value", "placeholder", "disabled"], outputs: ["valueChange", "validityChange"] }, { type: i6.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "elements", "hasMoreScreenNames", "isLoadingScreenNames", "hasMoreElements", "isLoadingElements", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "searchElements", "loadMoreElements", "searchElementsByScreenName", "cancel", "editInDepth"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "cqaCamelToTitle": i8.CamelToTitlePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
2648
3100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, decorators: [{
2649
3101
  type: Component,
2650
- args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Textarea variables -->\n <ng-container *ngIf=\"variable.type === 'textarea'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <textarea class=\"cqa-w-full cqa-border cqa-border-gray-300 cqa-rounded-lg cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-gray-900 cqa-resize-y focus:cqa-outline-none focus:cqa-ring-1 focus:cqa-ring-indigo-500 focus:cqa-border-indigo-500\"\n [value]=\"variable.value || ''\"\n rows=\"4\"\n style=\"min-height: 42px;\"\n (input)=\"onVariableValueChange(variable.name, $any($event.target).value)\"></textarea>\n </div>\n </ng-container>\n\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && variable.type !== 'textarea' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Type<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <ng-container *ngIf=\"isPlainTextType(variable); else runtimePlainInput\">\n <cqa-mixed-variable-input\n [placeholder]=\"'Text Input'\"\n [value]=\"getRawValue(variable)\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\"\n (validityChange)=\"onTestDataValidityChange(variable.name, $event)\">\n </cqa-mixed-variable-input>\n </ng-container>\n <ng-template #runtimePlainInput>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
3102
+ args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Textarea variables -->\n <ng-container *ngIf=\"variable.type === 'textarea'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <textarea class=\"cqa-w-full cqa-border cqa-border-gray-300 cqa-rounded-lg cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-gray-900 cqa-resize-y focus:cqa-outline-none focus:cqa-ring-1 focus:cqa-ring-indigo-500 focus:cqa-border-indigo-500\"\n [value]=\"variable.value || ''\"\n rows=\"4\"\n style=\"min-height: 42px;\"\n (input)=\"onVariableValueChange(variable.name, $any($event.target).value)\"></textarea>\n </div>\n </ng-container>\n\n <!-- Environment-name dropdown (synthetic var injected for AI Ask / AI Verify only).\n Hidden under Tier 1 (testCase.environmentId set) \u2014 banner above already names the env.\n Tier 2 (legacy step env): visible + editable + deprecation note.\n Tier 3 (workspace default): visible + locked + '(default)' suffix on option labels + deprecation note. -->\n <ng-container *ngIf=\"isEnvironmentNameType(variable) && !hideEnvironmentNameField\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentNameSelectConfig(variable)\">\n </cqa-dynamic-select>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-mt-1 cqa-mb-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n </div>\n </ng-container>\n\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && variable.type !== 'textarea' && variable.type !== 'environment-name' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with Value Source segment strip -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n Value Source<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-segment-control\n *ngIf=\"!isEditInDepth\"\n [segments]=\"visibleDataTypeSegments\"\n [value]=\"variable.dataType || 'plain-text'\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDataTypeChange(variable.name, $any($event))\">\n </cqa-segment-control>\n <cqa-dynamic-select\n *ngIf=\"isEditInDepth\"\n [form]=\"getFormGroupAt(i)!\"\n [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable) && !hideEnvironmentNameField\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-mt-1 cqa-mb-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [style.height]=\"'fit-content'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isGlobalType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Global Data<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getGlobalVariableSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <ng-container *ngIf=\"isPlainTextType(variable); else runtimePlainInput\">\n <cqa-mixed-variable-input\n [placeholder]=\"'Text Input'\"\n [value]=\"getRawValue(variable)\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\"\n (validityChange)=\"onTestDataValidityChange(variable.name, $event)\">\n </cqa-mixed-variable-input>\n </ng-container>\n <ng-template #runtimePlainInput>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label | cqaCamelToTitle }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
2651
3103
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { templateVariables: [{
2652
3104
  type: Input
2653
3105
  }], variablesForm: [{
@@ -2686,6 +3138,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2686
3138
  type: Input
2687
3139
  }], isLoadingEnvironments: [{
2688
3140
  type: Input
3141
+ }], globalVariableOptions: [{
3142
+ type: Input
3143
+ }], isLoadingGlobalVariables: [{
3144
+ type: Input
3145
+ }], testCaseEnvironmentName: [{
3146
+ type: Input
3147
+ }], testCaseEnvironmentLabelSuffix: [{
3148
+ type: Input
3149
+ }], environmentLegacyDeprecationMessage: [{
3150
+ type: Input
3151
+ }], testCaseTestDataId: [{
3152
+ type: Input
2689
3153
  }], defaultTestDataProfileId: [{
2690
3154
  type: Input
2691
3155
  }], defaultTestDataStartIndex: [{
@@ -2734,6 +3198,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2734
3198
  type: Output
2735
3199
  }], loadMoreEnvironments: [{
2736
3200
  type: Output
3201
+ }], searchGlobalVariables: [{
3202
+ type: Output
2737
3203
  }], cancelElementForm: [{
2738
3204
  type: Output
2739
3205
  }], elementFormVisibilityChange: [{
@@ -2741,4 +3207,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2741
3207
  }], createElementVisible: [{
2742
3208
  type: Input
2743
3209
  }] } });
2744
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUErQ2pHLE1BQU0sT0FBTyw4QkFBOEI7SUEySHpDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBMUhqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxD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aUI7c0JBQTFCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQTBERSxvQkFBb0I7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgVmFsaWRhdG9yRm4sIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZW1lbnRDcmVhdGVQYXlsb2FkLCBTY3JlZW5OYW1lT3B0aW9uIH0gZnJvbSAnLi4vLi4vdGVzdC1jYXNlLWRldGFpbHMvZWxlbWVudC1wb3B1cC9lbGVtZW50LXBvcHVwLWZvcm0tZGF0YSc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIHNjcmVlbk5hbWVJZD86IG51bWJlcjtcbiAgc2NyZWVuTmFtZU9iaj86IGFueTsgLy8gRml4ZWQ6IHVzZSAnYW55JyBzaW5jZSAnRWxlbWVudFNjcmVlbk5hbWUnIGlzIG5vdCBkZWZpbmVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVWYXJpYWJsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGF0YUtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBtYW5hZ2luZyB2YXJpYWJsZSBzdGF0ZVxuICBkYXRhVHlwZT86ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JztcbiAgcmF3VmFsdWU/OiBzdHJpbmc7IC8vIFJhdyB2YWx1ZSB3aXRob3V0IGZvcm1hdHRpbmcgKGZvciBzZWxlY3QgZHJvcGRvd25zKVxuICBzZWxlY3RlZEVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBJRCAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkRGF0YVNldD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZERhdGFTZXRTdGFydD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgc3RhcnQgbmFtZSAoZm9yIEZPUiBsb29wIGNvbnRleHQpXG4gIHNlbGVjdGVkRGF0YVNldEVuZD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgZW5kIG5hbWUgKGZvciBGT1IgbG9vcCBjb250ZXh0KVxuICBzZWxlY3RlZFNjcmVlbk5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVsZW1lbnQgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRMb2NhdG9yPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IGxvY2F0b3IgdmFsdWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnROYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVXBsb2FkIG9wdGlvbnMgZm9yIHVwbG9hZCBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgdXBsb2FkcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVVwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgdXBsb2FkcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nVXBsb2FkczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIGVuZCBpbmRleCBmcm9tIEZPUiBsb29wIGNvbnRleHQgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGVkaXRlZCBzdGVwIGlzIGluc2lkZSBhIEZPUiBsb29wLiAqL1xuICBASW5wdXQoKSBpc0luc2lkZUZvckxvb3BTdGVwOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHBhcmVudCB0ZXN0IGNhc2UgaGFzIGEgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlndXJlZCAodGVzdENhc2UudGVzdERhdGFJZCBpcyBzZXQpLiAqL1xuICBASW5wdXQoKSBoYXNUZXN0RGF0YVByb2ZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBAT3V0cHV0KCkgdmFyaWFibGVWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHZhcmlhYmxlQm9vbGVhbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBtZXRhZGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBsb2FkIG1vcmUgaXMgcmVxdWVzdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZWxlbWVudHNcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNjcmVlbk5hbWVJZDogbnVtYmVyOyBzZWFyY2hUZXJtPzogc3RyaW5nIH0+KCk7IC8vIEVtaXQgd2hlbiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RWxlbWVudENyZWF0ZVBheWxvYWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCBwYXlsb2FkXG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGNyZWF0ZSBhIG5ldyBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBzZWFyY2hVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciB1cGxvYWRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVVwbG9hZHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHVwbG9hZHNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBjYW5jZWxFbGVtZW50Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSBpcyBjYW5jZWxsZWRcbiAgQE91dHB1dCgpIGVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgXG4gIC8vIENhY2hlIGZvciBzZWxlY3QgY29uZmlncyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHR5cGUgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBkYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIHBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNjcmVlbiBuYW1lIHNlbGVjdCBjb25maWdzIChmb3IgZWxlbWVudCB2YXJpYWJsZXMpXG4gIHByaXZhdGUgc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVsZW1lbnQgc2VsZWN0IGNvbmZpZ3MgKGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICBwcml2YXRlIGVsZW1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlncyAoZmlyc3QgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMpXG4gIHByaXZhdGUgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZGF0YSBzZXQgc2VsZWN0IGNvbmZpZ3MgKHNlY29uZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIGRhdGEgc2V0cyBmcm9tIHNlbGVjdGVkIHByb2ZpbGUpXG4gIHByaXZhdGUgZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICAvLyBUcmFjayB3aGljaCB2YXJpYWJsZSB0cmlnZ2VyZWQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgc2VhcmNoICh0byBhdm9pZCByZXNldHRpbmcgb3RoZXIgdmFyaWFibGVzKVxuICBwcml2YXRlIGFjdGl2ZUVudmlyb25tZW50U2VhcmNoVmFyaWFibGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvLyBUcmFjayB3aGljaCB2YXJpYWJsZSB0cmlnZ2VyZWQgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNlYXJjaCAodG8gYXZvaWQgcmVzZXR0aW5nIG90aGVyIHZhcmlhYmxlcycgcHJvZmlsZXMpXG4gIHByaXZhdGUgYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvLyBTbmFwc2hvdCBvZiB0aGUgc2VsZWN0ZWQgVGVzdERhdGEgcHJvZmlsZSBmb3IgZWFjaCB2YXJpYWJsZSwgc28gdGhhdCBhIHNlYXJjaCBpbiBhbm90aGVyIHZhcmlhYmxlJ3NcbiAgLy8gZHJvcGRvd24gZG9lc24ndCBsb3NlIHRoZSBwcm9maWxlL2RhdGFzZXQvcGFyYW1ldGVyIHdoZW4gcGFyYW1ldGVyT3B0aW9ucyBpcyB0ZW1wb3JhcmlseSBmaWx0ZXJlZC5cbiAgcHJpdmF0ZSBzZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdDogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAvLyBTbmFwc2hvdCBvZiBlbnZpcm9ubWVudE9wdGlvbnMgZm9yIGVhY2ggdmFyaWFibGUncyBzZWxlY3RlZCBlbnZpcm9ubWVudCxcbiAgLy8gc28gdGhhdCBhIHNlYXJjaCBpbiBhbm90aGVyIHZhcmlhYmxlJ3MgZHJvcGRvd24gZG9lc24ndCBsb3NlIHRoZSBwYXJhbWV0ZXIgbGlzdC5cbiAgcHJpdmF0ZSBzZWxlY3RlZEVudmlyb25tZW50T3B0aW9uc1NuYXBzaG90OiBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzdGFydC9lbmQgY29uZmlncyAoRk9SIGxvb3AgY29udGV4dClcbiAgcHJpdmF0ZSBkYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3MgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICBwcml2YXRlIHBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgbmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNob3VsZFNob3dEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIFByZS1jb21wdXRlZCBkYXRhIHR5cGUgb3B0aW9ucyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3BsYWluLXRleHQnLCB2YWx1ZTogJ3BsYWluLXRleHQnLCBuYW1lOiAnUGxhaW4gVGV4dCcsIGxhYmVsOiAnUGxhaW4gVGV4dCcgfSxcbiAgICB7IGlkOiAncGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInLCBuYW1lOiAnQHxQYXJhbWV0ZXJ8JywgbGFiZWw6ICdAfFBhcmFtZXRlcnwnIH0sXG4gICAgeyBpZDogJ3J1bnRpbWUnLCB2YWx1ZTogJ3J1bnRpbWUnLCBuYW1lOiAnJHxSdW50aW1lfCcsIGxhYmVsOiAnJHxSdW50aW1lfCcgfSxcbiAgICB7IGlkOiAnZW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JywgbmFtZTogJyp8RW52aXJvbm1lbnR8JywgbGFiZWw6ICcqfEVudmlyb25tZW50fCcgfVxuICBdO1xuXG4gIEBJbnB1dCgpIGNyZWF0ZUVsZW1lbnRWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25DcmVhdGVFbGVtZW50KHBheWxvYWQ6IEVsZW1lbnRDcmVhdGVQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50LmVtaXQocGF5bG9hZCk7XG4gICAgdGhpcy5lbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNhbmNlbEVsZW1lbnRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYoY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkIGNoYW5nZWRcIiwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10pO1xuICAgIH1cbiAgICBpZihjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCBjaGFuZ2VkXCIsIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSk7XG4gICAgfVxuICAgIGlmKGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YUVuZEluZGV4J10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXggY2hhbmdlZFwiLCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddKTtcbiAgICB9XG4gICAgaWYoY2hhbmdlc1snaXNJbnNpZGVGb3JMb29wU3RlcCddKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImlzSW5zaWRlRm9yTG9vcFN0ZXAgY2hhbmdlZFwiLCBjaGFuZ2VzWydpc0luc2lkZUZvckxvb3BTdGVwJ10pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10gfHwgY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddIHx8IGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSB8fCBjaGFuZ2VzWydoYXNUZXN0RGF0YVByb2ZpbGUnXSkge1xuXG4gICAgICAvLyBEcm9wIGRhdGFUeXBlIG9wdGlvbiBjYWNoZSBzbyBkcm9wZG93biBvcHRpb25zIGFyZSByZS1maWx0ZXJlZCBvbiBpbnB1dCBjaGFuZ2UuXG4gICAgICBpZiAoY2hhbmdlc1snaXNJbnNpZGVGb3JMb29wU3RlcCddIHx8IGNoYW5nZXNbJ2hhc1Rlc3REYXRhUHJvZmlsZSddKSB7XG4gICAgICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBPbmx5IGNsZWFyIGNhY2hlcyBmb3IgY2hhbmdlZCBpbnB1dHMsIG5vdCBhbGwgY2FjaGVzXG4gICAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10pIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlcyB3aGVuIHRlbXBsYXRlIHZhcmlhYmxlcyBvciBmb3JtIGNoYW5nZXNcbiAgICAgICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudE9wdGlvbnNTbmFwc2hvdC5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVyUHJvZmlsZVNuYXBzaG90LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBhbmQgc2NyZWVuIG5hbWUgY2FjaGVzIG9ubHkgd2hlbiB0aGVpciBvcHRpb25zIGNoYW5nZVxuICAgICAgaWYgKGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlU2NyZWVuTmFtZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdTY3JlZW5OYW1lcyddKSB7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIGNoYW5nZWRcIiwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGUpIHtcbiAgICAgICAgICAvLyBPbmx5IGNsZWFyL3JlYnVpbGQgY2FjaGUgZm9yIHRoZSB2YXJpYWJsZSB0aGF0IHRyaWdnZXJlZCB0aGUgc2VhcmNoXG4gICAgICAgICAgY29uc3Qgc2VhcmNoVmFyID0gdGhpcy5hY3RpdmVQYXJhbWV0ZXJTZWFyY2hWYXJpYWJsZTtcbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X2RhdGFTZXRgKTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X2RhdGFTZXRSYW5nZV9zdGFydGApO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3NlYXJjaFZhcn1fZGF0YVNldFJhbmdlX2VuZGApO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X3BhcmFtRm9yRGF0YVNldGApO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3NlYXJjaFZhcn1fcGFyYW1ldGVyYCk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVQYXJhbWV0ZXJTZWFyY2hWYXJpYWJsZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gc3BlY2lmaWMgdmFyaWFibGUgdHJpZ2dlcmVkIHRoaXMg4oCUIGNsZWFyIGFsbCAoZS5nLiBpbml0aWFsIGxvYWQsIGxvYWQgbW9yZSlcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ3VwbG9hZE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlVXBsb2FkcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1VwbG9hZHMnXSkge1xuICAgICAgICAvLyBDbGVhciBzZWxlY3QgY29uZmlnIGNhY2hlIGZvciB1cGxvYWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbnZpcm9ubWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbnZpcm9ubWVudHMnXSkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVFbnZpcm9ubWVudFNlYXJjaFZhcmlhYmxlKSB7XG4gICAgICAgICAgLy8gT25seSBjbGVhci9yZWJ1aWxkIGNhY2hlIGZvciB0aGUgdmFyaWFibGUgdGhhdCB0cmlnZ2VyZWQgdGhlIHNlYXJjaFxuICAgICAgICAgIGNvbnN0IHNlYXJjaFZhciA9IHRoaXMuYWN0aXZlRW52aXJvbm1lbnRTZWFyY2hWYXJpYWJsZTtcbiAgICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3NlYXJjaFZhcn1fZW52aXJvbm1lbnRgKTtcbiAgICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3NlYXJjaFZhcn1fZW52UGFyYW1gKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUVudmlyb25tZW50U2VhcmNoVmFyaWFibGUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNwZWNpZmljIHZhcmlhYmxlIHRyaWdnZXJlZCB0aGlzIOKAlCBjbGVhciBhbGwgKGUuZy4gaW5pdGlhbCBsb2FkLCBsb2FkIG1vcmUpXG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzIGFuZCByYXcgdmFsdWVzIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzXG4gICAgICAvLyBOT1RFOiBXZSBkbyBOT1QgaW5jbHVkZSAncGFyYW1ldGVyT3B0aW9ucycgaGVyZSBiZWNhdXNlIGl0IGNoYW5nZXMgb24gZXZlcnkgc2VhcmNoLFxuICAgICAgLy8gd2hpY2ggd291bGQgcmVzZXQgdGhlIHRlc3QtZGF0YSB0eXBlIGRyb3Bkb3duLiBJbnN0ZWFkLCBwYXJhbWV0ZXJPcHRpb25zIGluaXRpYWxpemF0aW9uXG4gICAgICAvLyBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVsb3cgd2l0aCBhIGZpcnN0Q2hhbmdlIGd1YXJkLlxuICAgICAgaWYgKChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddIHx8IGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSkgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiB0ZW1wbGF0ZVZhcmlhYmxlcyBjaGFuZ2VkLCBpbml0aWFsaXplIHNjcmVlbiBuYW1lIGZvcm0gY29udHJvbHMgZm9yIGVsZW1lbnQgdmFyaWFibGVzIHRoYXQgaGF2ZSBzY3JlZW5OYW1lSWRcbiAgICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHNjcmVlbiBuYW1lIGZvcm0gY29udHJvbCB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA/IFN0cmluZyh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIDogJ25vbmUnO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgaXQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA/IFN0cmluZyh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIDogJ25vbmUnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IGV4cGVjdGVkVmFsdWUgJiYgY3VycmVudFZhbHVlICE9PSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoZXhwZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBzY3JlZW5OYW1lSWQgYnV0IG5vdCBzZWxlY3RlZFNjcmVlbk5hbWUsIGZpbmQgaXQgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSAmJiB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ1NjcmVlbk5hbWUgPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nU2NyZWVuTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgdXBkYXRlIHNlbGVjdGVkU2NyZWVuTmFtZSBmb3IgdmFyaWFibGVzIHRoYXQgaGF2ZSBzY3JlZW5OYW1lSWRcbiAgICAgIGlmIChjaGFuZ2VzWydzY3JlZW5OYW1lT3B0aW9ucyddICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCAmJiAhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1NjcmVlbk5hbWUgPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IG1hdGNoaW5nU2NyZWVuTmFtZS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGVsZW1lbnRPcHRpb25zIG9yIHNjcmVlbk5hbWVPcHRpb25zIGNoYW5nZWQsIHJlLWluaXRpYWxpemUgZWxlbWVudCB2YXJpYWJsZXNcbiAgICAgIGlmICgoY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydzY3JlZW5OYW1lT3B0aW9ucyddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIC8vIENsZWFyIGVsZW1lbnQgY29uZmlnIGNhY2hlIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gZWxlbWVudHMgYXJlIGxvYWRlZCBhZnRlciBzY3JlZW4gbmFtZSBzZWxlY3Rpb24sIHRoZSBjb25maWcgaXMgcmVjb21wdXRlZFxuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgICAvLyBJZiBubyBlbGVtZW50SWQsIGRvbid0IHNlbGVjdCBhbnl0aGluZyAtIHVzZSBkZWZhdWx0IHZhbHVlc1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudElkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogRmluZCBieSBlbGVtZW50SWQgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAyOiBGaW5kIGJ5IGVsZW1lbnROYW1lIGlmIGVsZW1lbnRJZCBzZWFyY2ggZGlkbid0IGZpbmQgaXQgKGZhbGxiYWNrKVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5uYW1lID09PSB2YXJpYWJsZS5lbGVtZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDM6IEZpbmQgYnkgbG9jYXRvclZhbHVlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5sb2NhdG9yVmFsdWUgPT09IGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIG5hbWUgaW5mbyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gZWxlbWVudC5zY3JlZW5OYW1lSWQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBzY3JlZW5OYW1lT2JqLm5hbWU7IGZhbGwgYmFjayB0byBzY3JlZW5OYW1lT3B0aW9ucyBsb29rdXAgd2hlbiBzY3JlZW5OYW1lT2JqXG4gICAgICAgICAgICAgICAgICAgIC8vIGlzIGFic2VudCAoZS5nLiBlbGVtZW50cyByZXR1cm5lZCBieSBmaW5kQWxsKCkgbWF5IGxhY2sgdGhlIG5lc3RlZCBvYmplY3QpLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVPYmo/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IGVsZW1lbnQuc2NyZWVuTmFtZU9iai5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbk9wdGlvbiA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gZWxlbWVudC5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNuT3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNuT3B0aW9uLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBzY3JlZW5OYW1lSWQgYXMgc3RyaW5nIHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQgKGZvciBjb25zaXN0ZW5jeSB3aXRoIGdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZFN0cmluZyA9IFN0cmluZyhlbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woc2NyZWVuTmFtZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyB1c2VyJ3Mgc2VsZWN0aW9uIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gc2NyZWVuTmFtZUlkU3RyaW5nICYmIGN1cnJlbnRWYWx1ZVN0ciAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKHNjcmVlbk5hbWVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQvdXBkYXRlIGVsZW1lbnQgZGV0YWlscyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGVsZW1lbnROYW1lIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNldCAocHJlc2VydmUgZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5uYW1lID09PSAnc2VsZWN0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5uYW1lIHx8IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBJRCBmb3JtIGNvbnRyb2wgZm9yIHRoZSBkcm9wZG93biAoa2V5IGlzICdpZCcgaW4gY29uZmlnKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShlbGVtZW50LmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFyaWFibGUudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBub3QgZm91bmQgaW4gZWxlbWVudE9wdGlvbnMgeWV0IC0gbWlnaHQgbmVlZCB0byBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gS2VlcCBlbGVtZW50SWQgYW5kIGVsZW1lbnROYW1lIGlmIHRoZXkgZXhpc3QgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyB0aGUgc2NyZWVuIG5hbWUgeWV0LCBzbyB3ZSdsbCB3YWl0IGZvciBlbGVtZW50T3B0aW9ucyB0byBiZSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBhZ2FpbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdmlhIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIGVsZW1lbnRJZCBpbiB0ZW1wbGF0ZSBkYXRhIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmaWVsZHMgYW5kIHNldCBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT25seSBjbGVhciBzY3JlZW5OYW1lSWQgaWYgaXQgd2Fzbid0IHNldCBieSB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gJ25vbmUnIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIFNjcmVlbiBuYW1lIHNob3VsZCBiZSAnbm9uZScgKFNlbGVjdCBvcHRpb24pXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKG51bGwpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBlbnZpcm9ubWVudCBvcHRpb25zIGNoYW5nZWQ6IGluaXRpYWxpemUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIEJFRk9SRSBwcmVjb21wdXRlQ29uZmlncy5cbiAgICAgIC8vIE90aGVyd2lzZSBnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyBydW5zIHdpdGggZW1wdHkgc2VsZWN0ZWRFbnZpcm9ubWVudCBhbmQgY2FjaGVzIHN0YWxlIFVJIHN0YXRlLlxuICAgICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddKSB7XG4gICAgICAgIGNvbnN0IG5lZWRzRW52aXJvbm1lbnRJbml0ID1cbiAgICAgICAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8uc29tZSh2ID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodi52YWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICBjb25zdCBpc0VudlR5cGUgPVxuICAgICAgICAgICAgICB2LmRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnIHx8XG4gICAgICAgICAgICAgIHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwgfHxcbiAgICAgICAgICAgICAgcGFyc2VkLmRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICAgICAgICAgICAgaWYgKCFpc0VudlR5cGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHYuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByYXcgPSBwYXJzZWQucmF3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbihyYXcgJiYgU3RyaW5nKHJhdykudHJpbSgpKSB8fCB2LnNlbGVjdGVkRW52aXJvbm1lbnRJZCAhPSBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuZWVkc0Vudmlyb25tZW50SW5pdCkge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZS1jb21wdXRlIGFsbCBjb25maWdzIHRvIGF2b2lkIGNhbGxpbmcgbWV0aG9kcyBpbiB0ZW1wbGF0ZVxuICAgICAgLy8gVGhpcyB3aWxsIHJlY29tcHV0ZSBlbGVtZW50IGNvbmZpZ3Mgd2l0aCB0aGUgbmV3IGVsZW1lbnRPcHRpb25zXG4gICAgICAvLyBPbmx5IHByZWNvbXB1dGUgaWYgdGVtcGxhdGVWYXJpYWJsZXMgZXhpc3QgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucHJlY29tcHV0ZUNvbmZpZ3MoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciByZWNvbXB1dGluZyBjb25maWdzIChvbmx5IG9uY2UgYXQgdGhlIGVuZClcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAvLyBSZS1ydW4gaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzIHdoZW5ldmVyIHBhcmFtZXRlck9wdGlvbnMgY2hhbmdlcyBhbmQgdGhlcmUgYXJlIHN0aWxsXG4gICAgICAvLyB2YXJpYWJsZXMgdGhhdCBuZWVkIGluaXRpYWxpemF0aW9uIChoYXZlIHByb2ZpbGVJZCBidXQgbWlzc2luZyBwcm9maWxlIG5hbWUgb3IgZGF0YVNldCkuXG4gICAgICAvLyBXZSBkbyBOT1QgdXNlIGZpcnN0Q2hhbmdlIGhlcmUgYmVjYXVzZSB0aGUgc2F2ZWQgcHJvZmlsZSBtYXkgYXJyaXZlIGluIGEgc2Vjb25kIEFQSSBjYWxsXG4gICAgICAvLyAoaWRAPHByb2ZpbGVJZD4pIGFmdGVyIHRoZSBpbml0aWFsIHBhZ2luYXRlZCBsaXN0LCBzbyBmaXJzdENoYW5nZSB3b3VsZCBtaXNzIGl0LlxuICAgICAgLy8gVGhlIGlubmVyIHNvbWUoKSBndWFyZCBlbnN1cmVzIHdlIG9ubHkgcmUtcnVuIHdoZW4gdmFyaWFibGVzIGFyZSBzdGlsbCBpbmNvbXBsZXRlLFxuICAgICAgLy8gcHJldmVudGluZyB1bm5lY2Vzc2FyeSByZS1ydW5zIG9uIHVzZXIgc2VhcmNoIHVwZGF0ZXMuXG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSAmJlxuICAgICAgICB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAoXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IHZhcmlhYmxlIGhhcyBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIGJ1dCBpcyBtaXNzaW5nIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlIG9yIHNlbGVjdGVkRGF0YVNldFxuICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGxvYWRpbmcgYSBzYXZlZCBzdGVwIC0gc2V0VGVtcGxhdGVWYXJpYWJsZXMgc2V0cyB0aGUgSUQsIGJ1dCB3ZSBuZWVkIHBhcmFtZXRlck9wdGlvbnMgdG8gc2V0IHRoZSBuYW1lIGFuZCBkYXRhIHNldFxuICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiZcbiAgICAgICAgICAgIHYuZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInICYmXG4gICAgICAgICAgICB2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgKCF2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8ICF2LnNlbGVjdGVkRGF0YVNldClcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT5cbiAgICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiYgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiYgIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgLy8gVGhlIGV4dHJhIHVuaW5pdGlhbGl6ZWQtdmFyaWFibGUgY2hlY2sgYmVsb3cgaXMgZGVidWctb25seTogb25seSBydW4gaXQgaW4gZGVidWcgbW9kZVxuICAgICAgICAgIC8vIHRvIGF2b2lkIGRvdWJsZS1pbml0aWFsaXNpbmcgdmFyaWFibGVzIGluIG5vbi1kZWJ1ZyBzdGVwLWJ1aWxkZXIgZmxvd3MuXG4gICAgICAgICAgKHRoaXMuaXNEZWJ1ZyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT5cbiAgICAgICAgICAgIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHYpICYmIHYuZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInICYmICF2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlXG4gICAgICAgICAgKSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGFyYW1ldGVyT3B0aW9ucyBJbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXNcIiwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKTtcbiAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgbm93IHRoYXQgcGFyYW1ldGVyT3B0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHBhcmFtZXRlciBvcHRpb25zIG9yIGxvYWRpbmcgc3RhdGUgY2hhbmdlZCwgcmVmcmVzaCB0ZXN0IGRhdGEgcHJvZmlsZSBjb25maWdzIChzbyBzZWFyY2gvbG9hZCBtb3JlIGFuZCBvcHRpb25zIHN0YXkgaW4gc3luYylcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgICBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIFJlZnJlc2hUZXN0RGF0YVZhcmlhYmxlc1wiLCBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10pO1xuICAgICAgICAvLyBDbGVhciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIGNhY2hlIHNpbmNlIHByb2ZpbGVzIGxpc3Qgb3IgbG9hZGluZyBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgLy8gUmVjb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHJlY29tcHV0ZSBkYXRhIHNldCBjb25maWdcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFuZCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlIGZvciBjYWNoZSBrZXlcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRlbnRpZmllciA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgOiB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0XyR7cHJvZmlsZUlkZW50aWZpZXJ9XyR7dmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgLy8gUHJlc2VydmUgZXhpc3RpbmcgZGF0YVR5cGUgaWYgYWxyZWFkeSBzZXQgKGUuZy4sIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMgd2hlbiBsb2FkaW5nIHNhdmVkIHN0ZXApXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZTtcbiAgICAgICAgY29uc3QgeyBkYXRhVHlwZSwgcmF3VmFsdWUgfSA9IHRoaXMucGFyc2VUZXN0RGF0YVZhbHVlKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgLy8gQXV0by1zZWxlY3QgJ3BhcmFtZXRlcicgd2hlbiB0aGUgdGVzdCBjYXNlIGhhcyBhIGRlZmF1bHQgcHJvZmlsZSAodGVzdENhc2UudGVzdERhdGFJZCBvclxuICAgICAgICAvLyBGT1ItbG9vcC1kZXJpdmVkKSBhbmQgdGhlIHZhcmlhYmxlIGhhcyBubyBleGlzdGluZyB2YWx1ZS9kYXRhVHlwZS4gVGhpcyBrZWVwcyBFZGl0LW1vZGVcbiAgICAgICAgLy8gdXNlciBzZWxlY3Rpb25zIGludGFjdCAoZXhpc3RpbmdEYXRhVHlwZSBzZXQpIGFuZCBvbmx5IGtpY2tzIGluIGZvciBmcmVzaCBmaWVsZHMuXG4gICAgICAgIGNvbnN0IHNob3VsZERlZmF1bHRUb1BhcmFtZXRlciA9ICFleGlzdGluZ0RhdGFUeXBlICYmIGRhdGFUeXBlID09PSAncGxhaW4tdGV4dCcgJiYgKCF2YXJpYWJsZS52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJycpICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGw7XG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZXhpc3RpbmdEYXRhVHlwZSB8fCAoc2hvdWxkRGVmYXVsdFRvUGFyYW1ldGVyID8gJ3BhcmFtZXRlcicgOiBkYXRhVHlwZSk7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHR5cGUgaW4gdGhlIEZvcm1BcnJheVxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGU7IC8vIFVzZSB0aGUgZmluYWwgZGF0YVR5cGUgKGV4aXN0aW5nIG9yIHBhcnNlZClcbiAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChmaW5hbERhdGFUeXBlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZmluYWxEYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgcGFyYW1ldGVyIHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGlmIChmaW5hbERhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogVXNlIHNhdmVkIHRlc3QgZGF0YSBwcm9maWxlIElEIGZyb20gdGVzdFN0ZXAudGVzdERhdGFMaXN0IChzZXQgYnkgc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGV0IHByb2ZpbGVUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgbGV0IGRhdGFTZXRUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgY29uc3QgaGFzRGVmYXVsdFByb2ZpbGUgPSB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBoYXNTYXZlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVNaXNtYXRjaFdpdGhEZWZhdWx0ID1cbiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIGhhc1NhdmVkUHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIE51bWJlcih2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSAhPT0gTnVtYmVyKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcblxuICAgICAgICAgICAgICAvLyBXaGVuIGRlZmF1bHQgcHJvZmlsZSBpcyBkaWZmZXJlbnQgZnJvbSBzYXZlZCBwcm9maWxlLCBpZ25vcmUgc2F2ZWQgdGVtcGxhdGUtdmFyaWFibGUgc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBwcm9maWxlL3N0YXJ0LWVuZCBhbmQgY2xlYXIgcGFyYW1ldGVyIHZhbHVlIGJlY2F1c2UgcHJvZmlsZSBjb250ZXh0IGNoYW5nZWQuXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayBzYXZlZCBwcm9maWxlIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb2ZpbGUgb3ZlcnJpZGUuXG4gICAgICAgICAgICAgIGlmICghaGFzRGVmYXVsdFByb2ZpbGUgJiYgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4IGlzIHByb3ZpZGVkLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiBwcm9maWxlVG9Vc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGF0YSBzZXQgaGFzIHRoZSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgZm91bmQgYnkgcGFyYW1ldGVyIG5hbWUsIHVzZSBmaXJzdCBkYXRhIHNldCBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFTZXRUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IFVzZSBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHdoZW5ldmVyIHByb3ZpZGVkIChvdmVycmlkZSB0ZW1wbGF0ZS12YXJpYWJsZSBwcm9maWxlKS5cbiAgICAgICAgICAgICAgaWYgKCFwcm9maWxlVG9Vc2UgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgcHJvZmlsZVRvVXNlLmRhdGEgJiYgcHJvZmlsZVRvVXNlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHByb2ZpbGVUb1VzZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0VG9Vc2UgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhdXRvLXNlbGVjdCB0aGUgZGF0YSBzZXQgd2hlbiBleGFjdGx5IG9uZSBvcHRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIG11bHRpcGxlIGRhdGEgc2V0cyBhbmQgbm8gZXhwbGljaXQgc3RhcnQgaW5kZXgsIGxlYXZlIHRoZSBjaG9pY2UgdG8gdGhlIHVzZXIuXG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRUb1VzZSA9IHByb2ZpbGVUb1VzZS5kYXRhWzBdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkZWZhdWx0IHByb2ZpbGUgcmVzb2x2ZWQgYnV0IG5vIGRhdGEgc2V0IHdhcyBhdXRvLXBpY2tlZCAobXVsdGktZGF0YXNldCBjYXNlKSxcbiAgICAgICAgICAgICAgLy8gc3RpbGwgc2VsZWN0IHRoZSBwcm9maWxlIHNvIHRoZSB1c2VyIG9ubHkgbmVlZHMgdG8gcGljayB0aGUgZGF0YSBzZXQuXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgIWRhdGFTZXRUb1VzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gcHJvZmlsZVRvVXNlLm5hbWUgfHwgcHJvZmlsZVRvVXNlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBwcm9maWxlVG9Vc2UuaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5zZXQodmFyaWFibGUubmFtZSwgcHJvZmlsZVRvVXNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcocHJvZmlsZVRvVXNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwcm9maWxlIGFuZCBkYXRhIHNldCwgc2V0IHRoZSB2YXJpYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgZGF0YVNldFRvVXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBwcm9maWxlVG9Vc2UubmFtZSB8fCBwcm9maWxlVG9Vc2UudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGF0YVNldFRvVXNlLm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IHZhcmlhYmxlIHByb3BlcnRpZXMgLSB0aGlzIGVuc3VyZXMgaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUoKSBhbmQgaGFzU2VsZWN0ZWREYXRhU2V0KCkgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBwcm9maWxlVG9Vc2UuaWQ7XG4gICAgICAgICAgICAgICAgLy8gU25hcHNob3QgcHJvZmlsZSBzbyBpdCBzdXJ2aXZlcyBpZiBhbm90aGVyIHZhcmlhYmxlIHRyaWdnZXJzIGEgc2VhcmNoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5zZXQodmFyaWFibGUubmFtZSwgcHJvZmlsZVRvVXNlKTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luc2lkZUZvckxvb3BTdGVwKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhRW5kSW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGFTZXQgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gZW5kRGF0YVNldD8ubmFtZSB8fCBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCAoc3RyaW5nKSBmb3Igc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgZm9ybSBjb250cm9sIHRvIG1hdGNoIG9wdGlvbi5pZCBmb3JtYXRcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcocHJvZmlsZVRvVXNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXRTdGFydCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCB8fCBkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldEVuZCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kIHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNldCBwYXJhbWV0ZXIgdmFsdWUgaWYgd2UgZm91bmQgaXQgaW4gdGhlIGRhdGEgc2V0LCBvdGhlcndpc2UgY2xlYXIgaXQgZm9yIHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCB0aGUgcGFyYW1ldGVyIGluIGEgZGF0YSBzZXQsIHNldCBpdDsgb3RoZXJ3aXNlIGNsZWFyIGZvciB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHJhd1ZhbHVlICYmIGRhdGFTZXRUb1VzZSAmJiBkYXRhU2V0VG9Vc2UuZGF0YSAmJiBkYXRhU2V0VG9Vc2UuZGF0YS5oYXNPd25Qcm9wZXJ0eShyYXdWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YXJpYWJsZS52YWx1ZSAvLyBVc2UgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgQHx0NjY2NjY2fClcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShwYXJhbVZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIGNvbmZpZ3Mgd2l0aCBuZXcgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgdmFyaWFibGUgdG8gZW5zdXJlIGZyZXNoIGNvbmZpZ3NcbiAgICAgICAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBjYWNoZSAtIG5lZWQgdG8gY2xlYXIgYWxsIHBvc3NpYmxlIGtleXMgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3QgZm9ybWF0XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogSWYgbm8gZGVmYXVsdCBwcm9maWxlIG92ZXJyaWRlIGFuZCBubyBzYXZlZCBwcm9maWxlIGZvdW5kLCBzZWFyY2ggYnkgcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgPT0gbnVsbCAmJiAhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAvLyBObyBkZWZhdWx0IHZhbHVlcyAtIHVzZSBleGlzdGluZyBsb2dpYyB0byBmaW5kIGZyb20gcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJhd1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhpcyBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgdGVzdCBkYXRhIHByb2ZpbGVzIGFuZCB0aGVpciBkYXRhIHNldHNcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRQcm9maWxlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZERhdGFTZXQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0RGF0YVByb2ZpbGUgb2YgdGhpcy5wYXJhbWV0ZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGVzdERhdGFQcm9maWxlLmRhdGEgJiYgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgZGF0YSBzZXRzIGluIHRoaXMgcHJvZmlsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFTZXQgb2YgdGVzdERhdGFQcm9maWxlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNldCAmJiBkYXRhU2V0LmRhdGEgJiYgZGF0YVNldC5kYXRhLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGF0YVNldCA9IGRhdGFTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUgJiYgZm91bmREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGZvdW5kUHJvZmlsZS5uYW1lIHx8IGZvdW5kUHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGZvdW5kRGF0YVNldC5uYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGZvdW5kUHJvZmlsZS5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKGZvdW5kUHJvZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBwYXJhbSBuYW1lIChmb3IgZHJvcGRvd24gZGlzcGxheSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1OYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseSBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHBhcmFtTmFtZSwgJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgbm90IGZvdW5kLCBmb3JtYXQgdGhlIHJhdyB2YWx1ZSBpZiBpdCdzIGEgcGFyYW1ldGVyIHR5cGVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgdXNlIGZpbmFsRGF0YVR5cGUgKGZyb20gdGVzdERhdGFMaXN0KSDigJQgdmFsdWUgbWF5IG5vdCBwYXJzZSBhcyAqfC4uLnwgeWV0LlxuICAgICAgICAgIGlmIChmaW5hbERhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRFbnYgPSB0aGlzLnBhcnNlVGVzdERhdGFWYWx1ZSh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICBsZXQgcGFyYW1OYW1lID0gcGFyc2VkRW52LnJhd1ZhbHVlID8gU3RyaW5nKHBhcnNlZEVudi5yYXdWYWx1ZSkudHJpbSgpIDogJyc7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFwYXJhbU5hbWUgJiZcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGBlbnYtJHt2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWR9LWA7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maWx0ZXIoZW52ID0+IGVudi5pZC5pbmRleE9mKHByZWZpeCkgPT09IDApO1xuICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBTdHJpbmcoY2FuZGlkYXRlc1swXS5uYW1lIHx8ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNhdmVkIGVudmlyb25tZW50SWQsIHVzZSBpdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKGVudi17aWR9LXtwYXJhbX0pXG4gICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNlbGVjdGluZyB0aGUgd3JvbmcgZW52aXJvbm1lbnQgd2hlbiBtdWx0aXBsZSBlbnZpcm9ubWVudHMgc2hhcmUgcGFyYW0gbmFtZXMuXG4gICAgICAgICAgICAgIGxldCBlbnZPcHRpb246IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YWN0SWQgPSBgZW52LSR7dmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkfS0ke3BhcmFtTmFtZX1gO1xuICAgICAgICAgICAgICAgIGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5pZCA9PT0gZXhhY3RJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IHBhcmFtIG5hbWUgb25seSAobGVnYWN5IC8gZmlyc3QtdGltZSBzYXZlKVxuICAgICAgICAgICAgICBpZiAoIWVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5uYW1lID09PSBwYXJhbU5hbWUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSBlbnZPcHRpb24uZW52aXJvbm1lbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRCBmcm9tIHRoZSBvcHRpb24gaWRcbiAgICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZW52T3B0aW9uLmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGVudk9wdGlvbi5lbnZpcm9ubWVudCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZShlbnZPcHRpb24uZW52aXJvbm1lbnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYCp8JHtwYXJhbU5hbWV9fGAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RlcCBtYXkgb25seSBoYXZlIGVudmlyb25tZW50SWQgKG9yIHZhbHVlIGVtcHR5KSB3aGlsZSB0aGUgZW52IGhhcyBtdWx0aXBsZSBwYXJhbWV0ZXJzOlxuICAgICAgICAgICAgLy8gc3RpbGwgYmluZCBFbnZpcm9ubWVudCBOYW1lIGZyb20gc2F2ZWQgaWQgc28gdGhlIGZpcnN0IGRyb3Bkb3duIHByZWxvYWRzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCAmJlxuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYGVudi0ke3ZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZH0tYDtcbiAgICAgICAgICAgICAgY29uc3QgZm9yRW52ID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmlsdGVyKGVudiA9PiBlbnYuaWQuaW5kZXhPZihwcmVmaXgpID09PSAwKTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBmb3JFbnYubGVuZ3RoID8gZm9yRW52WzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gZmlyc3QuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGZpcnN0LmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woZmlyc3QuZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZmlyc3QuZW52aXJvbm1lbnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUgJiYgZm9yRW52Lmxlbmd0aCA9PT0gMSAmJiBmaXJzdC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGFyYW0gPSBTdHJpbmcoZmlyc3QubmFtZSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKG9ubHlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYCp8JHtvbmx5UGFyYW19fGAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShvbmx5UGFyYW0sICdlbnZpcm9ubWVudCcpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZWxlbWVudCB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCBzY3JlZW4gbmFtZSBhbmQgZWxlbWVudFxuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyeSB0byBmaW5kIGFuZCBzZXQgZWxlbWVudCBpZiBlbGVtZW50SWQgZXhpc3RzIGluIHRlbXBsYXRlIGRhdGFcbiAgICAgICAgICAgIC8vIElmIG5vIGVsZW1lbnRJZCwgZG9uJ3Qgc2VsZWN0IGFueXRoaW5nIC0gdXNlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudElkKSB7XG4gICAgICAgICAgICAgIGxldCBlbGVtZW50OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogRmluZCBieSBlbGVtZW50SWQgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwuaWQgPT09IHZhcmlhYmxlLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAyOiBGaW5kIGJ5IGVsZW1lbnROYW1lIGlmIGVsZW1lbnRJZCBzZWFyY2ggZGlkbid0IGZpbmQgaXQgKGZhbGxiYWNrKVxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLm5hbWUgPT09IHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogRmluZCBieSBsb2NhdG9yVmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmxvY2F0b3JWYWx1ZSA9PT0gZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIG5hbWUgaW5mbyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBlbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBzY3JlZW5OYW1lT2JqLm5hbWU7IGZhbGwgYmFjayB0byBzY3JlZW5OYW1lT3B0aW9ucyBsb29rdXAgd2hlbiBzY3JlZW5OYW1lT2JqXG4gICAgICAgICAgICAgICAgICAvLyBpcyBhYnNlbnQgKGUuZy4gZWxlbWVudHMgcmV0dXJuZWQgYnkgZmluZEFsbCgpIG1heSBsYWNrIHRoZSBuZXN0ZWQgb2JqZWN0KS5cbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVPYmo/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbk9wdGlvbiA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gZWxlbWVudC5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChzbk9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gc25PcHRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZFN0cmluZyA9IFN0cmluZyhlbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbChzY3JlZW5OYW1lSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGZvcm0gY29udHJvbCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIHZhbGlkIHNjcmVlbiBuYW1lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIHVzZXIncyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlU3RyICE9PSBzY3JlZW5OYW1lSWRTdHJpbmcgJiYgY3VycmVudFZhbHVlU3RyICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKHNjcmVlbk5hbWVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldC91cGRhdGUgZWxlbWVudCBkZXRhaWxzIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgZWxlbWVudE5hbWUgaWYgaXQgd2Fzbid0IGFscmVhZHkgc2V0IChwcmVzZXJ2ZSBmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBGb3Igc2VsZWN0b3IsIHVzZSBlbGVtZW50TG9jYXRvciBhcyB2YWx1ZTsgZm9yIG90aGVycywgdXNlIGVsZW1lbnROYW1lXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50Lm5hbWUgfHwgZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChlbGVtZW50LmlkKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShlbGVtZW50LmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5vdCBmb3VuZCBpbiBlbGVtZW50T3B0aW9ucyB5ZXQgLSBtaWdodCBuZWVkIHRvIGZldGNoXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBlbGVtZW50SWQgYW5kIGVsZW1lbnROYW1lIGlmIHRoZXkgZXhpc3QgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50SWQgYnV0IGVsZW1lbnQgaXNuJ3QgZm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZmV0Y2ggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBrbm93IHRoZSBzY3JlZW4gbmFtZSB5ZXQsIHNvIHdlJ2xsIHdhaXQgZm9yIGVsZW1lbnRPcHRpb25zIHRvIGJlIGxvYWRlZFxuICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBhZ2FpbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdmlhIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vIGVsZW1lbnRJZCBpbiB0ZW1wbGF0ZSBkYXRhIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmaWVsZHMgYW5kIHNldCBkZWZhdWx0c1xuICAgICAgICAgICAgICAvLyBCdXQgZG9uJ3Qgb3ZlcnJpZGUgdXNlcidzIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiBpZiB0aGV5J3ZlIGFscmVhZHkgc2VsZWN0ZWQgb25lXG4gICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gT25seSBjbGVhciBzY3JlZW5OYW1lSWQgaWYgaXQgd2Fzbid0IHNldCBieSB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmb3JtIGNvbnRyb2wgaGFzIGEgdmFsaWQgc2NyZWVuIG5hbWUgKG5vdCAnbm9uZScpXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gJ25vbmUnIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIG5hbWUgc2hvdWxkIGJlICdub25lJyAoU2VsZWN0IG9wdGlvbilcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woJ25vbmUnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBFbGVtZW50IElEIHNob3VsZCBiZSBudWxsXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKG51bGwpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gZW5zdXJlIFVJIHVwZGF0ZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgZnJvbSBGb3JtQXJyYXkgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBhdCBhIHNwZWNpZmljIGluZGV4IGZyb20gRm9ybUFycmF5IChmb3IgdGVtcGxhdGUgdXNlKSAqL1xuICBnZXRGb3JtR3JvdXBBdChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICBwcml2YXRlIHByZWNvbXB1dGVDb25maWdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIGFsbCBzZWxlY3QgY29uZmlnc1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAvLyBQcmUtY29tcHV0ZSByZWd1bGFyIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3MgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWcgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGlmIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBpZiBlbnZpcm9ubWVudCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCB2YXJpYWJsZSBjb25maWdzIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCBjb25maWcgaWYgc2NyZWVuIG5hbWUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZVRlc3REYXRhVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHN0cmluZyB9IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiAnJyB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGFyYW1ldGVyIGZvcm1hdDogQHx2YWx1ZXxcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BhcmFtZXRlcicsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIHJ1bnRpbWUgZm9ybWF0OiAkfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdydW50aW1lJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgZW52aXJvbm1lbnQgZm9ybWF0OiAqfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdlbnZpcm9ubWVudCcsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gUGxhaW4gdGV4dCAobm8gZm9ybWF0dGluZylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBmb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlOiBzdHJpbmcsIGRhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcpOiBzdHJpbmcge1xuICAgIGlmICghcmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgXG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSAncGFyYW1ldGVyJzpcbiAgICAgICAgcmV0dXJuIGBAfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdydW50aW1lJzpcbiAgICAgICAgcmV0dXJuIGAkfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdlbnZpcm9ubWVudCc6XG4gICAgICAgIHJldHVybiBgKnwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAncGxhaW4tdGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBhbnkge1xuICAgIHJldHVybiB2YXJpYWJsZS5uYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMsIGluY2x1ZGUgZWxlbWVudE9wdGlvbnMgKyBoYXNNb3JlRWxlbWVudHMgaW4gY2FjaGUga2V5LlxuICAgIC8vIEludGVudGlvbmFsbHkgZXhjbHVkZSBpc0xvYWRpbmdFbGVtZW50cyBzbyBzZWFyY2ggaW5wdXQgaW5zdGFuY2Ugc3RheXMgc3RhYmxlIHdoaWxlIHR5cGluZy5cbiAgICAvLyBGb3IgdXBsb2FkIHZhcmlhYmxlcywgaW5jbHVkZSB1cGxvYWRPcHRpb25zLCBoYXNNb3JlVXBsb2FkcywgYW5kIGlzTG9hZGluZ1VwbG9hZHMgaW4gY2FjaGUga2V5XG4gICAgLy8gT3B0aW1pemUgY2FjaGUga2V5IGNvbXB1dGF0aW9uIC0gdXNlIGxlbmd0aCBpbnN0ZWFkIG9mIGZ1bGwgYXJyYXkgam9pbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgY29uc3QgaXNFbGVtZW50VmFyaWFibGUgPSB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJztcbiAgICBjb25zdCBpc1VwbG9hZFZhcmlhYmxlID0gdmFyaWFibGUubmFtZSA9PT0gJ3VwbG9hZCcgJiYgdmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJztcbiAgICBcbiAgICBjb25zdCBvcHRpb25zS2V5ID0gaXNFbGVtZW50VmFyaWFibGVcbiAgICAgID8gYCR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5tYXAoZWwgPT4gZWwuaWQgfHwgJycpLmpvaW4oJywnKX1gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dGhpcy51cGxvYWRPcHRpb25zLmxlbmd0aH1fJHt0aGlzLnVwbG9hZE9wdGlvbnMubWFwKCh1cDogYW55KSA9PiB1cC5pZCB8fCB1cC5uYW1lIHx8ICcnKS5qb2luKCcsJyl9YFxuICAgICAgOiBgJHt2YXJpYWJsZS5vcHRpb25zPy5sZW5ndGggfHwgMH1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBcbiAgICAvLyBJbmNsdWRlIGhhc01vcmUgYW5kIGlzTG9hZGluZyBpbiBjYWNoZSBrZXkgZm9yIGVsZW1lbnQgYW5kIHVwbG9hZCB2YXJpYWJsZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGlzRWxlbWVudFZhcmlhYmxlXG4gICAgICA/IGAke3ZhcmlhYmxlLm5hbWV9XyR7b3B0aW9uc0tleX1fJHt0aGlzLmhhc01vcmVFbGVtZW50c31gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZVVwbG9hZHN9XyR7dGhpcy5pc0xvYWRpbmdVcGxvYWRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGZvciBlbGVtZW50IHZhcmlhYmxlcywgdXBsb2FkT3B0aW9ucyBmb3IgdXBsb2FkIHZhcmlhYmxlcywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAoaXNFbGVtZW50VmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBvcHRpb25zQXJyYXkgPSB0aGlzLmVsZW1lbnRPcHRpb25zXG4gICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGxvY2F0b3JWYWx1ZSwgLy8gVXNlIGxvY2F0b3JWYWx1ZSBhcyBpZCBzbyBpdCBnZXRzIHJldHVybmVkIGFzIHRoZSB2YWx1ZVxuICAgICAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiBsb2NhdG9yVmFsdWUsIC8vIEFsc28gc2V0IHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgbmFtZTogYCR7ZWwubmFtZX0gKCR7ZWwuc2NyZWVuTmFtZU9iaj8ubmFtZSB8fCAnJ30pYCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICAgICAgb3RoZXJMb2NhdG9yOiBlbC5vdGhlckxvY2F0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVXBsb2FkVmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciB1cGxvYWQgb3B0aW9ucywgbWFwIHVwbG9hZCBvYmplY3RzIHRvIFNlbGVjdE9wdGlvbiBmb3JtYXRcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMudXBsb2FkT3B0aW9ucy5tYXAoKHVwbG9hZDogYW55KSA9PiB7XG4gICAgICAgIC8vIEFzc3VtaW5nIHVwbG9hZCBoYXMgaWQsIG5hbWUsIG9yIHNpbWlsYXIgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB1cGxvYWRJZCA9IHVwbG9hZC5pZD8udG9TdHJpbmcoKSB8fCB1cGxvYWQubmFtZSB8fCAnJztcbiAgICAgICAgY29uc3QgdXBsb2FkTmFtZSA9IHVwbG9hZC5uYW1lIHx8IHVwbG9hZC5maWxlTmFtZSB8fCB1cGxvYWRJZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdXBsb2FkSWQsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkLFxuICAgICAgICAgIG5hbWU6IHVwbG9hZE5hbWUsXG4gICAgICAgICAgbGFiZWw6IHVwbG9hZE5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQudmFsdWUsIHZhbHVlOiBvcHQudmFsdWUsIG5hbWU6IG9wdC5sYWJlbCwgbGFiZWw6IG9wdC5sYWJlbH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIGVsZW1lbnQgdmFyaWFibGVzXG4gICAgaWYgKGlzRWxlbWVudFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIGRyb3Bkb3duXG4gICAgICBjb25maWcuc2VydmVyU2VhcmNoID0gdHJ1ZTsgLy8gRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaFxuICAgICAgY29uZmlnLmhhc01vcmUgPSB0aGlzLmhhc01vcmVFbGVtZW50cztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ0VsZW1lbnRzO1xuICAgICAgY29uZmlnLm9uTG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVFbGVtZW50cy5lbWl0KCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uU2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRW1pdCBzZWFyY2ggZXZlbnQgd2hlbiB1c2VyIHR5cGVzIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbG9hZCBtb3JlIGFuZCBzZWFyY2ggc3VwcG9ydCBmb3IgdXBsb2FkIHZhcmlhYmxlc1xuICAgIGlmIChpc1VwbG9hZFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHVwbG9hZCBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlVXBsb2FkcztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ1VwbG9hZHM7XG4gICAgICBjb25maWcub25Mb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVVwbG9hZHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaFVwbG9hZHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRlc3QtZGF0YSB2YXJpYWJsZSwgcGFyc2UgYW5kIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGRhdGEgdHlwZVxuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgIGNvbnN0IHsgZGF0YVR5cGU6IHBhcnNlZERhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgY29uc3QgY3VycmVudERhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgPVxuICAgICAgICAodmFyaWFibGUuZGF0YVR5cGUgYXMgYW55KSB8fCAncGxhaW4tdGV4dCc7XG5cbiAgICAgIC8vIENSSVRJQ0FMOiBXaGVuIHVzZXIgaXMgaW4gJ3BhcmFtZXRlcicgbW9kZSBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkgKGUuZy4sIHdoZW5cbiAgICAgIC8vIHNlbGVjdGluZy9jaGFuZ2luZyB0ZXN0LWRhdGEgcHJvZmlsZSwgd2hpY2ggY2xlYXJzIHRoZSB2YWx1ZSB0ZW1wb3JhcmlseSksIHdlIG11c3RcbiAgICAgIC8vIE5PVCBjaGFuZ2UgdGhlIGRhdGFUeXBlIGJhY2sgdG8gJ3BsYWluLXRleHQnLiBLZWVwIGl0IGFzICdwYXJhbWV0ZXInLlxuICAgICAgLy8gT25seSBjaGFuZ2UgZGF0YVR5cGUgaWY6XG4gICAgICAvLyAxLiBUaGUgcGFyc2VkIHR5cGUgbWF0Y2hlcyBjdXJyZW50IHR5cGUgKG5vIGNoYW5nZSBuZWVkZWQpLCBPUlxuICAgICAgLy8gMi4gVGhlIHZhbHVlIGlzIG5vdCBlbXB0eSAodXNlciBpcyBhY3R1YWxseSB0eXBpbmcvc2VsZWN0aW5nIGEgdmFsdWUpLCBPUlxuICAgICAgLy8gMy4gV2UncmUgc3dpdGNoaW5nIEZST00gcGxhaW4tdGV4dCBUTyBwYXJhbWV0ZXIgKGFsbG93IHRoaXMgdHJhbnNpdGlvbilcbiAgICAgIGxldCBmaW5hbERhdGFUeXBlID0gcGFyc2VkRGF0YVR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnREYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgcGFyc2VkRGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSlcbiAgICAgICkge1xuICAgICAgICAvLyBLZWVwIGFzIHBhcmFtZXRlciAtIGRvbid0IGNoYW5nZSB0byBwbGFpbi10ZXh0XG4gICAgICAgIGZpbmFsRGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH1cblxuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlO1xuICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGRhdGEgdHlwZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJyk/LnNldFZhbHVlKGZpbmFsRGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgfVxuICBcbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gTm90ZTogSWYgdmFyaWFibGUgZG9lc24ndCBleGlzdCBpbiBGb3JtQXJyYXksIGl0IHNob3VsZCBiZSBhZGRlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZUJvb2xlYW5DaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMgKGRhdGFLZXkgPT09ICdlbGVtZW50JyksIHdlIHVzZSBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgLy8gU28gcmV0dXJuIGZhbHNlIHRvIHVzZSB0aGUgY2FzY2FkaW5nIGRyb3Bkb3duIHBhdHRlcm5cbiAgICBjb25zdCByZXN1bHQgPSB2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnO1xuICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgbmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgY29uc3QgZGF0YUtleSA9IHZhcmlhYmxlLmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZSc7XG4gICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIEhpZGUgQHxQYXJhbWV0ZXJ8IHdoZW4gdGhlIHN0ZXAgaXMgbm90IGluc2lkZSBhIEZPUiBsb29wIEFORCB0aGUgdGVzdCBjYXNlIGhhcyBubyB0ZXN0IGRhdGEgcHJvZmlsZS5cbiAgICBpZiAoIXRoaXMuaXNJbnNpZGVGb3JMb29wU3RlcCAmJiAhdGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFUeXBlT3B0aW9ucy5maWx0ZXIob3B0ID0+IG9wdC52YWx1ZSAhPT0gJ3BhcmFtZXRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhVHlwZU9wdGlvbnM7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhVHlwZWA7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiAhdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVR5cGUnLCAvLyBVc2UgJ2RhdGFUeXBlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXREYXRhVHlwZU9wdGlvbnMoKSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVR5cGVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBnZXRDdXJyZW50RGF0YVR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcge1xuICAgIHJldHVybiB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gIH1cbiAgXG4gIGdldFJhd1ZhbHVlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUucmF3VmFsdWUgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2VsZWN0b3IgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzXG4gICAqL1xuICBnZXQgc2VsZWN0b3JWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4gdi5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdi5kYXRhS2V5ID09PSAnbGFiZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIHBhcmFtZXRlciB0eXBlKVxuICAgKi9cbiAgZ2V0IHBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIGVudmlyb25tZW50IHR5cGUpXG4gICAqL1xuICBnZXQgZW52aXJvbm1lbnRWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4ge1xuICAgICAgY29uc3QgZGF0YUtleSA9IHYuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHYuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgXG4gIG9uRGF0YVR5cGVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIGRhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSB2YXJpYWJsZVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICghdmFyaWFibGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RvcmVkIGRhdGEgdHlwZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgdmFyaWFibGUuZGF0YVR5cGUgPSBkYXRhVHlwZTtcbiAgICBcbiAgICAvLyBDbGVhciBwYXJhbWV0ZXIgYW5kIGVudmlyb25tZW50IHNlbGVjdCBjb25maWcgY2FjaGVzIHNpbmNlIGRhdGEgdHlwZSBjaGFuZ2VkXG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9kYXRhU2V0YCk7XG4gICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZpcm9ubWVudGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZQYXJhbWApO1xuICAgIFxuICAgIC8vIEdldCB0aGUgdmFyaWFibGUgZ3JvdXBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIHBhcmFtZXRlciB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgcGFyYW1ldGVyLXJlbGF0ZWQgZm9ybSBjb250cm9scyB3aGVuIHN3aXRjaGluZyBhd2F5IGZyb20gcGFyYW1ldGVyIHR5cGVcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0RW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2hlbiBzd2l0Y2hpbmcgVE8gcGFyYW1ldGVyIHR5cGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbnMgdG8gc3RhcnQgZnJlc2hcbiAgICAgIC8vICh1bmxlc3MgZGVmYXVsdCB2YWx1ZXMgYXJlIHByb3ZpZGVkLCB3aGljaCB3aWxsIGJlIHNldCBiZWxvdylcbiAgICAgIGlmICghdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgfHwgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSAnJztcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGZvcm0gY29udHJvbHMgaWYgdGhleSBleGlzdFxuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCBlbnZpcm9ubWVudCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIGVudmlyb25tZW50IHR5cGVcbiAgICBpZiAoZGF0YVR5cGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBlbnZpcm9ubWVudC1yZWxhdGVkIGZvcm0gY29udHJvbHNcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHZhbHVlIHdoZW4gc3dpdGNoaW5nIGRhdGEgdHlwZXMgKHN0YXJ0IGZyZXNoKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSBiYXNlZCBvbiBuZXcgZGF0YSB0eXBlICh3aWxsIGJlIGVtcHR5IHN0cmluZylcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZSgnJywgZGF0YVR5cGUpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZSAoYWx3YXlzIHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSBpbiB2YXJpYWJsZSlcbiAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAvLyBGb3IgYWxsIHR5cGVzLCBzdGFydCB3aXRoIGVtcHR5IHZhbHVlIHdoZW4gc3dpdGNoaW5nXG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIGVudmlyb25tZW50IHR5cGUsIGFsc28gY2xlYXIgc2VsZWN0ZWRFbnZpcm9ubWVudFxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgc3dpdGNoaW5nIHRvIHBhcmFtZXRlciB0eXBlLCBjaGVjayBmb3IgZGVmYXVsdCB2YWx1ZXMgYW5kIGluaXRpYWxpemUgdGhlbVxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5pbmRleE9mKHZhcmlhYmxlKTtcbiAgICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgaXMgcHJvdmlkZWQgZnJvbSB0ZXN0IGNhc2UvRk9SIGNvbnRleHQuXG4gICAgICAvLyBFdmVuIHdoZW4gZGVmYXVsdCBzdGFydCBpbmRleCBpcyBtaXNzaW5nLCBwcm9maWxlIHNob3VsZCBzdGlsbCBiZSBwcmVzZWxlY3RlZC5cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IElEIChudW1lcmljLXNhZmUgbWF0Y2ggZm9yIHN0cmluZy9udW1iZXIgSURzKVxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PlxuICAgICAgICAgIE51bWJlcih0ZXN0RGF0YS5pZCkgPT09IE51bWJlcih0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlKSB7XG4gICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBkZWZhdWx0UHJvZmlsZS5uYW1lIHx8IGRlZmF1bHRQcm9maWxlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICBjb25zdCBwcm9maWxlRGF0YTogYW55W10gPSBBcnJheS5pc0FycmF5KGRlZmF1bHRQcm9maWxlLmRhdGEpID8gZGVmYXVsdFByb2ZpbGUuZGF0YSA6IFtdO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdGFydEluZGV4ID0gdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgPyB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggOiAwO1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3RhcnRJbmRleCA9IHByb2ZpbGVEYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gTWF0aC5taW4oTWF0aC5tYXgoZGVmYXVsdFN0YXJ0SW5kZXgsIDApLCBwcm9maWxlRGF0YS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IHJlc29sdmVkU3RhcnRJbmRleCA+PSAwID8gcHJvZmlsZURhdGFbcmVzb2x2ZWRTdGFydEluZGV4XSA6IG51bGw7XG4gICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBkZWZhdWx0RGF0YVNldD8ubmFtZSB8fCAnJztcblxuICAgICAgICAgIC8vIEFsd2F5cyBzZXQgc2VsZWN0ZWQgcHJvZmlsZSB3aGVuIGRlZmF1bHQgcHJvZmlsZSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSBwcm9maWxlTmFtZTtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gZGVmYXVsdFByb2ZpbGUuaWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWUgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXAgJiYgZGF0YVNldE5hbWUpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleCAhPSBudWxsICYmIHByb2ZpbGVEYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhRW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW5kRGF0YVNldCA9IHByb2ZpbGVEYXRhW3RoaXMuZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgPSBlbmREYXRhU2V0Py5uYW1lIHx8IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgd2l0aCB0aGUgYWN0dWFsIHZhbHVlcyBzbyBkcm9wZG93bnMgZGlzcGxheSBzZWxlY3RlZCBvcHRpb25zLlxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcoZGVmYXVsdFByb2ZpbGUuaWQpO1xuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YVNldE5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luc2lkZUZvckxvb3BTdGVwICYmIGRhdGFTZXROYW1lKSB7XG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JywgbmV3IEZvcm1Db250cm9sKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IGRhdGFTZXROYW1lKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0RW5kJykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldEVuZCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0RW5kJyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCB8fCBkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIHRvIGZvcmNlIHJlY29tcHV0YXRpb24gb2YgY29uZmlncyB3aXRoIG5ldyB2YWx1ZXMuXG4gICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICBjb25zdCBkYXRhU2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZU5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fcGFyYW1Gb3JEYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBQcmUtY29tcHV0ZSB0aGUgbmV3IHNlbGVjdCBjb25maWcgaWYgbmVlZGVkXG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuaW5kZXhPZih2YXJpYWJsZSk7XG4gICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgZGF0YSBzZXQgY29uZmlnXG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgY29uc29sZS5sb2coJ29uRGF0YVR5cGVDaGFuZ2UnLCB2YXJpYWJsZU5hbWUsIGRhdGFUeXBlLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50IHdpdGggZm9ybWF0dGVkIHZhbHVlXG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgfVxuICBcbiAgb25FbGVtZW50U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGhhbmRsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIC8vIFRoZSBrZXkgd2lsbCBiZSAndmFsdWUnIHNpbmNlIHRoYXQncyB3aGF0IHdlIHNldCBpbiB0aGUgY29uZmlnXG4gICAgLy8gRW1pdCB0aGUgc2VhcmNoIHF1ZXJ5IHRvIHBhcmVudCBjb21wb25lbnRcbiAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgLy8gVHJhY2tzIGFjdGl2ZSB2YXJpYWJsZS1zeW50YXggZXJyb3JzIGJ5IHZhcmlhYmxlIG5hbWUuIFRoZSB2YWxpZGF0b3IgYmVsb3dcbiAgLy8gcmVhZHMgZnJvbSB0aGlzIG1hcCBzbyBlcnJvcnMgc3Vydml2ZSBjb250cm9sIHJlLXZhbGlkYXRpb24gb24gc2V0VmFsdWUoKS5cbiAgcHJpdmF0ZSByZWFkb25seSB2YXJpYWJsZVN5bnRheEVycm9ycyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbHNXaXRoU3ludGF4VmFsaWRhdG9yID0gbmV3IFdlYWtTZXQ8QWJzdHJhY3RDb250cm9sPigpO1xuXG4gIHByaXZhdGUgbWFrZVN5bnRheFZhbGlkYXRvcih2YXJpYWJsZU5hbWU6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgZXJyID0gdGhpcy52YXJpYWJsZVN5bnRheEVycm9ycy5nZXQodmFyaWFibGVOYW1lKTtcbiAgICAgIHJldHVybiBlcnIgPyB7IGludmFsaWRWYXJpYWJsZVN5bnRheDogZXJyIH0gOiBudWxsO1xuICAgIH07XG4gIH1cblxuICBvblRlc3REYXRhVmFsaWRpdHlDaGFuZ2UoXG4gICAgdmFyaWFibGVOYW1lOiBzdHJpbmcsXG4gICAgZXZlbnQ6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yOiBzdHJpbmcgfCBudWxsIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlQ29udHJvbCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKT8uZ2V0KCd2YWx1ZScpO1xuICAgIGlmICghdmFsdWVDb250cm9sKSByZXR1cm47XG5cbiAgICBpZiAoZXZlbnQudmFsaWQpIHtcbiAgICAgIHRoaXMudmFyaWFibGVTeW50YXhFcnJvcnMuZGVsZXRlKHZhcmlhYmxlTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFyaWFibGVTeW50YXhFcnJvcnMuc2V0KHZhcmlhYmxlTmFtZSwgZXZlbnQuZXJyb3IgfHwgJ0ludmFsaWQgdmFyaWFibGUgbmFtZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udHJvbHNXaXRoU3ludGF4VmFsaWRhdG9yLmhhcyh2YWx1ZUNvbnRyb2wpKSB7XG4gICAgICB2YWx1ZUNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLm1ha2VTeW50YXhWYWxpZGF0b3IodmFyaWFibGVOYW1lKSk7XG4gICAgICB0aGlzLmNvbnRyb2xzV2l0aFN5bnRheFZhbGlkYXRvci5hZGQodmFsdWVDb250cm9sKTtcbiAgICB9XG4gICAgdmFsdWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHZhbHVlQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHJhd1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSB2YXJpYWJsZVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICghdmFyaWFibGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RvcmVkIHJhdyB2YWx1ZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICBcbiAgICAvLyBHZXQgY3VycmVudCBkYXRhIHR5cGVcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICBcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIGJhc2VkIG9uIGRhdGEgdHlwZVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlXG4gICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzIGZyb20gcGFyYW1ldGVyIG9wdGlvbnMgKHJhdyBUZXN0RGF0YSBvYmplY3RzKVxuICAgKi9cbiAgZ2V0VW5pcXVlVGVzdERhdGFQcm9maWxlcygpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHByb2ZpbGVNYXAgPSBuZXcgTWFwPHN0cmluZywgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZm9yRWFjaCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gdGVzdERhdGEubmFtZSBpcyB0aGUgdGVzdERhdGFOYW1lIChwcm9maWxlIG5hbWUpXG4gICAgICBjb25zdCBwcm9maWxlTmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgaWYgKHByb2ZpbGVOYW1lICYmICFwcm9maWxlTWFwLmhhcyhwcm9maWxlTmFtZSkpIHtcbiAgICAgICAgcHJvZmlsZU1hcC5zZXQocHJvZmlsZU5hbWUsIHtcbiAgICAgICAgICBpZDogU3RyaW5nKHRlc3REYXRhLmlkKSxcbiAgICAgICAgICBuYW1lOiBwcm9maWxlTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBBbHNvIGluY2x1ZGUgYW55IHNuYXBzaG90dGVkIHByb2ZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBjdXJyZW50IHBhcmFtZXRlck9wdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVyUHJvZmlsZVNuYXBzaG90LmZvckVhY2goKHByb2ZpbGU6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBwcm9maWxlLm5hbWUgfHwgcHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICBpZiAocHJvZmlsZU5hbWUgJiYgIXByb2ZpbGVNYXAuaGFzKHByb2ZpbGVOYW1lKSkge1xuICAgICAgICBwcm9maWxlTWFwLnNldChwcm9maWxlTmFtZSwge1xuICAgICAgICAgIGlkOiBTdHJpbmcocHJvZmlsZS5pZCksXG4gICAgICAgICAgbmFtZTogcHJvZmlsZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBBcnJheS5mcm9tKHByb2ZpbGVNYXAudmFsdWVzKCkpO1xuICAgIHJldHVybiBwcm9maWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGF0YSBzZXRzIGZvciBhIHNwZWNpZmljIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIFJldHVybnMgYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlJ3MgZGF0YSBhcnJheVxuICAgKi9cbiAgZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkLCBmYWxsYmFjayB0byBzbmFwc2hvdCBpZiBub3QgaW4gY3VycmVudCBwYXJhbWV0ZXJPcHRpb25zXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWQpO1xuICAgIH0pO1xuICAgIGlmICghdGVzdERhdGFQcm9maWxlKSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmZpbmRQcm9maWxlSW5TbmFwc2hvdChOdW1iZXIocHJvZmlsZUlkKSk7XG4gICAgfVxuXG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUgfHwgIXRlc3REYXRhUHJvZmlsZS5kYXRhIHx8IHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZXR1cm4gYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlXG4gICAgcmV0dXJuIHRlc3REYXRhUHJvZmlsZS5kYXRhLm1hcCgoZGF0YVNldDogYW55KSA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIG5hbWU6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFyYW1ldGVycyBmb3IgYSBzcGVjaWZpYyBkYXRhIHNldCBpbiBhIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIEV4dHJhY3RzIHBhcmFtZXRlciBuYW1lcyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldCdzIGRhdGEgb2JqZWN0XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRPck5hbWU6IHN0cmluZywgZGF0YVNldE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgaWQgb3IgbmFtZSwgZmFsbGJhY2sgdG8gc25hcHNob3RcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGlkTWF0Y2ggPSAhaXNOYU4oTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSkpICYmIHRlc3REYXRhLmlkID09PSBOdW1iZXIocHJvZmlsZUlkT3JOYW1lKTtcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9ICh0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZSkgPT09IHByb2ZpbGVJZE9yTmFtZTtcbiAgICAgIHJldHVybiBpZE1hdGNoIHx8IG5hbWVNYXRjaDtcbiAgICB9KTtcbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSAmJiAhaXNOYU4oTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSkpKSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmZpbmRQcm9maWxlSW5TbmFwc2hvdChOdW1iZXIocHJvZmlsZUlkT3JOYW1lKSk7XG4gICAgfVxuXG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUgfHwgIXRlc3REYXRhUHJvZmlsZS5kYXRhIHx8IHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzcGVjaWZpYyBkYXRhIHNldCBieSBuYW1lXG4gICAgY29uc3QgZGF0YVNldCA9IHRlc3REYXRhUHJvZmlsZS5kYXRhLmZpbmQoKGRzOiBhbnkpID0+IGRzLm5hbWUgPT09IGRhdGFTZXROYW1lKTtcbiAgICBpZiAoIWRhdGFTZXQgfHwgIWRhdGFTZXQuZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgYWxsIHBhcmFtZXRlciBrZXlzIGZyb20gdGhlIGRhdGEgc2V0J3MgZGF0YSBvYmplY3RcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGRhdGFTZXQuZGF0YSk7XG4gICAgcmV0dXJuIHBhcmFtZXRlck5hbWVzLm1hcChwYXJhbU5hbWUgPT4gKHtcbiAgICAgIGlkOiBwYXJhbU5hbWUsXG4gICAgICBuYW1lOiBwYXJhbU5hbWUsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBwcm9maWxlIGluIHRoZSBzbmFwc2hvdCBieSBudW1lcmljIElELlxuICAgKiBVc2VkIGFzIGZhbGxiYWNrIHdoZW4gcGFyYW1ldGVyT3B0aW9ucyBpcyB0ZW1wb3JhcmlseSBmaWx0ZXJlZCBieSBhbm90aGVyIHZhcmlhYmxlJ3Mgc2VhcmNoLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kUHJvZmlsZUluU25hcHNob3QocHJvZmlsZUlkOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiB0aGlzLnNlbGVjdGVkUGFyYW1ldGVyUHJvZmlsZVNuYXBzaG90LnZhbHVlcygpKSB7XG4gICAgICBpZiAocHJvZmlsZSAmJiBwcm9maWxlLmlkID09PSBwcm9maWxlSWQpIHtcbiAgICAgICAgcmV0dXJuIHByb2ZpbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIHRlc3QgZGF0YSBwcm9maWxlIGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgICovXG4gIGdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgO1xuICAgIFxuICAgIC8vIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLmdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTtcbiAgICAvLyBDcmVhdGUgb3B0aW9ucyB3aXRoIHByb2ZpbGUgbmFtZSBhbmQgSUQgKGRpc3BsYXkgbmFtZSB3aXRoIElEKVxuICAgIGxldCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gcHJvZmlsZXMubWFwKHByb2ZpbGUgPT4ge1xuICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgdG8gZ2V0IHRoZSBJRFxuICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gcHJvZmlsZS5uYW1lO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9maWxlSWQgPSB0ZXN0RGF0YVByb2ZpbGU/LmlkIHx8IHByb2ZpbGUuaWQ7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBTdHJpbmcocHJvZmlsZUlkKSxcbiAgICAgICAgdmFsdWU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgbmFtZTogYCR7cHJvZmlsZS5uYW1lfWAsIC8vIERpc3BsYXkgbmFtZSB3aXRoIElEXG4gICAgICAgIGxhYmVsOiBgJHtwcm9maWxlLm5hbWV9YFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBpdFxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgIC8vIFVzZSBwcm9maWxlIElEIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBwcm9maWxlIG5hbWVcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCBcbiAgICAgICAgICA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSBcbiAgICAgICAgICA6ICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSB8fCAnJyk7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudFZhbHVlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyB1cGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBhIHNlbGVjdGVkIHByb2ZpbGVcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgdmFsdWUgaXMgc2V0IGV2ZW4gaWYgY29uZmlnIHdhcyBjYWNoZWRcbiAgICAgIC8vIFVzZSBwcm9maWxlIElEICh3aGljaCBtYXRjaGVzIG9wdC5pZCkgaW5zdGVhZCBvZiBwcm9maWxlIG5hbWUgKHdoaWNoIG1hdGNoZXMgb3B0LnZhbHVlKVxuICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgcHJvZmlsZSBJRCBleGlzdHMgaW4gb3B0aW9ucyBiZWZvcmUgc2V0dGluZ1xuICAgICAgICBjb25zdCBwcm9maWxlRXhpc3RzID0gb3B0aW9uc0FycmF5LnNvbWUob3B0ID0+IG9wdC5pZCA9PT0gcHJvZmlsZUlkU3RyaW5nKTtcbiAgICAgICAgaWYgKHByb2ZpbGVFeGlzdHMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udHJvbFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udHJvbFZhbHVlICE9PSBwcm9maWxlSWRTdHJpbmcpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlSWRTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IGlmIHdlIG9ubHkgaGF2ZSB0aGUgcHJvZmlsZSBuYW1lLCBmaW5kIHRoZSBtYXRjaGluZyBvcHRpb24gYW5kIHVzZSBpdHMgSURcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSBvcHRpb25zQXJyYXkuZmluZChvcHQgPT4gb3B0LnZhbHVlID09PSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSk7XG4gICAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250cm9sVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sVmFsdWUgIT09IG1hdGNoaW5nT3B0aW9uLmlkKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUobWF0Y2hpbmdPcHRpb24uaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIC8vIEFsc28gdXBkYXRlIHRoZSB2YXJpYWJsZSdzIHByb2ZpbGUgSUQgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKG1hdGNoaW5nT3B0aW9uLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9maWxlIGlzIGFsd2F5cyBpbiB0aGUgb3B0aW9ucyBsaXN0IHNvIHdoZW4gdGhlIHVzZXJcbiAgICAvLyByZW9wZW5zIHRoZSBzZWxlY3QgYWZ0ZXIgc2VhcmNoaW5nL3NlbGVjdGluZywgdGhlIHNlbGVjdGVkIG9wdGlvbiBzdGlsbCBzaG93cy5cbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdmFyaWFibGVHcm91cD8uZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsID8gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpIDogKGN1cnJlbnRGb3JtVmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50Rm9ybVZhbHVlICE9PSAnJyA/IFN0cmluZyhjdXJyZW50Rm9ybVZhbHVlKSA6IG51bGwpO1xuICAgIGlmIChzZWxlY3RlZElkICYmICFvcHRpb25zQXJyYXkuc29tZShvcHQgPT4gU3RyaW5nKG9wdC5pZCkgPT09IHNlbGVjdGVkSWQpKSB7XG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkSWQ7XG4gICAgICBvcHRpb25zQXJyYXkgPSBbXG4gICAgICAgIHsgaWQ6IHNlbGVjdGVkSWQsIHZhbHVlOiBkaXNwbGF5TmFtZSwgbmFtZTogZGlzcGxheU5hbWUsIGxhYmVsOiBkaXNwbGF5TmFtZSB9LFxuICAgICAgICAuLi5vcHRpb25zQXJyYXlcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gT25seSB1c2UgY2FjaGUgaWYgdGhlIGNhY2hlZCBjb25maWcncyBvcHRpb25zIGluY2x1ZGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChzbyByZW9wZW5pbmcgc2hvd3Mgc2VsZWN0ZWQpXG4gICAgaWYgKHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWwgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJbkNhY2hlZCA9IGNvbnRyb2xWYWwgPT0gbnVsbCB8fCBjb250cm9sVmFsID09PSAnJyB8fCAoY2FjaGVkLm9wdGlvbnMgfHwgW10pLnNvbWUoKG86IFNlbGVjdE9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoY29udHJvbFZhbCkgfHwgby52YWx1ZSA9PT0gY29udHJvbFZhbCk7XG4gICAgICBpZiAoc2VsZWN0ZWRJbkNhY2hlZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgfVxuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoY2FjaGVLZXkpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgLSBpZiBzbywgZGlzYWJsZSB0aGUgZHJvcGRvd25cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVQYXJhbWV0ZXJzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1BhcmFtZXRlcnMsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmFjdGl2ZVBhcmFtZXRlclNlYXJjaFZhcmlhYmxlID0gdmFyaWFibGUubmFtZTtcbiAgICAgICAgdGhpcy5zZWFyY2hQYXJhbWV0ZXJzLmVtaXQocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIHRoZSBwcm9maWxlIElEIChzdHJpbmcpIGZyb20gdGhlIG1hdC1vcHRpb25cbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgdG8gZ2V0IHRoZSBuYW1lXG4gICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlc3REYXRhLmlkID09PSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3JlIGJvdGggSUQgYW5kIG5hbWVcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlPy5uYW1lIHx8IHRlc3REYXRhUHJvZmlsZT8udGVzdERhdGFOYW1lIHx8ICcnO1xuXG4gICAgICAgIC8vIFNuYXBzaG90IHRoZSBmdWxsIHByb2ZpbGUgc28gaXQgc3Vydml2ZXMgaWYgYW5vdGhlciB2YXJpYWJsZSB0cmlnZ2VycyBhIHNlYXJjaFxuICAgICAgICBpZiAodGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5zZXQodmFyaWFibGUubmFtZSwgdGVzdERhdGFQcm9maWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgc2VsZWN0aW9uIHdoZW4gcHJvZmlsZSBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSAnJztcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSAnJztcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IHZhckdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhckdyb3VwKSB7XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIGZvciBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzIHNpbmNlIHByb2ZpbGUgY2hhbmdlZFxuICAgICAgICAvLyBDbGVhciBhbGwgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBjb25maWdzIGZvciB0aGlzIHZhcmlhYmxlXG4gICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRgKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHNlbGVjdGVkIGRhdGEgc2V0IHdoZW4gcHJvZmlsZSBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBkYXRhIHNldCBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgICovXG4gIGdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCAocHJlZmVycmVkKSBvciBuYW1lIChmYWxsYmFjaylcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgXG4gICAgaWYgKCFzZWxlY3RlZFByb2ZpbGVJZCAmJiAhc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICAvLyBSZXR1cm4gZW1wdHkgY29uZmlnIGlmIG5vIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3NlbGVjdGVkRGF0YVNldCcsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmluZCBJRCBmcm9tIHByb2ZpbGUgbmFtZVxuICAgIGxldCBwcm9maWxlSWRUb1VzZTogc3RyaW5nO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVJZCkge1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIHRoZSBwcm9maWxlIElEIGZyb20gdGhlIHByb2ZpbGUgbmFtZVxuICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgfSk7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IHRlc3REYXRhUHJvZmlsZT8uaWQgPyBTdHJpbmcodGVzdERhdGFQcm9maWxlLmlkKSA6ICcnO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9maWxlIElEIGZvciBjYWNoZSBrZXkgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldF8ke3Byb2ZpbGVJZFRvVXNlIHx8IHNlbGVjdGVkUHJvZmlsZSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IGRhdGEgc2V0cyBmb3IgdGhlIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIHVzaW5nIElEXG4gICAgY29uc3QgZGF0YVNldHMgPSB0aGlzLmdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZFRvVXNlKTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gZGF0YVNldHMubWFwKGRhdGFTZXQgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICB2YWx1ZTogZGF0YVNldC5uYW1lLFxuICAgICAgbmFtZTogZGF0YVNldC5uYW1lLFxuICAgICAgbGFiZWw6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHNldCBzZWxlY3Rpb25cbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgfHwgJyc7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhU2V0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBhIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCAtIGlmIHNvLCBkaXNhYmxlIHRoZSBkcm9wZG93blxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpO1xuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IERhdGEgU2V0JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgc2VsZWN0aW9uIHdoZW4gZGF0YSBzZXQgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZyBzaW5jZSBkYXRhIHNldCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKChjb25maWdWYWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF9gKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKiBEYXRhIFNldCBTdGFydC9FbmQgc2VsZWN0IGNvbmZpZyBmb3IgRk9SLWxvb3AgY29udGV4dC4gKi9cbiAgZ2V0RGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyLCByYW5nZTogJ3N0YXJ0JyB8ICdlbmQnKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgaWYgKCFzZWxlY3RlZFByb2ZpbGVJZCAmJiAhc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IHJhbmdlID09PSAnc3RhcnQnID8gJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JyA6ICdzZWxlY3RlZERhdGFTZXRFbmQnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZXN0IERhdGEgUHJvZmlsZSBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBwcm9maWxlSWRUb1VzZTogc3RyaW5nO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVJZCkge1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0UmFuZ2VfJHtyYW5nZX1fJHtwcm9maWxlSWRUb1VzZSB8fCBzZWxlY3RlZFByb2ZpbGUgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgY29uc3Qga2V5ID0gcmFuZ2UgPT09ICdzdGFydCcgPyAnc2VsZWN0ZWREYXRhU2V0U3RhcnQnIDogJ3NlbGVjdGVkRGF0YVNldEVuZCc7XG4gICAgY29uc3QgY3VycmVudFZhbCA9IHJhbmdlID09PSAnc3RhcnQnID8gKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8ICcnKSA6ICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgfHwgJycpO1xuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KGtleSkpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKGtleSwgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRWYWwpKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbCAmJiB2YXJpYWJsZUdyb3VwLmdldChrZXkpPy52YWx1ZSAhPT0gY3VycmVudFZhbCkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldChrZXkpPy5zZXRWYWx1ZShjdXJyZW50VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXksXG4gICAgICBwbGFjZWhvbGRlcjogcmFuZ2UgPT09ICdzdGFydCcgPyAnU2VsZWN0IERhdGEgU2V0IFN0YXJ0JyA6ICdTZWxlY3QgRGF0YSBTZXQgRW5kJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJhbmdlID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB2YWx1ZTtcbiAgICAgICAgICAvLyBQYXJhbWV0ZXIgb3B0aW9ucyBhcmUgcmVzb2x2ZWQgZnJvbSBzZWxlY3RlZERhdGFTZXQ7IGtlZXAgdGhpcyBhbGlhcyBpbiBzeW5jLlxuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICB2YXJHcm91cC5nZXQoa2V5KT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICBpZiAocmFuZ2UgPT09ICdzdGFydCcgJiYgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKChjb25maWdWYWx1ZSwgaykgPT4ge1xuICAgICAgICAgIGlmIChrLnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goayA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoaykpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIHBhcmFtZXRlciBkcm9wZG93biAodGhpcmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBwYXJhbWV0ZXJzIGZyb20gc2VsZWN0ZWQgZGF0YSBzZXQpXG4gICAqL1xuICBnZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCAocHJlZmVycmVkKSBvciBuYW1lIChmYWxsYmFjaykgYW5kIGRhdGEgc2V0XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlSWQgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkO1xuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgIGNvbnN0IHNlbGVjdGVkRGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgICBcbiAgICBpZiAoKCFzZWxlY3RlZFByb2ZpbGVJZCAmJiAhc2VsZWN0ZWRQcm9maWxlKSB8fCAhc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAvLyBSZXR1cm4gZW1wdHkgY29uZmlnIGlmIHByb2ZpbGUgb3IgZGF0YSBzZXQgaXMgbm90IHNlbGVjdGVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAoc2VsZWN0ZWRQcm9maWxlSWQgfHwgc2VsZWN0ZWRQcm9maWxlKSA/ICdTZWxlY3QgRGF0YSBTZXQgZmlyc3QnIDogJ1NlbGVjdCBUZXN0IERhdGEgUHJvZmlsZSBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9maWxlIElEIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBwcm9maWxlIG5hbWVcbiAgICBjb25zdCBwcm9maWxlSWRlbnRpZmllciA9IHNlbGVjdGVkUHJvZmlsZUlkID8gU3RyaW5nKHNlbGVjdGVkUHJvZmlsZUlkKSA6IChzZWxlY3RlZFByb2ZpbGUgfHwgJycpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0XyR7cHJvZmlsZUlkZW50aWZpZXJ9XyR7c2VsZWN0ZWREYXRhU2V0fWA7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgcGFyYW1ldGVycyBmb3IgdGhlIHNlbGVjdGVkIGRhdGEgc2V0IHVzaW5nIHByb2ZpbGUgSUQgb3IgbmFtZVxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLmdldFBhcmFtZXRlcnNGb3JEYXRhU2V0KHByb2ZpbGVJZGVudGlmaWVyLCBzZWxlY3RlZERhdGFTZXQpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiAoe1xuICAgICAgaWQ6IGBAfCR7cGFyYW0ubmFtZX18YCwgLy8gVXNlIHBhcmFtLm5hbWUgYXMgaWQgKG1hdC1vcHRpb24gd2lsbCB1c2UgdGhpcylcbiAgICAgIHZhbHVlOiBgQHwke3BhcmFtLm5hbWV9fGAsIC8vIEZvcm1hdHRlZCB2YWx1ZSBmb3IgZGlzcGxheVxuICAgICAgbmFtZTogcGFyYW0ubmFtZSxcbiAgICAgIGxhYmVsOiBwYXJhbS5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgYW5kIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZhbHVlLCBlbnN1cmUgZm9ybSBjb250cm9sIG1hdGNoZXMgdGhlIG9wdGlvbiBpZCAoZm9ybWF0dGVkIHZhbHVlKVxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBhbHJlYWR5IGZvcm1hdHRlZCAoZS5nLiwgXCJAfGVtYWlsfFwiKVxuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiBjdXJyZW50VmFsdWUuZW5kc1dpdGgoJ3wnKVxuICAgICAgICA/IGN1cnJlbnRWYWx1ZVxuICAgICAgICA6IChjdXJyZW50VmFsdWUgPyBgQHwke2N1cnJlbnRWYWx1ZX18YCA6ICcnKTtcbiAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2wgdG8gZm9ybWF0dGVkIHZhbHVlIChtYXRjaGVzIG9wdC5pZCkgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgaWYgKGZvcm1hdHRlZFZhbHVlICYmIHBhcmFtZXRlcnMuc29tZShwID0+IGBAfCR7cC5uYW1lfXxgID09PSBmb3JtYXR0ZWRWYWx1ZSkpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICd2YWx1ZScsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IGZhbHNlLCAvLyBDbGllbnQtc2lkZSBzZWFyY2ggc2luY2Ugd2UgYWxyZWFkeSBoYXZlIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSwgLy8gTm8gcGFnaW5hdGlvbiBmb3IgcGFyYW1ldGVycyB3aXRoaW4gYSBkYXRhIHNldFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBWYWx1ZSByZWNlaXZlZCBpcyB0aGUgZm9ybWF0dGVkIHZhbHVlIChlLmcuLCBcIkB8ZW1haWx8XCIpIGJlY2F1c2UgbWF0LW9wdGlvbiB1c2VzIG9wdC5pZFxuICAgICAgICAvLyBFeHRyYWN0IHBhcmFtZXRlciBuYW1lIGZyb20gZm9ybWF0dGVkIHZhbHVlXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFsdWU7IC8vIFRoaXMgaXMgYWxyZWFkeSBmb3JtYXR0ZWQgYXMgQHxwYXJhbU5hbWV8XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IGZvcm1hdHRlZFZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgZm9ybWF0dGVkVmFsdWUuZW5kc1dpdGgoJ3wnKVxuICAgICAgICAgID8gZm9ybWF0dGVkVmFsdWUuc2xpY2UoMiwgLTEpXG4gICAgICAgICAgOiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSByYXcgdmFsdWUgKHN0b3JlIHBhcmFtZXRlciBuYW1lIHdpdGhvdXQgZm9ybWF0dGluZylcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSBwYXJhbU5hbWU7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSBmb3IgdGVtcGxhdGUpXG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAtIHVzZSBmb3JtYXR0ZWQgdmFsdWUgKG1hdGNoZXMgb3B0LmlkKSBzbyBzZWxlY3QgZGlzcGxheXMgY29ycmVjdGx5XG4gICAgICAgIGNvbnN0IHZhckdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhckdyb3VwICYmIHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgIC8vIFNldCB0byBmb3JtYXR0ZWQgdmFsdWUgc28gdGhlIHNlbGVjdCBjYW4gbWF0Y2ggYW5kIGRpc3BsYXkgdGhlIHNlbGVjdGVkIG9wdGlvblxuICAgICAgICAgIHZhckdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBFbWl0IGZvcm1hdHRlZCB2YWx1ZSBmb3IgcGFyZW50IGNvbXBvbmVudCAodGhpcyBpcyB3aGF0IGdldHMgdXNlZCBpbiB0aGUgdGVtcGxhdGUpXG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdW5pcXVlIGVudmlyb25tZW50cyBmcm9tIGVudmlyb25tZW50IG9wdGlvbnNcbiAgICovXG4gIGdldFVuaXF1ZUVudmlyb25tZW50cygpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGVudk1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZvckVhY2goZW52ID0+IHtcbiAgICAgIGlmICghZW52TWFwLmhhcyhlbnYuZW52aXJvbm1lbnQpKSB7XG4gICAgICAgIGVudk1hcC5zZXQoZW52LmVudmlyb25tZW50LCB7XG4gICAgICAgICAgaWQ6IGVudi5lbnZpcm9ubWVudCxcbiAgICAgICAgICBuYW1lOiBlbnYuZW52aXJvbm1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZW52TWFwLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFyYW1ldGVycyBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyc0ZvckVudmlyb25tZW50KGVudmlyb25tZW50TmFtZTogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnNcbiAgICAgIC5maWx0ZXIoZW52ID0+IGVudi5lbnZpcm9ubWVudCA9PT0gZW52aXJvbm1lbnROYW1lKVxuICAgICAgLm1hcChlbnYgPT4gKHtcbiAgICAgICAgaWQ6IGVudi5uYW1lLFxuICAgICAgICBuYW1lOiBlbnYubmFtZVxuICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBlbnZpcm9ubWVudCBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gLSBzZWxlY3QgZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZpcm9ubWVudGA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCB1bmlxdWUgZW52aXJvbm1lbnRzXG4gICAgY29uc3QgdW5pcXVlRW52aXJvbm1lbnRzID0gdGhpcy5nZXRVbmlxdWVFbnZpcm9ubWVudHMoKTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gdW5pcXVlRW52aXJvbm1lbnRzLm1hcChlbnYgPT4gKHtcbiAgICAgIGlkOiBlbnYuaWQsXG4gICAgICB2YWx1ZTogZW52Lm5hbWUsXG4gICAgICBuYW1lOiBlbnYubmFtZSxcbiAgICAgIGxhYmVsOiBlbnYubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVudmlyb25tZW50IGlzIGFsd2F5cyBwcmVzZW50IGluIHRoZSBvcHRpb25zXG4gICAgLy8gKGl0IG1heSBiZSBtaXNzaW5nIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWQgYnkgYSBzZWFyY2ggaW4gYW5vdGhlciB2YXJpYWJsZSdzIGRyb3Bkb3duKVxuICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ICYmICFvcHRpb25zQXJyYXkuc29tZShvID0+IG8udmFsdWUgPT09IHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpKSB7XG4gICAgICBvcHRpb25zQXJyYXkudW5zaGlmdCh7XG4gICAgICAgIGlkOiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50LFxuICAgICAgICB2YWx1ZTogdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCxcbiAgICAgICAgbmFtZTogdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCxcbiAgICAgICAgbGFiZWw6IHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBlbnZpcm9ubWVudCBzZWxlY3Rpb25cbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiAhdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgY29uc3QgY3VycmVudEVudiA9IHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgfHwgJyc7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudEVudikpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIC8vIFVzZSAnc2VsZWN0ZWRFbnZpcm9ubWVudCcgYXMga2V5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBFbnZpcm9ubWVudGAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRW52aXJvbm1lbnRzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0Vudmlyb25tZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IHZhbHVlO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEIGZyb20gZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVudmlyb25tZW50IG9wdGlvbiB3aXRoIG1hdGNoaW5nIGVudmlyb25tZW50IG5hbWUgdG8gZ2V0IHRoZSBJRFxuICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IHZhbHVlKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBJRCBmcm9tIGVudk9wdGlvbi5pZCAoZm9ybWF0OiBcImVudi03NC10ZXN0XCIgLT4gNzQpXG4gICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU25hcHNob3QgdGhlIGVudmlyb25tZW50J3MgcGFyYW1ldGVycyBzbyB0aGV5IHN1cnZpdmUgaWYgYW5vdGhlciB2YXJpYWJsZSB0cmlnZ2VycyBhIHNlYXJjaFxuICAgICAgICBjb25zdCBlbnZQYXJhbXMgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maWx0ZXIoZW52ID0+IGVudi5lbnZpcm9ubWVudCA9PT0gdmFsdWUpO1xuICAgICAgICBpZiAoZW52UGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRPcHRpb25zU25hcHNob3Quc2V0KHZhcmlhYmxlLm5hbWUsIGVudlBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRFbnZpcm9ubWVudCBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgbmV3IGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUlcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmVFbnZpcm9ubWVudFNlYXJjaFZhcmlhYmxlID0gdmFyaWFibGUubmFtZTtcbiAgICAgICAgdGhpcy5zZWFyY2hFbnZpcm9ubWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBzZWxlY3QgcGFyYW1ldGVyIGZyb20gZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IHNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICAgIGlmICghc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBubyBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbnZpcm9ubWVudCBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZW52aXJvbm1lbnQuXG4gICAgLy8gSWYgbGl2ZSBlbnZpcm9ubWVudE9wdGlvbnMgd2VyZSBmaWx0ZXJlZCBieSBhbm90aGVyIHZhcmlhYmxlJ3Mgc2VhcmNoLCBmYWxsIGJhY2sgdG8gdGhlIHNuYXBzaG90LlxuICAgIGxldCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwICYmIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudE9wdGlvbnNTbmFwc2hvdC5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50T3B0aW9uc1NuYXBzaG90LmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgICBwYXJhbWV0ZXJzID0gc25hcHNob3RcbiAgICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBzZWxlY3RlZEVudmlyb25tZW50KVxuICAgICAgICAubWFwKGVudiA9PiAoeyBpZDogZW52Lm5hbWUsIG5hbWU6IGVudi5uYW1lIH0pKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYCp8JHtwYXJhbS5uYW1lfXxgLFxuICAgICAgdmFsdWU6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBQYXJhbWV0ZXJgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gV2hlbiBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQsIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGZvcm1hdCBpdFxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVudmlyb25tZW50IElEIGlzIGFscmVhZHkgc3RvcmVkIG9uIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0ga2VlcCByYXcgdmFsdWUgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gcmF3IHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IElEIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50SWQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnZpcm9ubWVudCBJRHMgZm9yIHZhcmlhYmxlcyB0aGF0IHVzZSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIFJldHVybnMgYSBtYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgZW52SWRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCkge1xuICAgICAgICBlbnZJZHMuc2V0KHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVudklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwbGFpbi10ZXh0XG4gICAqL1xuICBpc1BsYWluVGV4dFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwYXJhbWV0ZXJcbiAgICovXG4gIGlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBzZXQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXBcbiAgICAgID8gISEodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KVxuICAgICAgOiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgc2V0IChmcm9tIHRlc3QgY2FzZSlcbiAgICogSWYgdHJ1ZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4ICE9IG51bGxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhISh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBlbnZpcm9ubWVudFxuICAgKi9cbiAgaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFyaWFibGUgaXMgZWxlbWVudCB0eXBlIChkYXRhS2V5ID09PSAnZWxlbWVudCcpXG4gICAqL1xuICBpc0VsZW1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCBmb3IgYW4gZWxlbWVudCB2YXJpYWJsZVxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNlbGVjdGVkU2NyZWVuTmFtZSBvciBzY3JlZW5OYW1lSWQgaXMgc2V0IChhbmQgbm90IFwiTm9uZVwiKVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgc2NyZWVuTmFtZUlkIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBudW1iZXIgKG5vdCBudWxsL3VuZGVmaW5lZClcbiAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkICE9IG51bGwgJiYgdHlwZW9mIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogY2hlY2sgc2VsZWN0ZWRTY3JlZW5OYW1lXG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBzY3JlZW4gbmFtZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICAgKi9cbiAgZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gSW5jbHVkZSBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gbG9hZGluZyBjb21wbGV0ZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3NjcmVlbk5hbWVfJHt0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzfWA7XG4gICAgaWYgKHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvcHRpb25zOiBpbmNsdWRlIGEgXCJOb25lXCIgb3B0aW9uIChkaXNwbGF5ZWQgYXMgXCJTZWxlY3RcIikgcGx1cyBzY3JlZW5OYW1lT3B0aW9ucyBmcm9tIEFQSVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnbm9uZScsXG4gICAgICAgIHZhbHVlOiAnU2VsZWN0JyxcbiAgICAgICAgbmFtZTogJ05vbmUnLFxuICAgICAgICBsYWJlbDogJ05vbmUnXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5tYXAoc2NyZWVuTmFtZSA9PiAoe1xuICAgICAgICBpZDogc2NyZWVuTmFtZS5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbmFtZTogc2NyZWVuTmFtZS5uYW1lLFxuICAgICAgICBsYWJlbDogc2NyZWVuTmFtZS5uYW1lXG4gICAgICB9KSlcbiAgICBdO1xuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBzY3JlZW4gbmFtZSBzZWxlY3Rpb25cbiAgICAvLyBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAvLyBDb21wYXJlIGFzIHN0cmluZ3MgdG8gaGFuZGxlIGJvdGggbnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHNjcmVlbk5hbWVJZCwgZW5zdXJlIGZvcm0gY29udHJvbCBpcyAnbm9uZScgKGZvciBcIk5vbmVcIiBzZWxlY3Rpb24gYnkgZGVmYXVsdClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09ICdub25lJyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSWYgXCJOb25lXCIgaXMgc2VsZWN0ZWQgKHZhbHVlIGlzICdub25lJyBzdHJpbmcgb3IgbnVsbCksIGNsZWFyIHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50IGluZm9cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICdub25lJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudGApKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkU2NyZWVuTmFtZSB0byAnbm9uZScgdG8gc2hvdyBcIk5vbmVcIiBpcyBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IElEIGZvcm0gY29udHJvbCB0byBlbnN1cmUgZWxlbWVudElkIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBzdG9wIChubyBlbGVtZW50IGZldGNoIHdoZW4gTm9uZSlcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWx1ZSBpcyB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXIgZm9yIHNjcmVlbk5hbWVJZCBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZE51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICdub25lJyA/IHBhcnNlSW50KHZhbHVlLCAxMCkgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogbnVsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyZWVuTmFtZUlkTnVtICYmICFpc05hTihzY3JlZW5OYW1lSWROdW0pKSB7XG4gICAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNjcmVlbk5hbWVJZE51bTtcblxuICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVPcHRpb24gPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHNjcmVlbk5hbWVJZE51bSk7XG4gICAgICAgICAgaWYgKHNjcmVlbk5hbWVPcHRpb24pIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIG5vdCBmb3VuZCwgc3RpbGwgc2V0IHRoZSBJRCBidXQgY2xlYXIgdGhlIG5hbWVcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgZWxlbWVudCBzZWxlY3Rpb24gd2hlbiBzY3JlZW4gbmFtZSBjaGFuZ2VzXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIChhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkKVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzY3JlZW5OYW1lSWROdW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBzY3JlZW4gbmFtZVxuICAgICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCh7XG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCxcbiAgICAgICAgICAgIHNlYXJjaFRlcm06ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZSAtIGNsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZWxlbWVudE9wdGlvbnMgaW5wdXQgY2hhbmdlc1xuICAgICAgICAvLyB2aWEgbmdPbkNoYW5nZXMsIHdoaWNoIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGFuZCB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uXG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgnJyk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU2NyZWVuTmFtZS5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVsZW1lbnQgZHJvcGRvd24gKHNlY29uZCBkcm9wZG93biAtIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICAgKiBPcHRpbWl6ZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIGdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCBzY3JlZW4gbmFtZSBJRFxuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlLlxuICAgIC8vIEV4Y2x1ZGUgaXNMb2FkaW5nRWxlbWVudHMgc28gdGhlIGRyb3Bkb3duL3NlYXJjaCBpbnB1dCBkb2VzIG5vdCByZS1pbml0aWFsaXplIGV2ZXJ5IGtleXN0cm9rZS5cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRfJHtzZWxlY3RlZFNjcmVlbk5hbWVJZCB8fCAnJ31fJHt0aGlzLmVsZW1lbnRPcHRpb25zLmxlbmd0aH1gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzY3JlZW4gbmFtZSBmcm9tIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzY3JlZW4gbmFtZSBkcm9wZG93biBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3Rpb25cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmluZCBhbmQgc3RvcmUgc2NyZWVuIG5hbWUgbmFtZSBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmluZCBhbmQgcGF0Y2ggdGhlIHNlbGVjdG9yIHZhcmlhYmxlIHdpdGggZGF0YUtleSAnbm90X2ZvdW5kJ1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQoXG4gICAgICAgICAgICB2ID0+IHYubmFtZSA9PT0gJ3NlbGVjdG9yJyAmJiB2LmRhdGFLZXkgPT09ICdub3RfZm91bmQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZSAmJiBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBzZWxlY3RvciB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JWYXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cChzZWxlY3RvclZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdG9yIHZhcmlhYmxlJ3MgdmFsdWUgd2l0aCB0aGUgZWxlbWVudCBsb2NhdG9yXG4gICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGUudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogaWYgZWxlbWVudCBub3QgZm91bmQsIGp1c3Qgc2V0IHRoZSB2YWx1ZVxuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIGlmIGVsZW1lbnQgaGFzIGEgc2NyZWVuIG5hbWVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcmVlbiBuYW1lIElEIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPHN0eWxlPlxuICAuY2FwaXRhbGl6ZS1maXJzdDo6Zmlyc3QtbGV0dGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG48L3N0eWxlPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gVGV4dGFyZWEgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAndGV4dGFyZWEnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMCBjcWEtcm91bmRlZC1sZyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTkwMCBjcWEtcmVzaXplLXkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtcmluZy0xIGZvY3VzOmNxYS1yaW5nLWluZGlnby01MDAgZm9jdXM6Y3FhLWJvcmRlci1pbmRpZ28tNTAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwidmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgIHJvd3M9XCI0XCJcbiAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQycHg7XCJcbiAgICAgICAgICAoaW5wdXQpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBOdW1iZXIgdmFyaWFibGVzIHdpdGggbnVtYmVyIGlucHV0IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnbnVtYmVyJyAmJiB2YXJpYWJsZS5kYXRhS2V5ICE9PSAnZWxlbWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt0eXBlXT1cIidudW1iZXInXCIgW3BsYWNlaG9sZGVyXT1cIidOdW1iZXIgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vbi1ib29sZWFuLCBub24tY3VzdG9tX2NvZGUgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnICYmIHZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnZHJvcGRvd24nICYmIHZhcmlhYmxlLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgISh2YXJpYWJsZS50eXBlID09PSAnbnVtYmVyJyAmJiB2YXJpYWJsZS5kYXRhS2V5ICE9PSAnZWxlbWVudCcpXCI+XG4gICAgICA8IS0tIEVsZW1lbnQgdmFyaWFibGVzIHdpdGggY2FzY2FkaW5nIGRyb3Bkb3ducyAoc2NyZWVuIG5hbWUgKyBlbGVtZW50KSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX0gU2NyZWVuIE5hbWU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlKTsgZWxzZSBlbGVtZW50TWFudWFsSW5wdXRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbGVtZW50TWFudWFsSW5wdXQ+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt0eXBlXT1cIidudW1iZXInXCIgW3BsYWNlaG9sZGVyXT1cIidOdW1iZXIgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgPCEtLSBPdGhlciBkcm9wZG93biB2YXJpYWJsZXMgKHR5cGUsIHNjcm9sbFRvLCBsYWJlbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkU2hvd0Ryb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSBkZWZhdWx0SW5wdXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXQ+XG4gICAgICAgIDwhLS0gVGVzdC1kYXRhLCBzb3VyY2UtdmFsdWUsIG9yIHRhcmdldC12YWx1ZSB3aXRoIGRhdGEgdHlwZSBkcm9wZG93biAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgcmVndWxhcklucHV0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fSBUeXBlPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBOYW1lPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnQgVmFsdWU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BhcmFtZXRlclR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgVGVzdCBEYXRhIFByb2ZpbGU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlKSAmJiAhaXNJbnNpZGVGb3JMb29wU3RlcFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSkgJiYgaXNJbnNpZGVGb3JMb29wU3RlcFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXQgU3RhcnQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpLCAnc3RhcnQnKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlKSAmJiBpc0luc2lkZUZvckxvb3BTdGVwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBEYXRhIFNldCBFbmQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpLCAnZW5kJylcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzUGxhaW5UZXh0VHlwZSh2YXJpYWJsZSkgfHwgaXNSdW50aW1lVHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BsYWluVGV4dFR5cGUodmFyaWFibGUpOyBlbHNlIHJ1bnRpbWVQbGFpbklucHV0XCI+XG4gICAgICAgICAgICAgIDxjcWEtbWl4ZWQtdmFyaWFibGUtaW5wdXRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0UmF3VmFsdWUodmFyaWFibGUpXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICh2YWxpZGl0eUNoYW5nZSk9XCJvblRlc3REYXRhVmFsaWRpdHlDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1taXhlZC12YXJpYWJsZS1pbnB1dD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNydW50aW1lUGxhaW5JbnB1dD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZSh2YXJpYWJsZSlcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRlc3REYXRhVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNyZWd1bGFySW5wdXQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICA8Y3FhLWVsZW1lbnQtZm9ybVxuICAgIFtpc0NyZWF0ZU1vZGVdPVwidHJ1ZVwiXG4gICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICBbaXNFZGl0SW5EZXB0aEF2YWlsYWJsZV09XCJmYWxzZVwiXG4gICAgKGNyZWF0ZUVsZW1lbnQpPVwib25DcmVhdGVFbGVtZW50KCRldmVudClcIlxuICAgIChjYW5jZWwpPVwib25DYW5jZWxFbGVtZW50Rm9ybSgpXCJcbiAgICAoc2VhcmNoU2NyZWVuTmFtZSk9XCJzZWFyY2hTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIj5cbiAgPC9jcWEtZWxlbWVudC1mb3JtPlxuPC9kaXY+Il19
3210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBaURqRyxNQUFNLE9BQU8sOEJBQThCO0lBb016QyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQW5NakMsc0JBQWlCLEdBQXVCLEVBQUUsQ0FBQztRQUMzQyxrQkFBYSxHQUFjLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsbUJBQWMsR0FBYyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7UUFDdkUsb0JBQWUsR0FBWSxLQUFLLENBQUMsQ0FBQyxzQ0FBc0M7UUFDeEUsc0JBQWlCLEdBQVksS0FBSyxDQUFDLENBQUMsNkJBQTZCO1FBQzFFLG1FQUFtRTtRQUMxRCxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQ3BELGtFQUFrRTtRQUN6RCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDN0Msc0VBQXNFO1FBQzdELHlCQUFvQixHQUFZLEtBQUss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IE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvckZuLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbGVtZW50Q3JlYXRlUGF5bG9hZCwgU2NyZWVuTmFtZU9wdGlvbiB9IGZyb20gJy4uLy4uL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC1mb3JtLWRhdGEnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7XG4gIHNjcmVlbk5hbWVPYmo/OiBhbnk7IC8vIEZpeGVkOiB1c2UgJ2FueScgc2luY2UgJ0VsZW1lbnRTY3JlZW5OYW1lJyBpcyBub3QgZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlVmFyaWFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGFLZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W107XG4gIC8vIEFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgbWFuYWdpbmcgdmFyaWFibGUgc3RhdGVcbiAgZGF0YVR5cGU/OiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgfCAnZ2xvYmFsJztcbiAgcmF3VmFsdWU/OiBzdHJpbmc7IC8vIFJhdyB2YWx1ZSB3aXRob3V0IGZvcm1hdHRpbmcgKGZvciBzZWxlY3QgZHJvcGRvd25zKVxuICBzZWxlY3RlZEVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBJRCAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkR2xvYmFsVmFyaWFibGU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGdsb2JhbCB2YXJpYWJsZSBuYW1lIChmb3IgZ2xvYmFsIHR5cGUpXG4gIHNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgZ2xvYmFsIHZhcmlhYmxlIGlkIChmb3IgZ2xvYmFsIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkRGF0YVNldD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZERhdGFTZXRTdGFydD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgc3RhcnQgbmFtZSAoZm9yIEZPUiBsb29wIGNvbnRleHQpXG4gIHNlbGVjdGVkRGF0YVNldEVuZD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgZW5kIG5hbWUgKGZvciBGT1IgbG9vcCBjb250ZXh0KVxuICBzZWxlY3RlZFNjcmVlbk5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVsZW1lbnQgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRMb2NhdG9yPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IGxvY2F0b3IgdmFsdWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnROYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVXBsb2FkIG9wdGlvbnMgZm9yIHVwbG9hZCBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgdXBsb2FkcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVVwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgdXBsb2FkcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nVXBsb2FkczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEdsb2JhbCBEYXRhIHZhcmlhYmxlcyAod29ya3NwYWNlLXNjb3BlZCkgZm9yIHRoZSBuZXcgR2xvYmFsIERhdGEgdGFiICovXG4gIEBJbnB1dCgpIGdsb2JhbFZhcmlhYmxlT3B0aW9uczogeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IHJlYWRXcml0ZU1vZGU/OiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGdsb2JhbCB2YXJpYWJsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nR2xvYmFsVmFyaWFibGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBSZXNvbHZlZCB0ZXN0LWNhc2UgZW52aXJvbm1lbnQgbmFtZSwgdXNlZCBmb3IgdGhlIGVudiBiYW5uZXIgc3ViaGVhZC4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTdWZmaXggYXBwZW5kZWQgdG8gdGhlIGVudi1uYW1lIG9wdGlvbiBsYWJlbCBvbmx5IChlLmcuICcoZGVmYXVsdCknKS4gV2hlbiBzZXQsIGFsc28gbG9ja3MgdGhlIGVudiBkcm9wZG93bi4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4Pzogc3RyaW5nO1xuICAvKiogV2hlbiBzZXQsIHJlbmRlcnMgYW4gaXRhbGljIG5vdGUgdW5kZXIgdGhlIGVudiBkcm9wZG93biDigJQgZS5nLiBsZWdhY3kgc3RlcC1sZXZlbCBlbnYgZGVwcmVjYXRpb24gbm90aWNlLiAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudExlZ2FjeURlcHJlY2F0aW9uTWVzc2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRydWUgb25seSB1bmRlciBUaWVyIDEgb2YgdGhlIGVudi1vbi10ZXN0LWNhc2UgMy10aWVyIHJlc29sdXRpb25cbiAgICogKHRlc3RDYXNlLmVudmlyb25tZW50SWQgc2V0KS4gSGlkZXMgdGhlIHJlZHVuZGFudCBcIkVudmlyb25tZW50IE5hbWVcIlxuICAgKiBwaWNrZXIg4oCUIHRoZSBlbnYgYmFubmVyIGFscmVhZHkgc3RhdGVzIGl0LlxuICAgKiBUaWVyIDIgKGxlZ2FjeSBzdGVwIGVudiwgZGVwdGgtbW9kYWwpOiBkZXByZWNhdGlvbiBtZXNzYWdlIHNldCDihpIgZmFsc2UuXG4gICAqIFRpZXIgMyAod29ya3NwYWNlIGRlZmF1bHQpOiBsYWJlbFN1ZmZpeD0nKGRlZmF1bHQpJyArIGRlcHJlY2F0aW9uIHNldCDihpIgZmFsc2UuXG4gICAqIEJvdGggJ25vIHN1ZmZpeCcgQU5EICdubyBkZXByZWNhdGlvbicgYXJlIHJlcXVpcmVkIGJlY2F1c2UgaW4gdGhlIGRlcHRoXG4gICAqIG1vZGFsIFRpZXIgMiBsZWF2ZXMgc3VmZml4IHVuZGVmaW5lZCBidXQgcG9wdWxhdGVzIHRlc3RDYXNlRW52aXJvbm1lbnROYW1lXG4gICAqIHdpdGggdGhlIGxlZ2FjeSBzdGVwIGVudiBuYW1lIOKAlCB0aGUgZGVwcmVjYXRpb24gbWVzc2FnZSBpcyB3aGF0XG4gICAqIGRpc3Rpbmd1aXNoZXMgVGllciAxIGZyb20gVGllciAyLlxuICAgKi9cbiAgZ2V0IGhpZGVFbnZpcm9ubWVudE5hbWVGaWVsZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMudGVzdENhc2VFbnZpcm9ubWVudE5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBzdWZmaXggPSAodGhpcy50ZXN0Q2FzZUVudmlyb25tZW50TGFiZWxTdWZmaXggPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXByZWNhdGlvbiA9ICh0aGlzLmVudmlyb25tZW50TGVnYWN5RGVwcmVjYXRpb25NZXNzYWdlID8/ICcnKS50cmltKCk7XG4gICAgcmV0dXJuICEhbmFtZSAmJiAhc3VmZml4ICYmICFkZXByZWNhdGlvbjtcbiAgfVxuICAvKiogVGVzdCBjYXNlJ3MgVERQIGlkICh3aGVuIHNldCwgdGhlIFREUCBwaWNrZXIgaXMgbG9ja2VkIGluIHRoZSBwYXJhbWV0ZXIgdGFiKS4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VUZXN0RGF0YUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIGVuZCBpbmRleCBmcm9tIEZPUiBsb29wIGNvbnRleHQgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGVkaXRlZCBzdGVwIGlzIGluc2lkZSBhIEZPUiBsb29wLiAqL1xuICBASW5wdXQoKSBpc0luc2lkZUZvckxvb3BTdGVwOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHBhcmVudCB0ZXN0IGNhc2UgaGFzIGEgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlndXJlZCAodGVzdENhc2UudGVzdERhdGFJZCBpcyBzZXQpLiAqL1xuICBASW5wdXQoKSBoYXNUZXN0RGF0YVByb2ZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBAT3V0cHV0KCkgdmFyaWFibGVWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHZhcmlhYmxlQm9vbGVhbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBtZXRhZGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBsb2FkIG1vcmUgaXMgcmVxdWVzdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZWxlbWVudHNcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNjcmVlbk5hbWVJZDogbnVtYmVyOyBzZWFyY2hUZXJtPzogc3RyaW5nIH0+KCk7IC8vIEVtaXQgd2hlbiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RWxlbWVudENyZWF0ZVBheWxvYWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCBwYXlsb2FkXG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGNyZWF0ZSBhIG5ldyBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBzZWFyY2hVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciB1cGxvYWRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVVwbG9hZHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHVwbG9hZHNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hHbG9iYWxWYXJpYWJsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZ2xvYmFsIHZhcmlhYmxlc1xuICBAT3V0cHV0KCkgY2FuY2VsRWxlbWVudEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGZvcm0gaXMgY2FuY2VsbGVkXG4gIEBPdXRwdXQoKSBlbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGZvcm0gdmlzaWJpbGl0eSBjaGFuZ2VzXG4gIFxuICAvLyBDYWNoZSBmb3Igc2VsZWN0IGNvbmZpZ3MgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHByaXZhdGUgc2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZGF0YSB0eXBlIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gQ2FjaGUgZm9yIHRoZSBBSSBBc2sgLyBBSSBWZXJpZnkgZW52aXJvbm1lbnQtbmFtZSBkcm9wZG93biBjb25maWdzLlxuICAvLyBNVVNUIGJlIGNhY2hlZDogdGhlIGNvbmZpZyBidWlsZGVyIGlzIGNhbGxlZCBmcm9tIHRoZSB0ZW1wbGF0ZSBiaW5kaW5nIG9uXG4gIC8vIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUuIFJldHVybmluZyBhIGZyZXNoIG9iamVjdC9hcnJheS9jbG9zdXJlIGVhY2hcbiAgLy8gdGltZSB0cmlnZ2VycyBjcWEtZHluYW1pYy1zZWxlY3QgdG8gcmUtZW1pdCwgd2hpY2ggcmUtcnVucyBDRCwgd2hpY2ggY2FsbHNcbiAgLy8gdGhpcyBnZXR0ZXIgYWdhaW4g4oCUIGEgdGlnaHQgbG9vcCB0aGF0IHBlZ3MgQ1BVIGF0IDEwMCUuXG4gIHByaXZhdGUgZW52aXJvbm1lbnROYW1lU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gQ2FjaGUgZm9yIGdsb2JhbC12YXJpYWJsZSBzZWxlY3QgY29uZmlncy4gV2l0aG91dCB0aGlzLCB0aGUgdGVtcGxhdGUnc1xuICAvLyBgW2NvbmZpZ109XCJnZXRHbG9iYWxWYXJpYWJsZVNlbGVjdENvbmZpZyguLi4pXCJgIGFsbG9jYXRlcyBhIG5ldyBjb25maWdcbiAgLy8gZXZlcnkgQ0QgcGFzcyDigJQgY3FhLWR5bmFtaWMtc2VsZWN0IHNlZXMgdGhlIG5ldyByZWZlcmVuY2UgYW5kIHRyaWdnZXJzXG4gIC8vIGFub3RoZXIgQ0QsIHBlZ2dpbmcgdGhlIHRhYiBhdCAxMDAlIENQVS5cbiAgcHJpdmF0ZSBnbG9iYWxWYXJpYWJsZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNjcmVlbiBuYW1lIHNlbGVjdCBjb25maWdzIChmb3IgZWxlbWVudCB2YXJpYWJsZXMpXG4gIHByaXZhdGUgc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVsZW1lbnQgc2VsZWN0IGNvbmZpZ3MgKGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICBwcml2YXRlIGVsZW1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlncyAoZmlyc3QgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMpXG4gIHByaXZhdGUgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZGF0YSBzZXQgc2VsZWN0IGNvbmZpZ3MgKHNlY29uZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIGRhdGEgc2V0cyBmcm9tIHNlbGVjdGVkIHByb2ZpbGUpXG4gIHByaXZhdGUgZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICAvLyBUcmFjayB3aGljaCB2YXJpYWJsZSB0cmlnZ2VyZWQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgc2VhcmNoICh0byBhdm9pZCByZXNldHRpbmcgb3RoZXIgdmFyaWFibGVzKVxuICBwcml2YXRlIGFjdGl2ZUVudmlyb25tZW50U2VhcmNoVmFyaWFibGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvLyBUcmFjayB3aGljaCB2YXJpYWJsZSB0cmlnZ2VyZWQgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNlYXJjaCAodG8gYXZvaWQgcmVzZXR0aW5nIG90aGVyIHZhcmlhYmxlcycgcHJvZmlsZXMpXG4gIHByaXZhdGUgYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvLyBTbmFwc2hvdCBvZiB0aGUgc2VsZWN0ZWQgVGVzdERhdGEgcHJvZmlsZSBmb3IgZWFjaCB2YXJpYWJsZSwgc28gdGhhdCBhIHNlYXJjaCBpbiBhbm90aGVyIHZhcmlhYmxlJ3NcbiAgLy8gZHJvcGRvd24gZG9lc24ndCBsb3NlIHRoZSBwcm9maWxlL2RhdGFzZXQvcGFyYW1ldGVyIHdoZW4gcGFyYW1ldGVyT3B0aW9ucyBpcyB0ZW1wb3JhcmlseSBmaWx0ZXJlZC5cbiAgcHJpdmF0ZSBzZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdDogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAvLyBTbmFwc2hvdCBvZiBlbnZpcm9ubWVudE9wdGlvbnMgZm9yIGVhY2ggdmFyaWFibGUncyBzZWxlY3RlZCBlbnZpcm9ubWVudCxcbiAgLy8gc28gdGhhdCBhIHNlYXJjaCBpbiBhbm90aGVyIHZhcmlhYmxlJ3MgZHJvcGRvd24gZG9lc24ndCBsb3NlIHRoZSBwYXJhbWV0ZXIgbGlzdC5cbiAgcHJpdmF0ZSBzZWxlY3RlZEVudmlyb25tZW50T3B0aW9uc1NuYXBzaG90OiBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzdGFydC9lbmQgY29uZmlncyAoRk9SIGxvb3AgY29udGV4dClcbiAgcHJpdmF0ZSBkYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3MgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICBwcml2YXRlIHBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgbmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNob3VsZFNob3dEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIFByZS1jb21wdXRlZCBkYXRhIHR5cGUgb3B0aW9ucyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICAvLyBPcmRlciBtYXRjaGVzIHRoZSBkZXNpZ246IFBsYWluIFRleHQgwrcgUnVuIFRpbWUgwrcgRW52IFZhcmlhYmxlIMK3IEdsb2JhbCBEYXRhIMK3IFRlc3QgRGF0YSBQcm9maWxlXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAncGxhaW4tdGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcsIG5hbWU6ICdQbGFpbiBUZXh0JywgbGFiZWw6ICdQbGFpbiBUZXh0JyB9LFxuICAgIHsgaWQ6ICdydW50aW1lJywgdmFsdWU6ICdydW50aW1lJywgbmFtZTogJ1J1biBUaW1lIFZhcmlhYmxlJywgbGFiZWw6ICdSdW4gVGltZSBWYXJpYWJsZScgfSxcbiAgICB7IGlkOiAnZW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JywgbmFtZTogJ0Vudmlyb25tZW50IFZhcmlhYmxlJywgbGFiZWw6ICdFbnZpcm9ubWVudCBWYXJpYWJsZScgfSxcbiAgICB7IGlkOiAnZ2xvYmFsJywgdmFsdWU6ICdnbG9iYWwnLCBuYW1lOiAnR2xvYmFsIERhdGEnLCBsYWJlbDogJ0dsb2JhbCBEYXRhJyB9LFxuICAgIHsgaWQ6ICdwYXJhbWV0ZXInLCB2YWx1ZTogJ3BhcmFtZXRlcicsIG5hbWU6ICdUZXN0IERhdGEgUHJvZmlsZScsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH1cbiAgXTtcblxuICAvKipcbiAgICogU3RhYmxlIHNlZ21lbnQgb3B0aW9ucyBmb3IgdGhlIFZhbHVlIFNvdXJjZSBzZWdtZW50IHN0cmlwLiBNVVNUIGJlIGEgZmllbGRcbiAgICogKG5vdCBhIGdldHRlcikg4oCUIHNlZSBmZWVkYmFja19zZWdtZW50X2NvbnRyb2xfbm9fZ2V0dGVyX2lucHV0Lm1kOiBhIGdldHRlclxuICAgKiB0cmlnZ2VycyBhIENEIGxvb3AgaW4gY3FhLXNlZ21lbnQtY29udHJvbC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFUeXBlU2VnbWVudHM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ3BsYWluLXRleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gICAgeyB2YWx1ZTogJ3J1bnRpbWUnLCBsYWJlbDogJ1J1biBUaW1lIFZhcmlhYmxlJyB9LFxuICAgIHsgdmFsdWU6ICdlbnZpcm9ubWVudCcsIGxhYmVsOiAnRW52aXJvbm1lbnQgVmFyaWFibGUnIH0sXG4gICAgeyB2YWx1ZTogJ2dsb2JhbCcsIGxhYmVsOiAnR2xvYmFsIERhdGEnIH0sXG4gICAgeyB2YWx1ZTogJ3BhcmFtZXRlcicsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIE1lbW9pemVkIGZpbHRlcmVkIHNlZ21lbnRzIOKAlCBkcm9wcyBUZXN0IERhdGEgUHJvZmlsZSB3aGVuIG5laXRoZXIgVEMgbm9yIEZPUiBsb29wIGhhcyBhIFREUC5cbiAgICogSGVsZCBhcyBhIGZpZWxkIChub3QgYSBnZXR0ZXIpIHNvIGNxYS1zZWdtZW50LWNvbnRyb2wncyBbc2VnbWVudHNdIHN0YXlzIGEgc3RhYmxlIHJlZmVyZW5jZS5cbiAgICogUmVjb21wdXRlZCBpbiBuZ09uQ2hhbmdlcyB3aGVuIGlzSW5zaWRlRm9yTG9vcFN0ZXAgLyBoYXNUZXN0RGF0YVByb2ZpbGUgY2hhbmdlLlxuICAgKi9cbiAgdmlzaWJsZURhdGFUeXBlU2VnbWVudHM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSB0aGlzLmRhdGFUeXBlU2VnbWVudHM7XG5cbiAgcHJpdmF0ZSByZWNvbXB1dGVWaXNpYmxlU2VnbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXAgJiYgIXRoaXMuaGFzVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICB0aGlzLnZpc2libGVEYXRhVHlwZVNlZ21lbnRzID0gdGhpcy5kYXRhVHlwZVNlZ21lbnRzLmZpbHRlcihzID0+IHMudmFsdWUgIT09ICdwYXJhbWV0ZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aXNpYmxlRGF0YVR5cGVTZWdtZW50cyA9IHRoaXMuZGF0YVR5cGVTZWdtZW50cztcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBjcmVhdGVFbGVtZW50VmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uQ3JlYXRlRWxlbWVudChwYXlsb2FkOiBFbGVtZW50Q3JlYXRlUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudC5lbWl0KHBheWxvYWQpO1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWxFbGVtZW50Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmNhbmNlbEVsZW1lbnRGb3JtLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmKGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCBjaGFuZ2VkXCIsIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddKTtcbiAgICB9XG4gICAgaWYoY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggY2hhbmdlZFwiLCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pO1xuICAgIH1cbiAgICBpZihjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImRlZmF1bHRUZXN0RGF0YUVuZEluZGV4IGNoYW5nZWRcIiwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhRW5kSW5kZXgnXSk7XG4gICAgfVxuICAgIGlmKGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSkge1xuICAgICAgY29uc29sZS5sb2coXCJpc0luc2lkZUZvckxvb3BTdGVwIGNoYW5nZWRcIiwgY2hhbmdlc1snaXNJbnNpZGVGb3JMb29wU3RlcCddKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1sndmFyaWFibGVzRm9ybSddIHx8IGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHxcbiAgICAgICAgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2dsb2JhbFZhcmlhYmxlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0dsb2JhbFZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ3Rlc3RDYXNlRW52aXJvbm1lbnROYW1lJ10gfHxcbiAgICAgICAgY2hhbmdlc1sndGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4J10gfHwgY2hhbmdlc1snZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2UnXSB8fFxuICAgICAgICBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhRW5kSW5kZXgnXSB8fCBjaGFuZ2VzWydpc0luc2lkZUZvckxvb3BTdGVwJ10gfHwgY2hhbmdlc1snaGFzVGVzdERhdGFQcm9maWxlJ10pIHtcblxuICAgICAgLy8gRHJvcCBkYXRhVHlwZSBvcHRpb24gY2FjaGUgc28gZHJvcGRvd24gb3B0aW9ucyBhcmUgcmUtZmlsdGVyZWQgb24gaW5wdXQgY2hhbmdlLlxuICAgICAgaWYgKGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSB8fCBjaGFuZ2VzWydoYXNUZXN0RGF0YVByb2ZpbGUnXSkge1xuICAgICAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZWNvbXB1dGVWaXNpYmxlU2VnbWVudHMoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gT25seSBjbGVhciBjYWNoZXMgZm9yIGNoYW5nZWQgaW5wdXRzLCBub3QgYWxsIGNhY2hlc1xuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1sndmFyaWFibGVzRm9ybSddKSB7XG4gICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZXMgd2hlbiB0ZW1wbGF0ZSB2YXJpYWJsZXMgb3IgZm9ybSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnROYW1lU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVmFyaWFibGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRPcHRpb25zU25hcHNob3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5jbGVhcigpO1xuICAgICAgICB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGVsZW1lbnQgYW5kIHNjcmVlbiBuYW1lIGNhY2hlcyBvbmx5IHdoZW4gdGhlaXIgb3B0aW9ucyBjaGFuZ2VcbiAgICAgIGlmIChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbGVtZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0VsZW1lbnRzJ10pIHtcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVNjcmVlbk5hbWVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nU2NyZWVuTmFtZXMnXSkge1xuICAgICAgICB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVQYXJhbWV0ZXJzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nUGFyYW1ldGVycyddKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGFyYW1ldGVyT3B0aW9ucyBjaGFuZ2VkXCIsIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVBhcmFtZXRlclNlYXJjaFZhcmlhYmxlKSB7XG4gICAgICAgICAgLy8gT25seSBjbGVhci9yZWJ1aWxkIGNhY2hlIGZvciB0aGUgdmFyaWFibGUgdGhhdCB0cmlnZ2VyZWQgdGhlIHNlYXJjaFxuICAgICAgICAgIGNvbnN0IHNlYXJjaFZhciA9IHRoaXMuYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGU7XG4gICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7c2VhcmNoVmFyfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7c2VhcmNoVmFyfV9kYXRhU2V0YCk7XG4gICAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7c2VhcmNoVmFyfV9kYXRhU2V0UmFuZ2Vfc3RhcnRgKTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X2RhdGFTZXRSYW5nZV9lbmRgKTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7c2VhcmNoVmFyfV9wYXJhbUZvckRhdGFTZXRgKTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X3BhcmFtZXRlcmApO1xuICAgICAgICAgIHRoaXMuYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNwZWNpZmljIHZhcmlhYmxlIHRyaWdnZXJlZCB0aGlzIOKAlCBjbGVhciBhbGwgKGUuZy4gaW5pdGlhbCBsb2FkLCBsb2FkIG1vcmUpXG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWyd1cGxvYWRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVVwbG9hZHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdVcGxvYWRzJ10pIHtcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0IGNvbmZpZyBjYWNoZSBmb3IgdXBsb2FkIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10pIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRW52aXJvbm1lbnRTZWFyY2hWYXJpYWJsZSkge1xuICAgICAgICAgIC8vIE9ubHkgY2xlYXIvcmVidWlsZCBjYWNoZSBmb3IgdGhlIHZhcmlhYmxlIHRoYXQgdHJpZ2dlcmVkIHRoZSBzZWFyY2hcbiAgICAgICAgICBjb25zdCBzZWFyY2hWYXIgPSB0aGlzLmFjdGl2ZUVudmlyb25tZW50U2VhcmNoVmFyaWFibGU7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X2Vudmlyb25tZW50YCk7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHtzZWFyY2hWYXJ9X2VudlBhcmFtYCk7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE5hbWVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7c2VhcmNoVmFyfV9lbnZpcm9ubWVudE5hbWVgKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUVudmlyb25tZW50U2VhcmNoVmFyaWFibGUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNwZWNpZmljIHZhcmlhYmxlIHRyaWdnZXJlZCB0aGlzIOKAlCBjbGVhciBhbGwgKGUuZy4gaW5pdGlhbCBsb2FkLCBsb2FkIG1vcmUpXG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE5hbWVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3RDYXNlRW52aXJvbm1lbnROYW1lIGFycml2ZXMgYXN5bmNocm9ub3VzbHkgKHBhcmVudCByZXNvbHZlcyBlbnYgbmFtZVxuICAgICAgLy8gdmlhIGVudmlyb25tZW50U2VydmljZS5zaG93KS4gV2hlbiBpdCBsYW5kcywgZHJvcCB0aGUgZW52IGNhY2hlcyBzbyB0aGVcbiAgICAgIC8vIGF1dG8tZGVmYXVsdCBzZWVkIGluIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnIHJ1bnMgb25jZSBhbmQgdGhlXG4gICAgICAvLyBcIkVudmlyb25tZW50IE5hbWVcIiBkcm9wZG93biBwcmUtc2VsZWN0cyB0aGUgdGVzdCBjYXNlJ3MgZW52IGluc3RlYWQgb2ZcbiAgICAgIC8vIHNob3dpbmcgdGhlIFwiU2VsZWN0IEVudmlyb25tZW50XCIgcGxhY2Vob2xkZXIuIFRoZSBzeW50aGV0aWMgZW52LW5hbWVcbiAgICAgIC8vIGRyb3Bkb3duIChBSSBBc2sgLyBBSSBWZXJpZnkpIGFsc28gZGVwZW5kcyBvbiB0aGVzZSBmb3IgaXRzIGxvY2sgc3RhdGVcbiAgICAgIC8vIGFuZCAnKGRlZmF1bHQpJyBzdWZmaXggZGVjb3JhdGlvbiwgc28gaXRzIGNhY2hlIGlzIGRyb3BwZWQgaGVyZSB0b28uXG4gICAgICBpZiAoY2hhbmdlc1sndGVzdENhc2VFbnZpcm9ubWVudE5hbWUnXSB8fCBjaGFuZ2VzWyd0ZXN0Q2FzZUVudmlyb25tZW50TGFiZWxTdWZmaXgnXSkge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnROYW1lU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2xvYmFsIERhdGEgZHJvcGRvd24ncyBvcHRpb25zL2xvYWRpbmcgc3RhdGUgY2hhbmdlZCDigJQgZHJvcCB0aGUgZ2xvYmFsXG4gICAgICAvLyBjb25maWcgY2FjaGUgc28gdGhlIG5leHQgcmVuZGVyIHJlYnVpbGRzIHdpdGggdGhlIGZyZXNoIGxpc3QuXG4gICAgICBpZiAoY2hhbmdlc1snZ2xvYmFsVmFyaWFibGVPcHRpb25zJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nR2xvYmFsVmFyaWFibGVzJ10pIHtcbiAgICAgICAgdGhpcy5nbG9iYWxWYXJpYWJsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gZ2xvYmFsVmFyaWFibGVPcHRpb25zIGFycml2ZSAob3IgY2hhbmdlKSBhZnRlciB0ZW1wbGF0ZVZhcmlhYmxlcyBhcmUgbG9hZGVkLFxuICAgICAgLy8gYmFja2ZpbGwgc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkIG9uIGFueSBnbG9iYWwtdHlwZSB2YXJpYWJsZSB0aGF0IGhhcyBhIG5hbWUgYnV0XG4gICAgICAvLyBzdGlsbCBsYWNrcyB0aGUgbnVtZXJpYyBpZCAodGhlIGxvb2t1cCBjb3VsZG4ndCBydW4gZHVyaW5nIGluaXRpYWwgaW5pdCBiZWNhdXNlXG4gICAgICAvLyBvcHRpb25zIHdlcmUgZW1wdHkpLlxuICAgICAgaWYgKGNoYW5nZXNbJ2dsb2JhbFZhcmlhYmxlT3B0aW9ucyddICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5iYWNrZmlsbEdsb2JhbFZhcmlhYmxlSWRzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2FjdGl2ZWx5IHNlZWQgZW52LXR5cGUgdmFyaWFibGVzIHdpdGggdGhlIHRlc3QgY2FzZSdzIGVudmlyb25tZW50LlxuICAgICAgLy8gUnVucyB3aGVuZXZlciBhbnkgaW5wdXQgdGhhdCBjb3VsZCB1bmxvY2sgdGhlIHNlZWQgY2hhbmdlcyDigJQgcmVseWluZyBvblxuICAgICAgLy8gYSBsYXp5IHNlZWQgaW5zaWRlIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnIG1pc3NlcyB0aGUgY2FzZSB3aGVyZSB0aGVcbiAgICAgIC8vIHNlZ21lbnQgaXMgY2xpY2tlZCBiZWZvcmUgZW52aXJvbm1lbnRPcHRpb25zIC8gdGVzdENhc2VFbnZpcm9ubWVudE5hbWVcbiAgICAgIC8vIGJvdGggYXJyaXZlLlxuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHxcbiAgICAgICAgICBjaGFuZ2VzWyd0ZXN0Q2FzZUVudmlyb25tZW50TmFtZSddKSB7XG4gICAgICAgIHRoaXMuc2VlZERlZmF1bHRFbnZpcm9ubWVudEZvclZhcmlhYmxlcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMgYW5kIHJhdyB2YWx1ZXMgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXNcbiAgICAgIC8vIE5PVEU6IFdlIGRvIE5PVCBpbmNsdWRlICdwYXJhbWV0ZXJPcHRpb25zJyBoZXJlIGJlY2F1c2UgaXQgY2hhbmdlcyBvbiBldmVyeSBzZWFyY2gsXG4gICAgICAvLyB3aGljaCB3b3VsZCByZXNldCB0aGUgdGVzdC1kYXRhIHR5cGUgZHJvcGRvd24uIEluc3RlYWQsIHBhcmFtZXRlck9wdGlvbnMgaW5pdGlhbGl6YXRpb25cbiAgICAgIC8vIGlzIGhhbmRsZWQgc2VwYXJhdGVseSBiZWxvdyB3aXRoIGEgZmlyc3RDaGFuZ2UgZ3VhcmQuXG4gICAgICBpZiAoKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YUVuZEluZGV4J10gfHwgY2hhbmdlc1snaXNJbnNpZGVGb3JMb29wU3RlcCddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHRlbXBsYXRlVmFyaWFibGVzIGNoYW5nZWQsIGluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9scyBmb3IgZWxlbWVudCB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIHdpdGggc2NyZWVuTmFtZUlkIGFzIHN0cmluZyAodG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCksIG9yICdub25lJyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiBpdCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSAmJiBjdXJyZW50VmFsdWUgIT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjcmVlbk5hbWVJZCBidXQgbm90IHNlbGVjdGVkU2NyZWVuTmFtZSwgZmluZCBpdCBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lICYmIHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBtYXRjaGluZ1NjcmVlbk5hbWUubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzY3JlZW5OYW1lT3B0aW9ucyBjaGFuZ2VkLCB1cGRhdGUgc2VsZWN0ZWRTY3JlZW5OYW1lIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkICYmICF2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1NjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWxlbWVudE9wdGlvbnMgb3Igc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHZhcmlhYmxlc1xuICAgICAgaWYgKChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHRvIGZvcmNlIHJlY29tcHV0YXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBlbGVtZW50cyBhcmUgbG9hZGVkIGFmdGVyIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiwgdGhlIGNvbmZpZyBpcyByZWNvbXB1dGVkXG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gZmluZCBhbmQgc2V0IGVsZW1lbnQgaWYgZWxlbWVudElkIGV4aXN0cyBpbiB0ZW1wbGF0ZSBkYXRhXG4gICAgICAgICAgICAgIC8vIElmIG5vIGVsZW1lbnRJZCwgZG9uJ3Qgc2VsZWN0IGFueXRoaW5nIC0gdXNlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YXJpYWJsZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLm5hbWUgPT09IHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogRmluZCBieSBsb2NhdG9yVmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmxvY2F0b3JWYWx1ZSA9PT0gZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBlbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIHNjcmVlbk5hbWVPYmoubmFtZTsgZmFsbCBiYWNrIHRvIHNjcmVlbk5hbWVPcHRpb25zIGxvb2t1cCB3aGVuIHNjcmVlbk5hbWVPYmpcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgYWJzZW50IChlLmcuIGVsZW1lbnRzIHJldHVybmVkIGJ5IGZpbmRBbGwoKSBtYXkgbGFjayB0aGUgbmVzdGVkIG9iamVjdCkuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2NyZWVuTmFtZU9iaj8ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gZWxlbWVudC5zY3JlZW5OYW1lT2JqLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNuT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBlbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25PcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gc25PcHRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbChzY3JlZW5OYW1lSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBmb3JtIGNvbnRyb2wgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSB2YWxpZCBzY3JlZW4gbmFtZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIHVzZXIncyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVTdHIgPSBjdXJyZW50VmFsdWUgIT0gbnVsbCA/IFN0cmluZyhjdXJyZW50VmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlU3RyICE9PSBzY3JlZW5OYW1lSWRTdHJpbmcgJiYgY3VycmVudFZhbHVlU3RyICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldC91cGRhdGUgZWxlbWVudCBkZXRhaWxzIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgZWxlbWVudE5hbWUgaWYgaXQgd2Fzbid0IGFscmVhZHkgc2V0IChwcmVzZXJ2ZSBmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gRm9yIHNlbGVjdG9yLCB1c2UgZWxlbWVudExvY2F0b3IgYXMgdmFsdWU7IGZvciBvdGhlcnMsIHVzZSBlbGVtZW50TmFtZVxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YXJpYWJsZS52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50Lm5hbWUgfHwgZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2woZWxlbWVudC5pZCkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5vdCBmb3VuZCBpbiBlbGVtZW50T3B0aW9ucyB5ZXQgLSBtaWdodCBuZWVkIHRvIGZldGNoXG4gICAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudElkIGJ1dCBlbGVtZW50IGlzbid0IGZvdW5kLCB3ZSBtaWdodCBuZWVkIHRvIGZldGNoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBrbm93IHRoZSBzY3JlZW4gbmFtZSB5ZXQsIHNvIHdlJ2xsIHdhaXQgZm9yIGVsZW1lbnRPcHRpb25zIHRvIGJlIGxvYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgLy8gQnV0IGRvbid0IG92ZXJyaWRlIHVzZXIncyBzY3JlZW4gbmFtZSBzZWxlY3Rpb24gaWYgdGhleSd2ZSBhbHJlYWR5IHNlbGVjdGVkIG9uZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZm9ybSBjb250cm9sIGhhcyBhIHZhbGlkIHNjcmVlbiBuYW1lIChub3QgJ25vbmUnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB0byBkZWZhdWx0IHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLy8gU2NyZWVuIG5hbWUgc2hvdWxkIGJlICdub25lJyAoU2VsZWN0IG9wdGlvbilcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKCdub25lJykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBJRCBzaG91bGQgYmUgbnVsbFxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGVudmlyb25tZW50IG9wdGlvbnMgY2hhbmdlZDogaW5pdGlhbGl6ZSBzYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQkVGT1JFIHByZWNvbXB1dGVDb25maWdzLlxuICAgICAgLy8gT3RoZXJ3aXNlIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnIHJ1bnMgd2l0aCBlbXB0eSBzZWxlY3RlZEVudmlyb25tZW50IGFuZCBjYWNoZXMgc3RhbGUgVUkgc3RhdGUuXG4gICAgICBpZiAoY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10pIHtcbiAgICAgICAgY29uc3QgbmVlZHNFbnZpcm9ubWVudEluaXQgPVxuICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlVGVzdERhdGFWYWx1ZSh2LnZhbHVlIHx8ICcnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzRW52VHlwZSA9XG4gICAgICAgICAgICAgIHYuZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcgfHxcbiAgICAgICAgICAgICAgdi5zZWxlY3RlZEVudmlyb25tZW50SWQgIT0gbnVsbCB8fFxuICAgICAgICAgICAgICBwYXJzZWQuZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gICAgICAgICAgICBpZiAoIWlzRW52VHlwZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodi5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IHBhcnNlZC5yYXdWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHJhdyAmJiBTdHJpbmcocmF3KS50cmltKCkpIHx8IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGw7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5lZWRzRW52aXJvbm1lbnRJbml0KSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X2VudlBhcmFtYCk7XG4gICAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLWNvbXB1dGUgYWxsIGNvbmZpZ3MgdG8gYXZvaWQgY2FsbGluZyBtZXRob2RzIGluIHRlbXBsYXRlXG4gICAgICAvLyBUaGlzIHdpbGwgcmVjb21wdXRlIGVsZW1lbnQgY29uZmlncyB3aXRoIHRoZSBuZXcgZWxlbWVudE9wdGlvbnNcbiAgICAgIC8vIE9ubHkgcHJlY29tcHV0ZSBpZiB0ZW1wbGF0ZVZhcmlhYmxlcyBleGlzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wcmVjb21wdXRlQ29uZmlncygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIGFmdGVyIHJlY29tcHV0aW5nIGNvbmZpZ3MgKG9ubHkgb25jZSBhdCB0aGUgZW5kKVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIC8vIFJlLXJ1biBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMgd2hlbmV2ZXIgcGFyYW1ldGVyT3B0aW9ucyBjaGFuZ2VzIGFuZCB0aGVyZSBhcmUgc3RpbGxcbiAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IG5lZWQgaW5pdGlhbGl6YXRpb24gKGhhdmUgcHJvZmlsZUlkIGJ1dCBtaXNzaW5nIHByb2ZpbGUgbmFtZSBvciBkYXRhU2V0KS5cbiAgICAgIC8vIFdlIGRvIE5PVCB1c2UgZmlyc3RDaGFuZ2UgaGVyZSBiZWNhdXNlIHRoZSBzYXZlZCBwcm9maWxlIG1heSBhcnJpdmUgaW4gYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgIC8vIChpZEA8cHJvZmlsZUlkPikgYWZ0ZXIgdGhlIGluaXRpYWwgcGFnaW5hdGVkIGxpc3QsIHNvIGZpcnN0Q2hhbmdlIHdvdWxkIG1pc3MgaXQuXG4gICAgICAvLyBUaGUgaW5uZXIgc29tZSgpIGd1YXJkIGVuc3VyZXMgd2Ugb25seSByZS1ydW4gd2hlbiB2YXJpYWJsZXMgYXJlIHN0aWxsIGluY29tcGxldGUsXG4gICAgICAvLyBwcmV2ZW50aW5nIHVubmVjZXNzYXJ5IHJlLXJ1bnMgb24gdXNlciBzZWFyY2ggdXBkYXRlcy5cbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddICYmXG4gICAgICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgIChcbiAgICAgICAgICAvLyBDaGVjayBpZiBhbnkgdmFyaWFibGUgaGFzIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgYnV0IGlzIG1pc3Npbmcgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgb3Igc2VsZWN0ZWREYXRhU2V0XG4gICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gbG9hZGluZyBhIHNhdmVkIHN0ZXAgLSBzZXRUZW1wbGF0ZVZhcmlhYmxlcyBzZXRzIHRoZSBJRCwgYnV0IHdlIG5lZWQgcGFyYW1ldGVyT3B0aW9ucyB0byBzZXQgdGhlIG5hbWUgYW5kIGRhdGEgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8uc29tZSh2ID0+XG4gICAgICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2KSAmJlxuICAgICAgICAgICAgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgICAgIHYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAoIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgIXYuc2VsZWN0ZWREYXRhU2V0KVxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2KSAmJiB2LmRhdGFUeXBlID09PSAncGFyYW1ldGVyJyAmJiAhdi5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAvLyBUaGUgZXh0cmEgdW5pbml0aWFsaXplZC12YXJpYWJsZSBjaGVjayBiZWxvdyBpcyBkZWJ1Zy1vbmx5OiBvbmx5IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgICAgLy8gdG8gYXZvaWQgZG91YmxlLWluaXRpYWxpc2luZyB2YXJpYWJsZXMgaW4gbm9uLWRlYnVnIHN0ZXAtYnVpbGRlciBmbG93cy5cbiAgICAgICAgICAodGhpcy5pc0RlYnVnICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiYgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiYgIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVcbiAgICAgICAgICApKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIEluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlc1wiLCBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10pO1xuICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBub3cgdGhhdCBwYXJhbWV0ZXJPcHRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgcGFyYW1ldGVyIG9wdGlvbnMgb3IgbG9hZGluZyBzdGF0ZSBjaGFuZ2VkLCByZWZyZXNoIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ3MgKHNvIHNlYXJjaC9sb2FkIG1vcmUgYW5kIG9wdGlvbnMgc3RheSBpbiBzeW5jKVxuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlUGFyYW1ldGVycyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1BhcmFtZXRlcnMnXSB8fFxuICAgICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcInBhcmFtZXRlck9wdGlvbnMgUmVmcmVzaFRlc3REYXRhVmFyaWFibGVzXCIsIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSk7XG4gICAgICAgIC8vIENsZWFyIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgY2FjaGUgc2luY2UgcHJvZmlsZXMgbGlzdCBvciBsb2FkaW5nIHN0YXRlIG1heSBoYXZlIGNoYW5nZWRcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1BhcmFtZXRlclR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUgZm9yIGNhY2hlIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHt2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGJhY2tmaWxsR2xvYmFsVmFyaWFibGVJZHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzIHx8ICF0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmdsb2JhbFZhcmlhYmxlT3B0aW9ucyB8fCBbXTtcbiAgICBpZiAoIW9wdHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGlmICh2YXJpYWJsZS5kYXRhVHlwZSAhPT0gJ2dsb2JhbCcpIHJldHVybjtcbiAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgIT0gbnVsbCkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9ICh2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlICYmIHZhcmlhYmxlLnNlbGVjdGVkR2xvYmFsVmFyaWFibGUudHJpbSgpKVxuICAgICAgICB8fCAodmFyaWFibGUucmF3VmFsdWUgPyBTdHJpbmcodmFyaWFibGUucmF3VmFsdWUpLnRyaW0oKSA6ICcnKTtcbiAgICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IG9wdHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSk7XG4gICAgICBpZiAobWF0Y2hlZCAmJiBtYXRjaGVkLmlkICE9IG51bGwgJiYgIWlzTmFOKE51bWJlcihtYXRjaGVkLmlkKSkpIHtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gTnVtYmVyKG1hdGNoZWQuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgLy8gUHJlc2VydmUgZXhpc3RpbmcgZGF0YVR5cGUgaWYgYWxyZWFkeSBzZXQgKGUuZy4sIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMgd2hlbiBsb2FkaW5nIHNhdmVkIHN0ZXApXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZTtcbiAgICAgICAgY29uc3QgeyBkYXRhVHlwZSwgcmF3VmFsdWUgfSA9IHRoaXMucGFyc2VUZXN0RGF0YVZhbHVlKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgLy8gQXV0by1zZWxlY3QgJ3BhcmFtZXRlcicgd2hlbiB0aGUgdGVzdCBjYXNlIGhhcyBhIGRlZmF1bHQgcHJvZmlsZSAodGVzdENhc2UudGVzdERhdGFJZCBvclxuICAgICAgICAvLyBGT1ItbG9vcC1kZXJpdmVkKSBhbmQgdGhlIHZhcmlhYmxlIGhhcyBubyBleGlzdGluZyB2YWx1ZS9kYXRhVHlwZS4gVGhpcyBrZWVwcyBFZGl0LW1vZGVcbiAgICAgICAgLy8gdXNlciBzZWxlY3Rpb25zIGludGFjdCAoZXhpc3RpbmdEYXRhVHlwZSBzZXQpIGFuZCBvbmx5IGtpY2tzIGluIGZvciBmcmVzaCBmaWVsZHMuXG4gICAgICAgIGNvbnN0IHNob3VsZERlZmF1bHRUb1BhcmFtZXRlciA9ICFleGlzdGluZ0RhdGFUeXBlICYmIGRhdGFUeXBlID09PSAncGxhaW4tdGV4dCcgJiYgKCF2YXJpYWJsZS52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJycpICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGw7XG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZXhpc3RpbmdEYXRhVHlwZSB8fCAoc2hvdWxkRGVmYXVsdFRvUGFyYW1ldGVyID8gJ3BhcmFtZXRlcicgOiBkYXRhVHlwZSk7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHR5cGUgaW4gdGhlIEZvcm1BcnJheVxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGU7IC8vIFVzZSB0aGUgZmluYWwgZGF0YVR5cGUgKGV4aXN0aW5nIG9yIHBhcnNlZClcbiAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChmaW5hbERhdGFUeXBlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZmluYWxEYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgcGFyYW1ldGVyIHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGlmIChmaW5hbERhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogVXNlIHNhdmVkIHRlc3QgZGF0YSBwcm9maWxlIElEIGZyb20gdGVzdFN0ZXAudGVzdERhdGFMaXN0IChzZXQgYnkgc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGV0IHByb2ZpbGVUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgbGV0IGRhdGFTZXRUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgY29uc3QgaGFzRGVmYXVsdFByb2ZpbGUgPSB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBoYXNTYXZlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVNaXNtYXRjaFdpdGhEZWZhdWx0ID1cbiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIGhhc1NhdmVkUHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIE51bWJlcih2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSAhPT0gTnVtYmVyKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcblxuICAgICAgICAgICAgICAvLyBXaGVuIGRlZmF1bHQgcHJvZmlsZSBpcyBkaWZmZXJlbnQgZnJvbSBzYXZlZCBwcm9maWxlLCBpZ25vcmUgc2F2ZWQgdGVtcGxhdGUtdmFyaWFibGUgc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBwcm9maWxlL3N0YXJ0LWVuZCBhbmQgY2xlYXIgcGFyYW1ldGVyIHZhbHVlIGJlY2F1c2UgcHJvZmlsZSBjb250ZXh0IGNoYW5nZWQuXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayBzYXZlZCBwcm9maWxlIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb2ZpbGUgb3ZlcnJpZGUuXG4gICAgICAgICAgICAgIGlmICghaGFzRGVmYXVsdFByb2ZpbGUgJiYgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4IGlzIHByb3ZpZGVkLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiBwcm9maWxlVG9Vc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGF0YSBzZXQgaGFzIHRoZSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgZm91bmQgYnkgcGFyYW1ldGVyIG5hbWUsIHVzZSBmaXJzdCBkYXRhIHNldCBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFTZXRUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IFVzZSBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHdoZW5ldmVyIHByb3ZpZGVkIChvdmVycmlkZSB0ZW1wbGF0ZS12YXJpYWJsZSBwcm9maWxlKS5cbiAgICAgICAgICAgICAgaWYgKCFwcm9maWxlVG9Vc2UgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgcHJvZmlsZVRvVXNlLmRhdGEgJiYgcHJvZmlsZVRvVXNlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHByb2ZpbGVUb1VzZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0VG9Vc2UgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhdXRvLXNlbGVjdCB0aGUgZGF0YSBzZXQgd2hlbiBleGFjdGx5IG9uZSBvcHRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIG11bHRpcGxlIGRhdGEgc2V0cyBhbmQgbm8gZXhwbGljaXQgc3RhcnQgaW5kZXgsIGxlYXZlIHRoZSBjaG9pY2UgdG8gdGhlIHVzZXIuXG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRUb1VzZSA9IHByb2ZpbGVUb1VzZS5kYXRhWzBdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkZWZhdWx0IHByb2ZpbGUgcmVzb2x2ZWQgYnV0IG5vIGRhdGEgc2V0IHdhcyBhdXRvLXBpY2tlZCAobXVsdGktZGF0YXNldCBjYXNlKSxcbiAgICAgICAgICAgICAgLy8gc3RpbGwgc2VsZWN0IHRoZSBwcm9maWxlIHNvIHRoZSB1c2VyIG9ubHkgbmVlZHMgdG8gcGljayB0aGUgZGF0YSBzZXQuXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgIWRhdGFTZXRUb1VzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gcHJvZmlsZVRvVXNlLm5hbWUgfHwgcHJvZmlsZVRvVXNlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBwcm9maWxlVG9Vc2UuaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5zZXQodmFyaWFibGUubmFtZSwgcHJvZmlsZVRvVXNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcocHJvZmlsZVRvVXNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwcm9maWxlIGFuZCBkYXRhIHNldCwgc2V0IHRoZSB2YXJpYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgZGF0YVNldFRvVXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBwcm9maWxlVG9Vc2UubmFtZSB8fCBwcm9maWxlVG9Vc2UudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGF0YVNldFRvVXNlLm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IHZhcmlhYmxlIHByb3BlcnRpZXMgLSB0aGlzIGVuc3VyZXMgaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUoKSBhbmQgaGFzU2VsZWN0ZWREYXRhU2V0KCkgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBwcm9maWxlVG9Vc2UuaWQ7XG4gICAgICAgICAgICAgICAgLy8gU25hcHNob3QgcHJvZmlsZSBzbyBpdCBzdXJ2aXZlcyBpZiBhbm90aGVyIHZhcmlhYmxlIHRyaWdnZXJzIGEgc2VhcmNoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlclByb2ZpbGVTbmFwc2hvdC5zZXQodmFyaWFibGUubmFtZSwgcHJvZmlsZVRvVXNlKTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luc2lkZUZvckxvb3BTdGVwKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhRW5kSW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGFTZXQgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gZW5kRGF0YVNldD8ubmFtZSB8fCBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCAoc3RyaW5nKSBmb3Igc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgZm9ybSBjb250cm9sIHRvIG1hdGNoIG9wdGlvbi5pZCBmb3JtYXRcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcocHJvZmlsZVRvVXNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXRTdGFydCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCB8fCBkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldEVuZCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kIHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNldCBwYXJhbWV0ZXIgdmFsdWUgaWYgd2UgZm91bmQgaXQgaW4gdGhlIGRhdGEgc2V0LCBvdGhlcndpc2UgY2xlYXIgaXQgZm9yIHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCB0aGUgcGFyYW1ldGVyIGluIGEgZGF0YSBzZXQsIHNldCBpdDsgb3RoZXJ3aXNlIGNsZWFyIGZvciB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHJhd1ZhbHVlICYmIGRhdGFTZXRUb1VzZSAmJiBkYXRhU2V0VG9Vc2UuZGF0YSAmJiBkYXRhU2V0VG9Vc2UuZGF0YS5oYXNPd25Qcm9wZXJ0eShyYXdWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YXJpYWJsZS52YWx1ZSAvLyBVc2UgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgQHx0NjY2NjY2fClcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShwYXJhbVZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIGNvbmZpZ3Mgd2l0aCBuZXcgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgdmFyaWFibGUgdG8gZW5zdXJlIGZyZXNoIGNvbmZpZ3NcbiAgICAgICAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBjYWNoZSAtIG5lZWQgdG8gY2xlYXIgYWxsIHBvc3NpYmxlIGtleXMgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3QgZm9ybWF0XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogSWYgbm8gZGVmYXVsdCBwcm9maWxlIG92ZXJyaWRlIGFuZCBubyBzYXZlZCBwcm9maWxlIGZvdW5kLCBzZWFyY2ggYnkgcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgPT0gbnVsbCAmJiAhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAvLyBObyBkZWZhdWx0IHZhbHVlcyAtIHVzZSBleGlzdGluZyBsb2dpYyB0byBmaW5kIGZyb20gcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJhd1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhpcyBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgdGVzdCBkYXRhIHByb2ZpbGVzIGFuZCB0aGVpciBkYXRhIHNldHNcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRQcm9maWxlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZERhdGFTZXQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0RGF0YVByb2ZpbGUgb2YgdGhpcy5wYXJhbWV0ZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGVzdERhdGFQcm9maWxlLmRhdGEgJiYgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgZGF0YSBzZXRzIGluIHRoaXMgcHJvZmlsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFTZXQgb2YgdGVzdERhdGFQcm9maWxlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNldCAmJiBkYXRhU2V0LmRhdGEgJiYgZGF0YVNldC5kYXRhLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGF0YVNldCA9IGRhdGFTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUgJiYgZm91bmREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGZvdW5kUHJvZmlsZS5uYW1lIHx8IGZvdW5kUHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGZvdW5kRGF0YVNldC5uYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGZvdW5kUHJvZmlsZS5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKGZvdW5kUHJvZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBwYXJhbSBuYW1lIChmb3IgZHJvcGRvd24gZGlzcGxheSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1OYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseSBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHBhcmFtTmFtZSwgJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgbm90IGZvdW5kLCBmb3JtYXQgdGhlIHJhdyB2YWx1ZSBpZiBpdCdzIGEgcGFyYW1ldGVyIHR5cGVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZ2xvYmFsIHR5cGUsIHJlaHlkcmF0ZSBzZWxlY3RlZEdsb2JhbFZhcmlhYmxlICsgc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkIGZyb21cbiAgICAgICAgICAvLyB0aGUgcGFyc2VkIGB7e25hbWV9fWAgdmFsdWUgYnkgbG9va2luZyB0aGUgb3B0aW9uIHVwIGluIGdsb2JhbFZhcmlhYmxlT3B0aW9ucy5cbiAgICAgICAgICBpZiAoZmluYWxEYXRhVHlwZSA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbE5hbWUgPSAodmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZSAmJiB2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlLnRyaW0oKSlcbiAgICAgICAgICAgICAgfHwgKHJhd1ZhbHVlID8gU3RyaW5nKHJhd1ZhbHVlKS50cmltKCkgOiAnJyk7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsTmFtZSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlID0gZ2xvYmFsTmFtZTtcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEdsb2JhbFZhcmlhYmxlJywgbmV3IEZvcm1Db250cm9sKGdsb2JhbE5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZScpPy5zZXRWYWx1ZShnbG9iYWxOYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCA9PSBudWxsICYmICh0aGlzLmdsb2JhbFZhcmlhYmxlT3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSAodGhpcy5nbG9iYWxWYXJpYWJsZU9wdGlvbnMgfHwgW10pLmZpbmQoZyA9PiBnLm5hbWUgPT09IGdsb2JhbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkICYmIG1hdGNoZWQuaWQgIT0gbnVsbCAmJiAhaXNOYU4oTnVtYmVyKG1hdGNoZWQuaWQpKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gTnVtYmVyKG1hdGNoZWQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYHt7JHtnbG9iYWxOYW1lfX19YCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKGdsb2JhbE5hbWUsICdnbG9iYWwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgdXNlIGZpbmFsRGF0YVR5cGUgKGZyb20gdGVzdERhdGFMaXN0KSDigJQgdmFsdWUgbWF5IG5vdCBwYXJzZSBhcyAqfC4uLnwgeWV0LlxuICAgICAgICAgIGlmIChmaW5hbERhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRFbnYgPSB0aGlzLnBhcnNlVGVzdERhdGFWYWx1ZSh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICBsZXQgcGFyYW1OYW1lID0gcGFyc2VkRW52LnJhd1ZhbHVlID8gU3RyaW5nKHBhcnNlZEVudi5yYXdWYWx1ZSkudHJpbSgpIDogJyc7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFwYXJhbU5hbWUgJiZcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGBlbnYtJHt2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWR9LWA7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maWx0ZXIoZW52ID0+IGVudi5pZC5pbmRleE9mKHByZWZpeCkgPT09IDApO1xuICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBTdHJpbmcoY2FuZGlkYXRlc1swXS5uYW1lIHx8ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNhdmVkIGVudmlyb25tZW50SWQsIHVzZSBpdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKGVudi17aWR9LXtwYXJhbX0pXG4gICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNlbGVjdGluZyB0aGUgd3JvbmcgZW52aXJvbm1lbnQgd2hlbiBtdWx0aXBsZSBlbnZpcm9ubWVudHMgc2hhcmUgcGFyYW0gbmFtZXMuXG4gICAgICAgICAgICAgIGxldCBlbnZPcHRpb246IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YWN0SWQgPSBgZW52LSR7dmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkfS0ke3BhcmFtTmFtZX1gO1xuICAgICAgICAgICAgICAgIGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5pZCA9PT0gZXhhY3RJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IHBhcmFtIG5hbWUgb25seSAobGVnYWN5IC8gZmlyc3QtdGltZSBzYXZlKVxuICAgICAgICAgICAgICBpZiAoIWVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5uYW1lID09PSBwYXJhbU5hbWUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSBlbnZPcHRpb24uZW52aXJvbm1lbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRCBmcm9tIHRoZSBvcHRpb24gaWRcbiAgICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZW52T3B0aW9uLmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGVudk9wdGlvbi5lbnZpcm9ubWVudCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZShlbnZPcHRpb24uZW52aXJvbm1lbnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYCp8JHtwYXJhbU5hbWV9fGAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RlcCBtYXkgb25seSBoYXZlIGVudmlyb25tZW50SWQgKG9yIHZhbHVlIGVtcHR5KSB3aGlsZSB0aGUgZW52IGhhcyBtdWx0aXBsZSBwYXJhbWV0ZXJzOlxuICAgICAgICAgICAgLy8gc3RpbGwgYmluZCBFbnZpcm9ubWVudCBOYW1lIGZyb20gc2F2ZWQgaWQgc28gdGhlIGZpcnN0IGRyb3Bkb3duIHByZWxvYWRzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCAmJlxuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYGVudi0ke3ZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZH0tYDtcbiAgICAgICAgICAgICAgY29uc3QgZm9yRW52ID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmlsdGVyKGVudiA9PiBlbnYuaWQuaW5kZXhPZihwcmVmaXgpID09PSAwKTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBmb3JFbnYubGVuZ3RoID8gZm9yRW52WzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gZmlyc3QuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGZpcnN0LmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woZmlyc3QuZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZmlyc3QuZW52aXJvbm1lbnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUgJiYgZm9yRW52Lmxlbmd0aCA9PT0gMSAmJiBmaXJzdC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGFyYW0gPSBTdHJpbmcoZmlyc3QubmFtZSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKG9ubHlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYCp8JHtvbmx5UGFyYW19fGAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShvbmx5UGFyYW0sICdlbnZpcm9ubWVudCcpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZWxlbWVudCB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCBzY3JlZW4gbmFtZSBhbmQgZWxlbWVudFxuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyeSB0byBmaW5kIGFuZCBzZXQgZWxlbWVudCBpZiBlbGVtZW50SWQgZXhpc3RzIGluIHRlbXBsYXRlIGRhdGFcbiAgICAgICAgICAgIC8vIElmIG5vIGVsZW1lbnRJZCwgZG9uJ3Qgc2VsZWN0IGFueXRoaW5nIC0gdXNlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudElkKSB7XG4gICAgICAgICAgICAgIGxldCBlbGVtZW50OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogRmluZCBieSBlbGVtZW50SWQgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwuaWQgPT09IHZhcmlhYmxlLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAyOiBGaW5kIGJ5IGVsZW1lbnROYW1lIGlmIGVsZW1lbnRJZCBzZWFyY2ggZGlkbid0IGZpbmQgaXQgKGZhbGxiYWNrKVxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLm5hbWUgPT09IHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogRmluZCBieSBsb2NhdG9yVmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmxvY2F0b3JWYWx1ZSA9PT0gZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIG5hbWUgaW5mbyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBlbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBzY3JlZW5OYW1lT2JqLm5hbWU7IGZhbGwgYmFjayB0byBzY3JlZW5OYW1lT3B0aW9ucyBsb29rdXAgd2hlbiBzY3JlZW5OYW1lT2JqXG4gICAgICAgICAgICAgICAgICAvLyBpcyBhYnNlbnQgKGUuZy4gZWxlbWVudHMgcmV0dXJuZWQgYnkgZmluZEFsbCgpIG1heSBsYWNrIHRoZSBuZXN0ZWQgb2JqZWN0KS5cbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVPYmo/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbk9wdGlvbiA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gZWxlbWVudC5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChzbk9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gc25PcHRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZFN0cmluZyA9IFN0cmluZyhlbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbChzY3JlZW5OYW1lSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGZvcm0gY29udHJvbCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIHZhbGlkIHNjcmVlbiBuYW1lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIHVzZXIncyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlU3RyICE9PSBzY3JlZW5OYW1lSWRTdHJpbmcgJiYgY3VycmVudFZhbHVlU3RyICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKHNjcmVlbk5hbWVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldC91cGRhdGUgZWxlbWVudCBkZXRhaWxzIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgZWxlbWVudE5hbWUgaWYgaXQgd2Fzbid0IGFscmVhZHkgc2V0IChwcmVzZXJ2ZSBmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBGb3Igc2VsZWN0b3IsIHVzZSBlbGVtZW50TG9jYXRvciBhcyB2YWx1ZTsgZm9yIG90aGVycywgdXNlIGVsZW1lbnROYW1lXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50Lm5hbWUgfHwgZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChlbGVtZW50LmlkKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShlbGVtZW50LmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5vdCBmb3VuZCBpbiBlbGVtZW50T3B0aW9ucyB5ZXQgLSBtaWdodCBuZWVkIHRvIGZldGNoXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBlbGVtZW50SWQgYW5kIGVsZW1lbnROYW1lIGlmIHRoZXkgZXhpc3QgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50SWQgYnV0IGVsZW1lbnQgaXNuJ3QgZm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZmV0Y2ggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBrbm93IHRoZSBzY3JlZW4gbmFtZSB5ZXQsIHNvIHdlJ2xsIHdhaXQgZm9yIGVsZW1lbnRPcHRpb25zIHRvIGJlIGxvYWRlZFxuICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBhZ2FpbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdmlhIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vIGVsZW1lbnRJZCBpbiB0ZW1wbGF0ZSBkYXRhIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmaWVsZHMgYW5kIHNldCBkZWZhdWx0c1xuICAgICAgICAgICAgICAvLyBCdXQgZG9uJ3Qgb3ZlcnJpZGUgdXNlcidzIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiBpZiB0aGV5J3ZlIGFscmVhZHkgc2VsZWN0ZWQgb25lXG4gICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gT25seSBjbGVhciBzY3JlZW5OYW1lSWQgaWYgaXQgd2Fzbid0IHNldCBieSB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmb3JtIGNvbnRyb2wgaGFzIGEgdmFsaWQgc2NyZWVuIG5hbWUgKG5vdCAnbm9uZScpXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gJ25vbmUnIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIG5hbWUgc2hvdWxkIGJlICdub25lJyAoU2VsZWN0IG9wdGlvbilcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woJ25vbmUnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBFbGVtZW50IElEIHNob3VsZCBiZSBudWxsXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKG51bGwpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gZW5zdXJlIFVJIHVwZGF0ZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgZnJvbSBGb3JtQXJyYXkgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBhdCBhIHNwZWNpZmljIGluZGV4IGZyb20gRm9ybUFycmF5IChmb3IgdGVtcGxhdGUgdXNlKSAqL1xuICBnZXRGb3JtR3JvdXBBdChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICBwcml2YXRlIHByZWNvbXB1dGVDb25maWdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIGFsbCBzZWxlY3QgY29uZmlnc1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAvLyBQcmUtY29tcHV0ZSByZWd1bGFyIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3MgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWcgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGlmIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBpZiBlbnZpcm9ubWVudCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCB2YXJpYWJsZSBjb25maWdzIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCBjb25maWcgaWYgc2NyZWVuIG5hbWUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZVRlc3REYXRhVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB8ICdnbG9iYWwnLCByYXdWYWx1ZTogc3RyaW5nIH0ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6ICcnIH07XG4gICAgfVxuICAgIC8vIEdsb2JhbCBEYXRhOiBge3tuYW1lfX1gIChuZXcgZm9ybWF0IOKAlCBubyBsZWFkaW5nIGAkYCkuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3t7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ319JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAnZ2xvYmFsJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0yKSB9O1xuICAgIH1cbiAgICAvLyBQYXJhbWV0ZXI6IEB8bmFtZXxcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BhcmFtZXRlcicsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gUnVudGltZTogJHxuYW1lfFxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncnVudGltZScsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gRW52aXJvbm1lbnQ6ICp8bmFtZXxcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BsYWluLXRleHQnLCByYXdWYWx1ZTogdmFsdWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZTogc3RyaW5nLCBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnIHwgJ2dsb2JhbCcpOiBzdHJpbmcge1xuICAgIGlmICghcmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSAncGFyYW1ldGVyJzpcbiAgICAgICAgcmV0dXJuIGBAfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdydW50aW1lJzpcbiAgICAgICAgcmV0dXJuIGAkfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdlbnZpcm9ubWVudCc6XG4gICAgICAgIHJldHVybiBgKnwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAnZ2xvYmFsJzpcbiAgICAgICAgcmV0dXJuIGB7eyR7cmF3VmFsdWV9fX1gO1xuICAgICAgY2FzZSAncGxhaW4tdGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBhbnkge1xuICAgIHJldHVybiB2YXJpYWJsZS5uYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMsIGluY2x1ZGUgZWxlbWVudE9wdGlvbnMgKyBoYXNNb3JlRWxlbWVudHMgaW4gY2FjaGUga2V5LlxuICAgIC8vIEludGVudGlvbmFsbHkgZXhjbHVkZSBpc0xvYWRpbmdFbGVtZW50cyBzbyBzZWFyY2ggaW5wdXQgaW5zdGFuY2Ugc3RheXMgc3RhYmxlIHdoaWxlIHR5cGluZy5cbiAgICAvLyBGb3IgdXBsb2FkIHZhcmlhYmxlcywgaW5jbHVkZSB1cGxvYWRPcHRpb25zLCBoYXNNb3JlVXBsb2FkcywgYW5kIGlzTG9hZGluZ1VwbG9hZHMgaW4gY2FjaGUga2V5XG4gICAgLy8gT3B0aW1pemUgY2FjaGUga2V5IGNvbXB1dGF0aW9uIC0gdXNlIGxlbmd0aCBpbnN0ZWFkIG9mIGZ1bGwgYXJyYXkgam9pbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgY29uc3QgaXNFbGVtZW50VmFyaWFibGUgPSB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJztcbiAgICBjb25zdCBpc1VwbG9hZFZhcmlhYmxlID0gdmFyaWFibGUubmFtZSA9PT0gJ3VwbG9hZCcgJiYgdmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJztcbiAgICBcbiAgICBjb25zdCBvcHRpb25zS2V5ID0gaXNFbGVtZW50VmFyaWFibGVcbiAgICAgID8gYCR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5tYXAoZWwgPT4gZWwuaWQgfHwgJycpLmpvaW4oJywnKX1gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dGhpcy51cGxvYWRPcHRpb25zLmxlbmd0aH1fJHt0aGlzLnVwbG9hZE9wdGlvbnMubWFwKCh1cDogYW55KSA9PiB1cC5pZCB8fCB1cC5uYW1lIHx8ICcnKS5qb2luKCcsJyl9YFxuICAgICAgOiBgJHt2YXJpYWJsZS5vcHRpb25zPy5sZW5ndGggfHwgMH1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBcbiAgICAvLyBJbmNsdWRlIGhhc01vcmUgYW5kIGlzTG9hZGluZyBpbiBjYWNoZSBrZXkgZm9yIGVsZW1lbnQgYW5kIHVwbG9hZCB2YXJpYWJsZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGlzRWxlbWVudFZhcmlhYmxlXG4gICAgICA/IGAke3ZhcmlhYmxlLm5hbWV9XyR7b3B0aW9uc0tleX1fJHt0aGlzLmhhc01vcmVFbGVtZW50c31gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZVVwbG9hZHN9XyR7dGhpcy5pc0xvYWRpbmdVcGxvYWRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGZvciBlbGVtZW50IHZhcmlhYmxlcywgdXBsb2FkT3B0aW9ucyBmb3IgdXBsb2FkIHZhcmlhYmxlcywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAoaXNFbGVtZW50VmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBvcHRpb25zQXJyYXkgPSB0aGlzLmVsZW1lbnRPcHRpb25zXG4gICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGxvY2F0b3JWYWx1ZSwgLy8gVXNlIGxvY2F0b3JWYWx1ZSBhcyBpZCBzbyBpdCBnZXRzIHJldHVybmVkIGFzIHRoZSB2YWx1ZVxuICAgICAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiBsb2NhdG9yVmFsdWUsIC8vIEFsc28gc2V0IHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgbmFtZTogYCR7ZWwubmFtZX0gKCR7ZWwuc2NyZWVuTmFtZU9iaj8ubmFtZSB8fCAnJ30pYCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICAgICAgb3RoZXJMb2NhdG9yOiBlbC5vdGhlckxvY2F0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVXBsb2FkVmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciB1cGxvYWQgb3B0aW9ucywgbWFwIHVwbG9hZCBvYmplY3RzIHRvIFNlbGVjdE9wdGlvbiBmb3JtYXRcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMudXBsb2FkT3B0aW9ucy5tYXAoKHVwbG9hZDogYW55KSA9PiB7XG4gICAgICAgIC8vIEFzc3VtaW5nIHVwbG9hZCBoYXMgaWQsIG5hbWUsIG9yIHNpbWlsYXIgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB1cGxvYWRJZCA9IHVwbG9hZC5pZD8udG9TdHJpbmcoKSB8fCB1cGxvYWQubmFtZSB8fCAnJztcbiAgICAgICAgY29uc3QgdXBsb2FkTmFtZSA9IHVwbG9hZC5uYW1lIHx8IHVwbG9hZC5maWxlTmFtZSB8fCB1cGxvYWRJZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdXBsb2FkSWQsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkLFxuICAgICAgICAgIG5hbWU6IHVwbG9hZE5hbWUsXG4gICAgICAgICAgbGFiZWw6IHVwbG9hZE5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQudmFsdWUsIHZhbHVlOiBvcHQudmFsdWUsIG5hbWU6IG9wdC5sYWJlbCwgbGFiZWw6IG9wdC5sYWJlbH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIGVsZW1lbnQgdmFyaWFibGVzXG4gICAgaWYgKGlzRWxlbWVudFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIGRyb3Bkb3duXG4gICAgICBjb25maWcuc2VydmVyU2VhcmNoID0gdHJ1ZTsgLy8gRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaFxuICAgICAgY29uZmlnLmhhc01vcmUgPSB0aGlzLmhhc01vcmVFbGVtZW50cztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ0VsZW1lbnRzO1xuICAgICAgY29uZmlnLm9uTG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVFbGVtZW50cy5lbWl0KCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uU2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRW1pdCBzZWFyY2ggZXZlbnQgd2hlbiB1c2VyIHR5cGVzIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbG9hZCBtb3JlIGFuZCBzZWFyY2ggc3VwcG9ydCBmb3IgdXBsb2FkIHZhcmlhYmxlc1xuICAgIGlmIChpc1VwbG9hZFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHVwbG9hZCBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlVXBsb2FkcztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ1VwbG9hZHM7XG4gICAgICBjb25maWcub25Mb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVVwbG9hZHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaFVwbG9hZHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRlc3QtZGF0YSB2YXJpYWJsZSwgcGFyc2UgYW5kIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGRhdGEgdHlwZVxuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgIGNvbnN0IHsgZGF0YVR5cGU6IHBhcnNlZERhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgY29uc3QgY3VycmVudERhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgPVxuICAgICAgICAodmFyaWFibGUuZGF0YVR5cGUgYXMgYW55KSB8fCAncGxhaW4tdGV4dCc7XG5cbiAgICAgIC8vIENSSVRJQ0FMOiBXaGVuIHVzZXIgaXMgaW4gJ3BhcmFtZXRlcicgbW9kZSBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkgKGUuZy4sIHdoZW5cbiAgICAgIC8vIHNlbGVjdGluZy9jaGFuZ2luZyB0ZXN0LWRhdGEgcHJvZmlsZSwgd2hpY2ggY2xlYXJzIHRoZSB2YWx1ZSB0ZW1wb3JhcmlseSksIHdlIG11c3RcbiAgICAgIC8vIE5PVCBjaGFuZ2UgdGhlIGRhdGFUeXBlIGJhY2sgdG8gJ3BsYWluLXRleHQnLiBLZWVwIGl0IGFzICdwYXJhbWV0ZXInLlxuICAgICAgLy8gT25seSBjaGFuZ2UgZGF0YVR5cGUgaWY6XG4gICAgICAvLyAxLiBUaGUgcGFyc2VkIHR5cGUgbWF0Y2hlcyBjdXJyZW50IHR5cGUgKG5vIGNoYW5nZSBuZWVkZWQpLCBPUlxuICAgICAgLy8gMi4gVGhlIHZhbHVlIGlzIG5vdCBlbXB0eSAodXNlciBpcyBhY3R1YWxseSB0eXBpbmcvc2VsZWN0aW5nIGEgdmFsdWUpLCBPUlxuICAgICAgLy8gMy4gV2UncmUgc3dpdGNoaW5nIEZST00gcGxhaW4tdGV4dCBUTyBwYXJhbWV0ZXIgKGFsbG93IHRoaXMgdHJhbnNpdGlvbilcbiAgICAgIGxldCBmaW5hbERhdGFUeXBlID0gcGFyc2VkRGF0YVR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnREYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgcGFyc2VkRGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSlcbiAgICAgICkge1xuICAgICAgICAvLyBLZWVwIGFzIHBhcmFtZXRlciAtIGRvbid0IGNoYW5nZSB0byBwbGFpbi10ZXh0XG4gICAgICAgIGZpbmFsRGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH1cblxuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlO1xuICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGRhdGEgdHlwZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJyk/LnNldFZhbHVlKGZpbmFsRGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgfVxuICBcbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gTm90ZTogSWYgdmFyaWFibGUgZG9lc24ndCBleGlzdCBpbiBGb3JtQXJyYXksIGl0IHNob3VsZCBiZSBhZGRlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZUJvb2xlYW5DaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBUeXBlLW92ZXJyaWRlIHNob3J0LWNpcmN1aXQgKG1pcnJvcnMgbmVlZHNEYXRhVHlwZURyb3Bkb3duKTogbmV2ZXIgc2hvd1xuICAgIC8vIHRoZSBnZW5lcmljIGRyb3Bkb3duIGZvciBBSSBBc2sgLyBBSSBWZXJpZnkncyB0ZXh0YXJlYSBvciBlbnYtbmFtZSBmaWVsZHMuXG4gICAgaWYgKHZhcmlhYmxlPy50eXBlID09PSAndGV4dGFyZWEnIHx8IHZhcmlhYmxlPy50eXBlID09PSAnZW52aXJvbm1lbnQtbmFtZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgLy8gRm9yIGVsZW1lbnQgdmFyaWFibGVzIChkYXRhS2V5ID09PSAnZWxlbWVudCcpLCB3ZSB1c2UgY2FzY2FkaW5nIGRyb3Bkb3ducyAoc2NyZWVuIG5hbWUgKyBlbGVtZW50KVxuICAgIC8vIFNvIHJldHVybiBmYWxzZSB0byB1c2UgdGhlIGNhc2NhZGluZyBkcm9wZG93biBwYXR0ZXJuXG4gICAgY29uc3QgcmVzdWx0ID0gdmFyaWFibGUubmFtZSA9PT0gJ3R5cGUnIHx8IHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJztcbiAgICB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLnNldCh2YXJpYWJsZS5uYW1lLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgXG4gIG5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIFR5cGUtb3ZlcnJpZGUgc2hvcnQtY2lyY3VpdDogQUkgQXNrIC8gQUkgVmVyaWZ5IG1hcmsgYHF1ZXJ5YCBhc1xuICAgIC8vICd0ZXh0YXJlYScgYW5kIGluamVjdCBhbiAnZW52aXJvbm1lbnQtbmFtZScgdmFyaWFibGUuIE5laXRoZXIgc2hvdWxkXG4gICAgLy8gc3VyZmFjZSB0aGUgZGF0YS10eXBlIGRyb3Bkb3duLlxuICAgIGlmICh2YXJpYWJsZT8udHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB2YXJpYWJsZT8udHlwZSA9PT0gJ2Vudmlyb25tZW50LW5hbWUnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBjYWxjdWxhdGlvbnNcbiAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFLZXkgPSB2YXJpYWJsZS5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnO1xuICAgIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHRoZSBzeW50aGV0aWMgQUkgQXNrIC8gQUkgVmVyaWZ5IGVudmlyb25tZW50IGRyb3Bkb3duLiAqL1xuICBpc0Vudmlyb25tZW50TmFtZVR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFyaWFibGU/LnR5cGUgPT09ICdlbnZpcm9ubWVudC1uYW1lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGR5bmFtaWMtc2VsZWN0IGNvbmZpZyBmb3IgdGhlIHN5bnRoZXRpYyBBSSBBc2sgLyBBSSBWZXJpZnlcbiAgICogZW52aXJvbm1lbnQgZHJvcGRvd24uIFByZXBlbmRzIGEgc2VudGluZWwgXCJOb25lXCIgZW50cnkgKGVtcHR5IHZhbHVlKSBzb1xuICAgKiB0aGUgdXNlciBjYW4gZXhwbGljaXRseSBjbGVhciB0aGUgY2hvaWNlIOKAlCB0aGUgZW1wdHkgdmFsdWUgcm91bmQtdHJpcHNcbiAgICogdGhyb3VnaCBvblZhcmlhYmxlVmFsdWVDaGFuZ2Ug4oaSIHNldFZhbHVlKCcnKSDihpIgYmFja2VuZCByZWFkc1xuICAgKiBgZXZlbnQuZW52aXJvbm1lbnRgIGFzICcnIGFuZCB0cmVhdHMgaXQgYXMgbm8gZW52aXJvbm1lbnQgY29udGV4dC5cbiAgICpcbiAgICogRGVkdXBsaWNhdGVzIGJ5IGVudmlyb25tZW50IG5hbWUgdG8gbWlycm9yIGdldFVuaXF1ZUVudmlyb25tZW50cygpIHVzZWRcbiAgICogYnkgdGhlIGV4aXN0aW5nIHRlc3QtZGF0YSBlbnZpcm9ubWVudCBzZWxlY3Rvci5cbiAgICovXG4gIGdldEVudmlyb25tZW50TmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZpcm9ubWVudE5hbWVgO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZW52aXJvbm1lbnROYW1lU2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIGBlbnZpcm9ubWVudE9wdGlvbnNgIGlzIGEgZmxhdCBsaXN0IG9mIChlbnZpcm9ubWVudCDDlyBwYXJhbWV0ZXIpIHR1cGxlc1xuICAgIC8vIHNoYXBlZCB7IGlkLCBuYW1lLCB2YWx1ZSwgZW52aXJvbm1lbnQgfS4gV2Ugd2FudCBvbmUgZW50cnkgcGVyIHVuaXF1ZVxuICAgIC8vIGVudmlyb25tZW50LCBtaXJyb3JpbmcgZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCkgdXNlZCBieSB0aGUgZXhpc3RpbmdcbiAgICAvLyBlbnZpcm9ubWVudCBzZWxlY3Rvci4gVXNpbmcgYGVudi5uYW1lYCBoZXJlIHdvdWxkIHN1cmZhY2UgcGFyYW1ldGVyXG4gICAgLy8gbmFtZXMgaW5zdGVhZCBvZiBlbnZpcm9ubWVudCBuYW1lcyDigJQgdGhhdCB3YXMgdGhlIHByZXZpb3VzIGJ1Zy5cbiAgICAvLyBTZW50aW5lbCBmb3IgdGhlIFwiTm9uZVwiIG9wdGlvbi4gVXNpbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBgaWRgIEFORFxuICAgIC8vIGB2YWx1ZWAgbWF0dGVyczogY3FhLWR5bmFtaWMtc2VsZWN0IHdyaXRlcyB0aGUgb3B0aW9uJ3MgYGlkYCB0byB0aGVcbiAgICAvLyBib3VuZCBmb3JtIGNvbnRyb2wsIHNvIGEgbWlzbWF0Y2hlZCBgdmFsdWU6ICcnYCB3b3VsZCBuZXZlciByb3VuZC10cmlwXG4gICAgLy8g4oCUIHBpY2tpbmcgTm9uZSB3b3VsZCBzdG9yZSB0aGUgbGl0ZXJhbCAnX19ub25lX18nIGluIHRoZSBmb3JtLCB0aGVcbiAgICAvLyBkcm9wZG93bidzIHByZS1zZWxlY3Qgd291bGQgbmV2ZXIgbWF0Y2gsIGFuZCBvbkNoYW5nZSB3b3VsZG4ndCBzZWUgYVxuICAgIC8vIHRydWx5IFwiY2xlYXJlZFwiIHNpZ25hbC4gS2VlcGluZyB0aGVtIGFsaWduZWQgYXZvaWRzIHRoYXQgd2hvbGUgY2xhc3MuXG4gICAgY29uc3QgTk9ORV9TRU5USU5FTCA9ICdfX25vbmVfXyc7XG5cbiAgICAvLyBlbnYtb24tdGVzdC1jYXNlIGxvY2s6IHdoZW4gdGhlIHRlc3QgY2FzZSBiaW5kcyBhbiBlbnYgKFRpZXIgMSkgb3JcbiAgICAvLyB0aGUgcGFyZW50IGZvcmNlZCBhIHdvcmtzcGFjZS1kZWZhdWx0IGZhbGxiYWNrIChUaWVyIDMsIHN1ZmZpeCBzZXQpLFxuICAgIC8vIHRoZSBkcm9wZG93biBtdXN0IGJlIGRpc2FibGVkLiBUaWVyIDIgKGxlZ2FjeSBzdGVwIGVudikgbGVhdmVzIGJvdGhcbiAgICAvLyB1bnNldCDihpIgZHJvcGRvd24gc3RheXMgZWRpdGFibGUgc28gdGhlIHVzZXIgY2FuIHBpY2sgLyBjbGVhci5cbiAgICBjb25zdCBsYWJlbFN1ZmZpeCA9ICh0aGlzLnRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeCA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxvY2tUb1Rlc3RDYXNlRW52ID0gISEodGhpcy50ZXN0Q2FzZUVudmlyb25tZW50TmFtZSA/PyAnJykudHJpbSgpIHx8ICEhbGFiZWxTdWZmaXg7XG5cbiAgICBjb25zdCB1bmlxdWVFbnZpcm9ubWVudHMgPSB0aGlzLmdldFVuaXF1ZUVudmlyb25tZW50cygpO1xuICAgIGNvbnN0IGVudk9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdW5pcXVlRW52aXJvbm1lbnRzLm1hcChlbnYgPT4gKHtcbiAgICAgIGlkOiBlbnYuaWQsXG4gICAgICB2YWx1ZTogZW52Lm5hbWUsXG4gICAgICBuYW1lOiBsYWJlbFN1ZmZpeCA/IGAke2Vudi5uYW1lfSAke2xhYmVsU3VmZml4fWAgOiBlbnYubmFtZSxcbiAgICAgIGxhYmVsOiBsYWJlbFN1ZmZpeCA/IGAke2Vudi5uYW1lfSAke2xhYmVsU3VmZml4fWAgOiBlbnYubmFtZSxcbiAgICB9KSk7XG4gICAgY29uc3Qgbm9uZTogU2VsZWN0T3B0aW9uID0ge1xuICAgICAgaWQ6IE5PTkVfU0VOVElORUwsXG4gICAgICB2YWx1ZTogTk9ORV9TRU5USU5FTCxcbiAgICAgIG5hbWU6ICdOb25lJyxcbiAgICAgIGxhYmVsOiAnTm9uZScsXG4gICAgfTtcblxuICAgIC8vIFByZS1zZWxlY3Qgb24gZmlyc3QgcmVuZGVyLiBUd28gcGF0aHM6XG4gICAgLy8gICAoYSkgc2VsZWN0ZWRFbnZpcm9ubWVudElkIHNldCDihpIgcmVzb2x2ZSBlbnYgbmFtZSBmcm9tIGVudmlyb25tZW50T3B0aW9uc1xuICAgIC8vICAgICAgIChwYXJzZXMgXCJlbnYtNzQtdGVzdFwiIOKGkiA3NCkgYW5kIHByZS1zZXQgdGhlIGZvcm0gdG8gdGhhdCBuYW1lLlxuICAgIC8vICAgKGIpIHNlbGVjdGVkRW52aXJvbm1lbnRJZCBudWxsIOKGkiBwcmUtc2V0IHRoZSBmb3JtIHRvIE5PTkVfU0VOVElORUwgc29cbiAgICAvLyAgICAgICB0aGUgZHJvcGRvd24gYWN0aXZlbHkgc2hvd3MgXCJOb25lXCIgaW5zdGVhZCBvZiBhbiBlbXB0eSBwbGFjZWhvbGRlclxuICAgIC8vICAgICAgIChwZXIgdXNlciByZXF1ZXN0OiBcIndoZW4gZW52aXJvbm1lbnQgaWQgaXMgbm90IGF2YWlsYWJsZSBvciBudWxsXG4gICAgLy8gICAgICAgd2Ugc2hvdWxkIGRpc3BsYXkgbm9uZSBhcyBzZWxlY3RlZFwiKS5cbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGVudk5hbWUgPSB0aGlzLnJlc29sdmVFbnZpcm9ubWVudE5hbWVCeUlkKE51bWJlcih2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpKTtcbiAgICAgIGlmIChlbnZOYW1lKSB7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZW52TmFtZTtcbiAgICAgICAgdmFyaWFibGVHcm91cD8uZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShlbnZOYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFbnYgaWQgcHJlc2VudCBidXQgbm90IHlldCByZXNvbHZhYmxlIChlbnYgbGlzdCBzdGlsbCBsb2FkaW5nKS5cbiAgICAgICAgLy8gTGVhdmUgdmFyaWFibGUudmFsdWUgYWxvbmU7IHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gaW4gbmdPbkNoYW5nZXNcbiAgICAgICAgLy8gd2hlbiBlbnZpcm9ubWVudE9wdGlvbnMgYXJyaXZlcyB3aWxsIHJlYnVpbGQgdGhpcyBjb25maWcuXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gTk9ORV9TRU5USU5FTDtcbiAgICAgIHZhcmlhYmxlR3JvdXA/LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoTk9ORV9TRU5USU5FTCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb3JtIGdyb3VwIGJ1aWx0IGJ5IHRoZSBwYXJlbnQgKGluaXRpYWxpemVWYXJpYWJsZXNGb3JtKSBoYXNcbiAgICAvLyBjb250cm9scyB7IG5hbWUsIHZhbHVlIH0gcGVyIHZhcmlhYmxlLiBjcWEtZHluYW1pYy1zZWxlY3QgYmluZHNcbiAgICAvLyBpbnRlcm5hbGx5IHZpYSBmb3JtQ29udHJvbE5hbWUsIHNvIHRoZSBga2V5YCBoZXJlIE1VU1QgbWF0Y2ggYW5cbiAgICAvLyBleGlzdGluZyBjb250cm9sIGluIHRoZSBncm91cCDigJQgdXNpbmcgYHZhcmlhYmxlLm5hbWVgICgnZW52aXJvbm1lbnQnKVxuICAgIC8vIG1ha2VzIEFuZ3VsYXIgbG9vayB1cCBhIGNvbnRyb2wgdGhhdCBkb2Vzbid0IGV4aXN0IGFuZCB0aHJvd3NcbiAgICAvLyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiBudWxsIChyZWFkaW5nICdfcmF3VmFsaWRhdG9ycycpYC5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IEVudmlyb25tZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6ICFsb2NrVG9UZXN0Q2FzZUVudixcbiAgICAgIHNlcnZlclNlYXJjaDogIWxvY2tUb1Rlc3RDYXNlRW52LFxuICAgICAgZGlzYWJsZWQ6IGxvY2tUb1Rlc3RDYXNlRW52LFxuICAgICAgb3B0aW9uczogW25vbmUsIC4uLmVudk9wdGlvbnNdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIE5vbmUgLyBlbXB0eSAvIG51bGxpc2ggYWxsIGNvbGxhcHNlIHRvIHRoZSBjbGVhcmVkIHNpZ25hbC5cbiAgICAgICAgY29uc3QgaXNOb25lID0gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IE5PTkVfU0VOVElORUw7XG4gICAgICAgIGNvbnN0IGVudk5hbWUgPSBpc05vbmUgPyBOT05FX1NFTlRJTkVMIDogU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgZW52TmFtZSk7XG5cbiAgICAgICAgaWYgKGlzTm9uZSkge1xuICAgICAgICAgIC8vIENsZWFyZWQgdmlhIE5vbmUg4oCUIGV4cGxpY2l0bHkgZHJvcCB0aGUgcHJldmlvdXMgZW52IGlkIHNvIHRoZVxuICAgICAgICAgIC8vIHBhcmVudCdzIHNhdmUgbG9naWMgKGVkaXQtZGVwdGgtbW9kYWwub25TYXZlLCBsaW5lcyB+MTcxNC0xNzM1KVxuICAgICAgICAgIC8vIHNlZXMgdGhlIGNsZWFyZWQgc3RhdGUgYW5kIG51bGxzIHRlc3RTdGVwLmVudmlyb25tZW50SWQuXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1pcnJvciBnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZzogZXh0cmFjdCBudW1lcmljIGVudiBpZCBmcm9tXG4gICAgICAgIC8vIGVudmlyb25tZW50T3B0aW9uc1tdLmlkIChmb3JtYXQgXCJlbnYtNzQtdGVzdFwiIOKGkiA3NCkgYW5kIHN0b3JlIG9uXG4gICAgICAgIC8vIHRoZSB2YXJpYWJsZSBzbyBlZGl0LWRlcHRoLW1vZGFsLm9uU2F2ZSgpIHBpY2tzIGl0IHVwIHZpYSB0aGVcbiAgICAgICAgLy8gZXhpc3RpbmcgZGF0YVR5cGU9PT0nZW52aXJvbm1lbnQnICsgc2VsZWN0ZWRFbnZpcm9ubWVudElkIHBhdGhcbiAgICAgICAgLy8gdGhhdCBkZXJpdmVzIHN0ZXAuZW52aXJvbm1lbnRJZC5cbiAgICAgICAgY29uc3QgZW52T3B0aW9uID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmluZChlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBlbnZOYW1lKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgICAgaWYgKGlkTWF0Y2ggJiYgaWRNYXRjaFsxXSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IGFzIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAgIHRoaXMuZW52aXJvbm1lbnROYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKiogTG9vayB1cCBhbiBlbnZpcm9ubWVudCdzIGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBudW1lcmljIGlkIHN0b3JlZCBvbiB0aGUgdmFyaWFibGUuICovXG4gIHByaXZhdGUgcmVzb2x2ZUVudmlyb25tZW50TmFtZUJ5SWQoZW52SWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChlbnZJZCA9PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUoZW52SWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB0YXJnZXQgPSBTdHJpbmcoZW52SWQpO1xuICAgIGNvbnN0IG1hdGNoID0gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zIHx8IFtdKS5maW5kKGVudiA9PiB7XG4gICAgICBjb25zdCBtID0gKGVudi5pZCB8fCAnJykubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICByZXR1cm4gbSAmJiBtWzFdID09PSB0YXJnZXQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2guZW52aXJvbm1lbnQgOiBudWxsO1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIEhpZGUgQHxQYXJhbWV0ZXJ8IHdoZW4gdGhlIHN0ZXAgaXMgbm90IGluc2lkZSBhIEZPUiBsb29wIEFORCB0aGUgdGVzdCBjYXNlIGhhcyBubyB0ZXN0IGRhdGEgcHJvZmlsZS5cbiAgICBpZiAoIXRoaXMuaXNJbnNpZGVGb3JMb29wU3RlcCAmJiAhdGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFUeXBlT3B0aW9ucy5maWx0ZXIob3B0ID0+IG9wdC52YWx1ZSAhPT0gJ3BhcmFtZXRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhVHlwZU9wdGlvbnM7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhVHlwZWA7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiAhdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVR5cGUnLCAvLyBVc2UgJ2RhdGFUeXBlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXREYXRhVHlwZU9wdGlvbnMoKSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVR5cGVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBnZXRDdXJyZW50RGF0YVR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgfCAnZ2xvYmFsJyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIEdsb2JhbCBEYXRhIHRhYi4gKi9cbiAgaXNHbG9iYWxUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCcpID09PSAnZ2xvYmFsJztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBwaWNrZWQgYSBnbG9iYWwgdmFyaWFibGUgb24gdGhpcyByb3cuICovXG4gIGhhc1NlbGVjdGVkR2xvYmFsVmFyaWFibGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlbGVjdCBjb25maWcgZm9yIHRoZSBHbG9iYWwgRGF0YSBkcm9wZG93bi5cbiAgICogRWFjaCByb3cgaW5zZXJ0cyBge3tuYW1lfX1gIG9uIHNlbGVjdGlvbi5cbiAgICovXG4gIGdldEdsb2JhbFZhcmlhYmxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2dsb2JhbFZhcmlhYmxlYDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdsb2JhbFZhcmlhYmxlU2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7IHJldHVybiBjYWNoZWQ7IH1cblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkR2xvYmFsVmFyaWFibGUnLCBuZXcgRm9ybUNvbnRyb2wodmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZSB8fCAnJykpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh0aGlzLmdsb2JhbFZhcmlhYmxlT3B0aW9ucyB8fCBbXSkubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLm5hbWUsXG4gICAgICB2YWx1ZTogZy5uYW1lLFxuICAgICAgbmFtZTogZy5uYW1lLFxuICAgICAgbGFiZWw6IGcubmFtZSxcbiAgICB9KSk7XG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZEdsb2JhbFZhcmlhYmxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGdsb2JhbCB2YXJpYWJsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0dsb2JhbFZhcmlhYmxlcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHRoaXMuc2VhcmNoR2xvYmFsVmFyaWFibGVzLmVtaXQocXVlcnkpLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gKHRoaXMuZ2xvYmFsVmFyaWFibGVPcHRpb25zIHx8IFtdKS5maW5kKGcgPT4gZy5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgY29uc3QgbnVtZXJpY0lkID0gbWF0Y2hlZCAmJiBtYXRjaGVkLmlkICE9IG51bGwgJiYgIWlzTmFOKE51bWJlcihtYXRjaGVkLmlkKSlcbiAgICAgICAgICA/IE51bWJlcihtYXRjaGVkLmlkKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlID0gbmFtZTtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gbnVtZXJpY0lkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IG5hbWU7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShuYW1lLCAnZ2xvYmFsJyk7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkO1xuICAgICAgICBjb25zdCBncnAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoZ3JwPy5nZXQoJ3ZhbHVlJykpIGdycC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWQgfSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuZ2xvYmFsVmFyaWFibGVTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgZ2V0UmF3VmFsdWUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YXJpYWJsZS5yYXdWYWx1ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGFyYW1ldGVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgb25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB8ICdnbG9iYWwnKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgdmFyaWFibGVcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgc3RvcmVkIGRhdGEgdHlwZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgdmFyaWFibGUuZGF0YVR5cGUgPSBkYXRhVHlwZTtcblxuICAgIC8vIENsZWFyIGdsb2JhbC10YWIgc3RhdGUgaWYgbGVhdmluZyB0aGUgZ2xvYmFsIHRhYi5cbiAgICBpZiAoZGF0YVR5cGUgIT09ICdnbG9iYWwnKSB7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZ3JwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgICAgaWYgKGdycD8uZ2V0KCdzZWxlY3RlZEdsb2JhbFZhcmlhYmxlJykpIHtcbiAgICAgICAgZ3JwLmdldCgnc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBwYXJhbWV0ZXIgYW5kIGVudmlyb25tZW50IHNlbGVjdCBjb25maWcgY2FjaGVzIHNpbmNlIGRhdGEgdHlwZSBjaGFuZ2VkXG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9kYXRhU2V0YCk7XG4gICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZpcm9ubWVudGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZQYXJhbWApO1xuICAgIFxuICAgIC8vIEdldCB0aGUgdmFyaWFibGUgZ3JvdXBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIHBhcmFtZXRlciB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgcGFyYW1ldGVyLXJlbGF0ZWQgZm9ybSBjb250cm9scyB3aGVuIHN3aXRjaGluZyBhd2F5IGZyb20gcGFyYW1ldGVyIHR5cGVcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0RW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2hlbiBzd2l0Y2hpbmcgVE8gcGFyYW1ldGVyIHR5cGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbnMgdG8gc3RhcnQgZnJlc2hcbiAgICAgIC8vICh1bmxlc3MgZGVmYXVsdCB2YWx1ZXMgYXJlIHByb3ZpZGVkLCB3aGljaCB3aWxsIGJlIHNldCBiZWxvdylcbiAgICAgIGlmICghdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgfHwgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSAnJztcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGZvcm0gY29udHJvbHMgaWYgdGhleSBleGlzdFxuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCBlbnZpcm9ubWVudCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIGVudmlyb25tZW50IHR5cGVcbiAgICBpZiAoZGF0YVR5cGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBlbnZpcm9ubWVudC1yZWxhdGVkIGZvcm0gY29udHJvbHNcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHZhbHVlIHdoZW4gc3dpdGNoaW5nIGRhdGEgdHlwZXMgKHN0YXJ0IGZyZXNoKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIGJhc2VkIG9uIG5ldyBkYXRhIHR5cGUgKHdpbGwgYmUgZW1wdHkgc3RyaW5nKVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKCcnLCBkYXRhVHlwZSk7XG5cbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKGFsd2F5cyBzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgaW4gdmFyaWFibGUpXG4gICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcblxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAvLyBGb3IgYWxsIHR5cGVzLCBzdGFydCB3aXRoIGVtcHR5IHZhbHVlIHdoZW4gc3dpdGNoaW5nXG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVudi1vbi10ZXN0LWNhc2U6IHdoZW4gdGhlIHVzZXIgcGlja3MgdGhlIFwiRW52aXJvbm1lbnQgVmFyaWFibGVcIiBzZWdtZW50LFxuICAgIC8vIHByZS1zZWxlY3QgdGhlIHRlc3QgY2FzZSdzIGVudiB2aWEgdGhlIHNoYXJlZCBzZWVkIGhlbHBlci4gUnVucyBvdXRzaWRlXG4gICAgLy8gdGhlIGB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKWAgZ3VhcmQgc28gaXQgd29ya3MgZXZlbiB3aGVuIHRoZSB2YWx1ZVxuICAgIC8vIGNvbnRyb2wgaGFzbid0IGJlZW4gYWRkZWQgeWV0IGZvciB0aGlzIHZhcmlhYmxlLlxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgLy8gTWFyayB0aGUgdmFyaWFibGUgYXMgZW52LXR5cGUgc28gdGhlIHNlZWQgcGFzcyBwaWNrcyBpdCB1cC5cbiAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52aXJvbm1lbnRgKTtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgIHRoaXMuc2VlZERlZmF1bHRFbnZpcm9ubWVudEZvclZhcmlhYmxlcygpO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8gcGFyYW1ldGVyIHR5cGUsIGNoZWNrIGZvciBkZWZhdWx0IHZhbHVlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBwcm92aWRlZCBmcm9tIHRlc3QgY2FzZS9GT1IgY29udGV4dC5cbiAgICAgIC8vIEV2ZW4gd2hlbiBkZWZhdWx0IHN0YXJ0IGluZGV4IGlzIG1pc3NpbmcsIHByb2ZpbGUgc2hvdWxkIHN0aWxsIGJlIHByZXNlbGVjdGVkLlxuICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgKG51bWVyaWMtc2FmZSBtYXRjaCBmb3Igc3RyaW5nL251bWJlciBJRHMpXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+XG4gICAgICAgICAgTnVtYmVyKHRlc3REYXRhLmlkKSA9PT0gTnVtYmVyKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVmYXVsdFByb2ZpbGUpIHtcbiAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGVEYXRhOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFByb2ZpbGUuZGF0YSkgPyBkZWZhdWx0UHJvZmlsZS5kYXRhIDogW107XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFN0YXJ0SW5kZXggPSB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCA/IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCA6IDA7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRTdGFydEluZGV4ID0gcHJvZmlsZURhdGEubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBNYXRoLm1pbihNYXRoLm1heChkZWZhdWx0U3RhcnRJbmRleCwgMCksIHByb2ZpbGVEYXRhLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IC0xO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHREYXRhU2V0ID0gcmVzb2x2ZWRTdGFydEluZGV4ID49IDAgPyBwcm9maWxlRGF0YVtyZXNvbHZlZFN0YXJ0SW5kZXhdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGRlZmF1bHREYXRhU2V0Py5uYW1lIHx8ICcnO1xuXG4gICAgICAgICAgLy8gQWx3YXlzIHNldCBzZWxlY3RlZCBwcm9maWxlIHdoZW4gZGVmYXVsdCBwcm9maWxlIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBkZWZhdWx0UHJvZmlsZS5pZDtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbnNpZGVGb3JMb29wU3RlcCAmJiBkYXRhU2V0TmFtZSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4ICE9IG51bGwgJiYgcHJvZmlsZURhdGEubGVuZ3RoID4gdGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleCkge1xuICAgICAgICAgICAgICBjb25zdCBlbmREYXRhU2V0ID0gcHJvZmlsZURhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleF07XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IGVuZERhdGFTZXQ/Lm5hbWUgfHwgZGF0YVNldE5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnMuXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhU2V0TmFtZSkge1xuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGRhdGFTZXROYW1lKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXAgJiYgZGF0YVNldE5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnLCBuZXcgRm9ybUNvbnRyb2wodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0RW5kJywgbmV3IEZvcm1Db250cm9sKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCB8fCBkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kIHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlcy5cbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICBjb25zdCBwYXJhbUtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGVOYW1lfV9wYXJhbUZvckRhdGFTZXRgKSkge1xuICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIHRoZSBuZXcgc2VsZWN0IGNvbmZpZyBpZiBuZWVkZWRcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5pbmRleE9mKHZhcmlhYmxlKTtcbiAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgIHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIElmIGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkLCBwcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWdcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCBwcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBjb25zb2xlLmxvZygnb25EYXRhVHlwZUNoYW5nZScsIHZhcmlhYmxlTmFtZSwgZGF0YVR5cGUsIGZvcm1hdHRlZFZhbHVlKTtcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnQgd2l0aCBmb3JtYXR0ZWQgdmFsdWVcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICB9XG4gIFxuICBvbkVsZW1lbnRTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIHNlYXJjaCBmb3Igc2VsZWN0b3IgdmFyaWFibGVzXG4gICAgLy8gVGhlIGtleSB3aWxsIGJlICd2YWx1ZScgc2luY2UgdGhhdCdzIHdoYXQgd2Ugc2V0IGluIHRoZSBjb25maWdcbiAgICAvLyBFbWl0IHRoZSBzZWFyY2ggcXVlcnkgdG8gcGFyZW50IGNvbXBvbmVudFxuICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvLyBUcmFja3MgYWN0aXZlIHZhcmlhYmxlLXN5bnRheCBlcnJvcnMgYnkgdmFyaWFibGUgbmFtZS4gVGhlIHZhbGlkYXRvciBiZWxvd1xuICAvLyByZWFkcyBmcm9tIHRoaXMgbWFwIHNvIGVycm9ycyBzdXJ2aXZlIGNvbnRyb2wgcmUtdmFsaWRhdGlvbiBvbiBzZXRWYWx1ZSgpLlxuICBwcml2YXRlIHJlYWRvbmx5IHZhcmlhYmxlU3ludGF4RXJyb3JzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sc1dpdGhTeW50YXhWYWxpZGF0b3IgPSBuZXcgV2Vha1NldDxBYnN0cmFjdENvbnRyb2w+KCk7XG5cbiAgcHJpdmF0ZSBtYWtlU3ludGF4VmFsaWRhdG9yKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSB0aGlzLnZhcmlhYmxlU3ludGF4RXJyb3JzLmdldCh2YXJpYWJsZU5hbWUpO1xuICAgICAgcmV0dXJuIGVyciA/IHsgaW52YWxpZFZhcmlhYmxlU3ludGF4OiBlcnIgfSA6IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWxpZGl0eUNoYW5nZShcbiAgICB2YXJpYWJsZU5hbWU6IHN0cmluZyxcbiAgICBldmVudDogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I6IHN0cmluZyB8IG51bGwgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWVDb250cm9sID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpPy5nZXQoJ3ZhbHVlJyk7XG4gICAgaWYgKCF2YWx1ZUNvbnRyb2wpIHJldHVybjtcblxuICAgIGlmIChldmVudC52YWxpZCkge1xuICAgICAgdGhpcy52YXJpYWJsZVN5bnRheEVycm9ycy5kZWxldGUodmFyaWFibGVOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YXJpYWJsZVN5bnRheEVycm9ycy5zZXQodmFyaWFibGVOYW1lLCBldmVudC5lcnJvciB8fCAnSW52YWxpZCB2YXJpYWJsZSBuYW1lLicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250cm9sc1dpdGhTeW50YXhWYWxpZGF0b3IuaGFzKHZhbHVlQ29udHJvbCkpIHtcbiAgICAgIHZhbHVlQ29udHJvbC5hZGRWYWxpZGF0b3JzKHRoaXMubWFrZVN5bnRheFZhbGlkYXRvcih2YXJpYWJsZU5hbWUpKTtcbiAgICAgIHRoaXMuY29udHJvbHNXaXRoU3ludGF4VmFsaWRhdG9yLmFkZCh2YWx1ZUNvbnRyb2wpO1xuICAgIH1cbiAgICB2YWx1ZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdmFsdWVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgcmF3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgcmF3IHZhbHVlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IGRhdGEgdHlwZVxuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWVcbiAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXMgZnJvbSBwYXJhbWV0ZXIgb3B0aW9ucyAocmF3IFRlc3REYXRhIG9iamVjdHMpXG4gICAqL1xuICBnZXRVbmlxdWVUZXN0RGF0YVByb2ZpbGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgcHJvZmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5mb3JFYWNoKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyB0ZXN0RGF0YS5uYW1lIGlzIHRoZSB0ZXN0RGF0YU5hbWUgKHByb2ZpbGUgbmFtZSlcbiAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICBpZiAocHJvZmlsZU5hbWUgJiYgIXByb2ZpbGVNYXAuaGFzKHByb2ZpbGVOYW1lKSkge1xuICAgICAgICBwcm9maWxlTWFwLnNldChwcm9maWxlTmFtZSwge1xuICAgICAgICAgIGlkOiBTdHJpbmcodGVzdERhdGEuaWQpLFxuICAgICAgICAgIG5hbWU6IHByb2ZpbGVOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEFsc28gaW5jbHVkZSBhbnkgc25hcHNob3R0ZWQgcHJvZmlsZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGN1cnJlbnQgcGFyYW1ldGVyT3B0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJQcm9maWxlU25hcHNob3QuZm9yRWFjaCgocHJvZmlsZTogYW55KSA9PiB7XG4gICAgICBjb25zdCBwcm9maWxlTmFtZSA9IHByb2ZpbGUubmFtZSB8fCBwcm9maWxlLnRlc3REYXRhTmFtZTtcbiAgICAgIGlmIChwcm9maWxlTmFtZSAmJiAhcHJvZmlsZU1hcC5oYXMocHJvZmlsZU5hbWUpKSB7XG4gICAgICAgIHByb2ZpbGVNYXAuc2V0KHByb2ZpbGVOYW1lLCB7XG4gICAgICAgICAgaWQ6IFN0cmluZyhwcm9maWxlLmlkKSxcbiAgICAgICAgICBuYW1lOiBwcm9maWxlTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9maWxlcyA9IEFycmF5LmZyb20ocHJvZmlsZU1hcC52YWx1ZXMoKSk7XG4gICAgcmV0dXJuIHByb2ZpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkYXRhIHNldHMgZm9yIGEgc3BlY2lmaWMgdGVzdCBkYXRhIHByb2ZpbGVcbiAgICogUmV0dXJucyBhbGwgZGF0YSBzZXRzIGZyb20gdGhlIHByb2ZpbGUncyBkYXRhIGFycmF5XG4gICAqL1xuICBnZXREYXRhU2V0c0ZvclRlc3REYXRhUHJvZmlsZShwcm9maWxlSWQ6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgaWQsIGZhbGxiYWNrIHRvIHNuYXBzaG90IGlmIG5vdCBpbiBjdXJyZW50IHBhcmFtZXRlck9wdGlvbnNcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZCk7XG4gICAgfSk7XG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgIHRlc3REYXRhUHJvZmlsZSA9IHRoaXMuZmluZFByb2ZpbGVJblNuYXBzaG90KE51bWJlcihwcm9maWxlSWQpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFJldHVybiBhbGwgZGF0YSBzZXRzIGZyb20gdGhlIHByb2ZpbGVcbiAgICByZXR1cm4gdGVzdERhdGFQcm9maWxlLmRhdGEubWFwKChkYXRhU2V0OiBhbnkpID0+ICh7XG4gICAgICBpZDogZGF0YVNldC5uYW1lLFxuICAgICAgbmFtZTogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGRhdGEgc2V0IGluIGEgdGVzdCBkYXRhIHByb2ZpbGVcbiAgICogRXh0cmFjdHMgcGFyYW1ldGVyIG5hbWVzIGZyb20gdGhlIHNlbGVjdGVkIGRhdGEgc2V0J3MgZGF0YSBvYmplY3RcbiAgICovXG4gIGdldFBhcmFtZXRlcnNGb3JEYXRhU2V0KHByb2ZpbGVJZE9yTmFtZTogc3RyaW5nLCBkYXRhU2V0TmFtZTogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBpZCBvciBuYW1lLCBmYWxsYmFjayB0byBzbmFwc2hvdFxuICAgIGxldCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgY29uc3QgaWRNYXRjaCA9ICFpc05hTihOdW1iZXIocHJvZmlsZUlkT3JOYW1lKSkgJiYgdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWRPck5hbWUpO1xuICAgICAgY29uc3QgbmFtZU1hdGNoID0gKHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lKSA9PT0gcHJvZmlsZUlkT3JOYW1lO1xuICAgICAgcmV0dXJuIGlkTWF0Y2ggfHwgbmFtZU1hdGNoO1xuICAgIH0pO1xuICAgIGlmICghdGVzdERhdGFQcm9maWxlICYmICFpc05hTihOdW1iZXIocHJvZmlsZUlkT3JOYW1lKSkpIHtcbiAgICAgIHRlc3REYXRhUHJvZmlsZSA9IHRoaXMuZmluZFByb2ZpbGVJblNuYXBzaG90KE51bWJlcihwcm9maWxlSWRPck5hbWUpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNwZWNpZmljIGRhdGEgc2V0IGJ5IG5hbWVcbiAgICBjb25zdCBkYXRhU2V0ID0gdGVzdERhdGFQcm9maWxlLmRhdGEuZmluZCgoZHM6IGFueSkgPT4gZHMubmFtZSA9PT0gZGF0YVNldE5hbWUpO1xuICAgIGlmICghZGF0YVNldCB8fCAhZGF0YVNldC5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBhbGwgcGFyYW1ldGVyIGtleXMgZnJvbSB0aGUgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gT2JqZWN0LmtleXMoZGF0YVNldC5kYXRhKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyTmFtZXMubWFwKHBhcmFtTmFtZSA9PiAoe1xuICAgICAgaWQ6IHBhcmFtTmFtZSxcbiAgICAgIG5hbWU6IHBhcmFtTmFtZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHByb2ZpbGUgaW4gdGhlIHNuYXBzaG90IGJ5IG51bWVyaWMgSUQuXG4gICAqIFVzZWQgYXMgZmFsbGJhY2sgd2hlbiBwYXJhbWV0ZXJPcHRpb25zIGlzIHRlbXBvcmFyaWx5IGZpbHRlcmVkIGJ5IGFub3RoZXIgdmFyaWFibGUncyBzZWFyY2guXG4gICAqL1xuICBwcml2YXRlIGZpbmRQcm9maWxlSW5TbmFwc2hvdChwcm9maWxlSWQ6IG51bWJlcik6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBwcm9maWxlIG9mIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJQcm9maWxlU25hcHNob3QudmFsdWVzKCkpIHtcbiAgICAgIGlmIChwcm9maWxlICYmIHByb2ZpbGUuaWQgPT09IHByb2ZpbGVJZCkge1xuICAgICAgICByZXR1cm4gcHJvZmlsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICAgKi9cbiAgZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3Rlc3REYXRhUHJvZmlsZWA7XG4gICAgXG4gICAgLy8gR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXNcbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMuZ2V0VW5pcXVlVGVzdERhdGFQcm9maWxlcygpO1xuICAgIC8vIENyZWF0ZSBvcHRpb25zIHdpdGggcHJvZmlsZSBuYW1lIGFuZCBJRCAoZGlzcGxheSBuYW1lIHdpdGggSUQpXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwcm9maWxlcy5tYXAocHJvZmlsZSA9PiB7XG4gICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSB0byBnZXQgdGhlIElEXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBwcm9maWxlLm5hbWU7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQgfHwgcHJvZmlsZS5pZDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IFN0cmluZyhwcm9maWxlSWQpLFxuICAgICAgICB2YWx1ZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBuYW1lOiBgJHtwcm9maWxlLm5hbWV9YCwgLy8gRGlzcGxheSBuYW1lIHdpdGggSURcbiAgICAgICAgbGFiZWw6IGAke3Byb2ZpbGUubmFtZX1gXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiBhbmQgdXBkYXRlIGl0XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIFxuICAgICAgICAgID8gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpIFxuICAgICAgICAgIDogKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8ICcnKTtcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50VmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgcHJvZmlsZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSB2YWx1ZSBpcyBzZXQgZXZlbiBpZiBjb25maWcgd2FzIGNhY2hlZFxuICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHdoaWNoIG1hdGNoZXMgb3B0LmlkKSBpbnN0ZWFkIG9mIHByb2ZpbGUgbmFtZSAod2hpY2ggbWF0Y2hlcyBvcHQudmFsdWUpXG4gICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBwcm9maWxlIElEIGV4aXN0cyBpbiBvcHRpb25zIGJlZm9yZSBzZXR0aW5nXG4gICAgICAgIGNvbnN0IHByb2ZpbGVFeGlzdHMgPSBvcHRpb25zQXJyYXkuc29tZShvcHQgPT4gb3B0LmlkID09PSBwcm9maWxlSWRTdHJpbmcpO1xuICAgICAgICBpZiAocHJvZmlsZUV4aXN0cykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250cm9sVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sVmFsdWUgIT09IHByb2ZpbGVJZFN0cmluZykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAvLyBGYWxsYmFjazogaWYgd2Ugb25seSBoYXZlIHRoZSBwcm9maWxlIG5hbWUsIGZpbmQgdGhlIG1hdGNoaW5nIG9wdGlvbiBhbmQgdXNlIGl0cyBJRFxuICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IG9wdGlvbnNBcnJheS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gbWF0Y2hpbmdPcHRpb24uaWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShtYXRjaGluZ09wdGlvbi5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIHZhcmlhYmxlJ3MgcHJvZmlsZSBJRCBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBOdW1iZXIobWF0Y2hpbmdPcHRpb24uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHByb2ZpbGUgaXMgYWx3YXlzIGluIHRoZSBvcHRpb25zIGxpc3Qgc28gd2hlbiB0aGUgdXNlclxuICAgIC8vIHJlb3BlbnMgdGhlIHNlbGVjdCBhZnRlciBzZWFyY2hpbmcvc2VsZWN0aW5nLCB0aGUgc2VsZWN0ZWQgb3B0aW9uIHN0aWxsIHNob3dzLlxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWUgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgOiAoY3VycmVudEZvcm1WYWx1ZSAhPSBudWxsICYmIGN1cnJlbnRGb3JtVmFsdWUgIT09ICcnID8gU3RyaW5nKGN1cnJlbnRGb3JtVmFsdWUpIDogbnVsbCk7XG4gICAgaWYgKHNlbGVjdGVkSWQgJiYgIW9wdGlvbnNBcnJheS5zb21lKG9wdCA9PiBTdHJpbmcob3B0LmlkKSA9PT0gc2VsZWN0ZWRJZCkpIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgc2VsZWN0ZWRJZDtcbiAgICAgIG9wdGlvbnNBcnJheSA9IFtcbiAgICAgICAgeyBpZDogc2VsZWN0ZWRJZCwgdmFsdWU6IGRpc3BsYXlOYW1lLCBuYW1lOiBkaXNwbGF5TmFtZSwgbGFiZWw6IGRpc3BsYXlOYW1lIH0sXG4gICAgICAgIC4uLm9wdGlvbnNBcnJheVxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHVzZSBjYWNoZSBpZiB0aGUgY2FjaGVkIGNvbmZpZydzIG9wdGlvbnMgaW5jbHVkZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gKHNvIHJlb3BlbmluZyBzaG93cyBzZWxlY3RlZClcbiAgICBpZiAodGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgICAgY29uc3QgY29udHJvbFZhbCA9IHZhcmlhYmxlR3JvdXA/LmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBjb25zdCBzZWxlY3RlZEluQ2FjaGVkID0gY29udHJvbFZhbCA9PSBudWxsIHx8IGNvbnRyb2xWYWwgPT09ICcnIHx8IChjYWNoZWQub3B0aW9ucyB8fCBbXSkuc29tZSgobzogU2VsZWN0T3B0aW9uKSA9PiBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhjb250cm9sVmFsKSB8fCBvLnZhbHVlID09PSBjb250cm9sVmFsKTtcbiAgICAgIGlmIChzZWxlY3RlZEluQ2FjaGVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShjYWNoZUtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCAtIGlmIHNvLCBkaXNhYmxlIHRoZSBkcm9wZG93blxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpO1xuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZVBhcmFtZXRlcnMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nUGFyYW1ldGVycyxcbiAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGFyYW1ldGVyU2VhcmNoVmFyaWFibGUgPSB2YXJpYWJsZS5uYW1lO1xuICAgICAgICB0aGlzLnNlYXJjaFBhcmFtZXRlcnMuZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgaXMgdGhlIHByb2ZpbGUgSUQgKHN0cmluZykgZnJvbSB0aGUgbWF0LW9wdGlvblxuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRCB0byBnZXQgdGhlIG5hbWVcbiAgICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gU3RvcmUgYm90aCBJRCBhbmQgbmFtZVxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU/Lm5hbWUgfHwgdGVzdERhdGFQcm9maWxlPy50ZXN0RGF0YU5hbWUgfHwgJyc7XG5cbiAgICAgICAgLy8gU25hcHNob3QgdGhlIGZ1bGwgcHJvZmlsZSBzbyBpdCBzdXJ2aXZlcyBpZiBhbm90aGVyIHZhcmlhYmxlIHRyaWdnZXJzIGEgc2VhcmNoXG4gICAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVyUHJvZmlsZVNuYXBzaG90LnNldCh2YXJpYWJsZS5uYW1lLCB0ZXN0RGF0YVByb2ZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3Mgc2luY2UgcHJvZmlsZSBjaGFuZ2VkXG4gICAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIGNvbmZpZ3MgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZGF0YSBzZXQgd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGRhdGEgc2V0IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICAgKi9cbiAgZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmaW5kIElEIGZyb20gcHJvZmlsZSBuYW1lXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIHByb2ZpbGUgSUQgZnJvbSB0aGUgcHJvZmlsZSBuYW1lXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgZm9yIGNhY2hlIGtleSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0XyR7cHJvZmlsZUlkVG9Vc2UgfHwgc2VsZWN0ZWRQcm9maWxlIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGF0YSBzZXRzIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgdXNpbmcgSURcbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgc2V0IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCB8fCAnJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFTZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZERhdGFTZXQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGF0YSBTZXQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBkYXRhIHNldCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnIHNpbmNlIGRhdGEgc2V0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqIERhdGEgU2V0IFN0YXJ0L0VuZCBzZWxlY3QgY29uZmlnIGZvciBGT1ItbG9vcCBjb250ZXh0LiAqL1xuICBnZXREYXRhU2V0UmFuZ2VTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIsIHJhbmdlOiAnc3RhcnQnIHwgJ2VuZCcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogcmFuZ2UgPT09ICdzdGFydCcgPyAnc2VsZWN0ZWREYXRhU2V0U3RhcnQnIDogJ3NlbGVjdGVkRGF0YVNldEVuZCcsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHNlbGVjdGVkUHJvZmlsZTtcbiAgICAgIH0pO1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSB0ZXN0RGF0YVByb2ZpbGU/LmlkID8gU3RyaW5nKHRlc3REYXRhUHJvZmlsZS5pZCkgOiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRSYW5nZV8ke3JhbmdlfV8ke3Byb2ZpbGVJZFRvVXNlIHx8IHNlbGVjdGVkUHJvZmlsZSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTZXRzID0gdGhpcy5nZXREYXRhU2V0c0ZvclRlc3REYXRhUHJvZmlsZShwcm9maWxlSWRUb1VzZSk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGRhdGFTZXRzLm1hcChkYXRhU2V0ID0+ICh7XG4gICAgICBpZDogZGF0YVNldC5uYW1lLFxuICAgICAgdmFsdWU6IGRhdGFTZXQubmFtZSxcbiAgICAgIG5hbWU6IGRhdGFTZXQubmFtZSxcbiAgICAgIGxhYmVsOiBkYXRhU2V0Lm5hbWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBrZXkgPSByYW5nZSA9PT0gJ3N0YXJ0JyA/ICdzZWxlY3RlZERhdGFTZXRTdGFydCcgOiAnc2VsZWN0ZWREYXRhU2V0RW5kJztcbiAgICBjb25zdCBjdXJyZW50VmFsID0gcmFuZ2UgPT09ICdzdGFydCcgPyAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgJycpIDogKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCB8fCAnJyk7XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoa2V5KSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woa2V5LCBuZXcgRm9ybUNvbnRyb2woY3VycmVudFZhbCkpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsICYmIHZhcmlhYmxlR3JvdXAuZ2V0KGtleSk/LnZhbHVlICE9PSBjdXJyZW50VmFsKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KGtleSk/LnNldFZhbHVlKGN1cnJlbnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleSxcbiAgICAgIHBsYWNlaG9sZGVyOiByYW5nZSA9PT0gJ3N0YXJ0JyA/ICdTZWxlY3QgRGF0YSBTZXQgU3RhcnQnIDogJ1NlbGVjdCBEYXRhIFNldCBFbmQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmFuZ2UgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHZhbHVlO1xuICAgICAgICAgIC8vIFBhcmFtZXRlciBvcHRpb25zIGFyZSByZXNvbHZlZCBmcm9tIHNlbGVjdGVkRGF0YVNldDsga2VlcCB0aGlzIGFsaWFzIGluIHN5bmMuXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIHZhckdyb3VwLmdldChrZXkpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChyYW5nZSA9PT0gJ3N0YXJ0JyAmJiB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrKSA9PiB7XG4gICAgICAgICAgaWYgKGsuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfYCkpIHtcbiAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrKSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgcGFyYW1ldGVyIGRyb3Bkb3duICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIHBhcmFtZXRlcnMgZnJvbSBzZWxlY3RlZCBkYXRhIHNldClcbiAgICovXG4gIGdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKSBhbmQgZGF0YSBzZXRcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRhU2V0ID0gdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0O1xuICAgIFxuICAgIGlmICgoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHx8ICFzZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgcHJvZmlsZSBvciBkYXRhIHNldCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IChzZWxlY3RlZFByb2ZpbGVJZCB8fCBzZWxlY3RlZFByb2ZpbGUpID8gJ1NlbGVjdCBEYXRhIFNldCBmaXJzdCcgOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gc2VsZWN0ZWRQcm9maWxlSWQgPyBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpIDogKHNlbGVjdGVkUHJvZmlsZSB8fCAnJyk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHtzZWxlY3RlZERhdGFTZXR9YDtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQgdXNpbmcgcHJvZmlsZSBJRCBvciBuYW1lXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkZW50aWZpZXIsIHNlbGVjdGVkRGF0YVNldCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBVc2UgcGFyYW0ubmFtZSBhcyBpZCAobWF0LW9wdGlvbiB3aWxsIHVzZSB0aGlzKVxuICAgICAgdmFsdWU6IGBAfCR7cGFyYW0ubmFtZX18YCwgLy8gRm9ybWF0dGVkIHZhbHVlIGZvciBkaXNwbGF5XG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBhbmQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUsIGVuc3VyZSBmb3JtIGNvbnRyb2wgbWF0Y2hlcyB0aGUgb3B0aW9uIGlkIChmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIENoZWNrIGlmIHZhbHVlIGlzIGFscmVhZHkgZm9ybWF0dGVkIChlLmcuLCBcIkB8ZW1haWx8XCIpXG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGN1cnJlbnRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgID8gY3VycmVudFZhbHVlXG4gICAgICAgIDogKGN1cnJlbnRWYWx1ZSA/IGBAfCR7Y3VycmVudFZhbHVlfXxgIDogJycpO1xuICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBmb3JtYXR0ZWQgdmFsdWUgKG1hdGNoZXMgb3B0LmlkKSBzbyBzZWxlY3QgZGlzcGxheXMgY29ycmVjdGx5XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgJiYgcGFyYW1ldGVycy5zb21lKHAgPT4gYEB8JHtwLm5hbWV9fGAgPT09IGZvcm1hdHRlZFZhbHVlKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogZmFsc2UsIC8vIENsaWVudC1zaWRlIHNlYXJjaCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYWxsIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLCAvLyBObyBwYWdpbmF0aW9uIGZvciBwYXJhbWV0ZXJzIHdpdGhpbiBhIGRhdGEgc2V0XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIHJlY2VpdmVkIGlzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgKGUuZy4sIFwiQHxlbWFpbHxcIikgYmVjYXVzZSBtYXQtb3B0aW9uIHVzZXMgb3B0LmlkXG4gICAgICAgIC8vIEV4dHJhY3QgcGFyYW1ldGVyIG5hbWUgZnJvbSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZTsgLy8gVGhpcyBpcyBhbHJlYWR5IGZvcm1hdHRlZCBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiBmb3JtYXR0ZWRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgICAgPyBmb3JtYXR0ZWRWYWx1ZS5zbGljZSgyLCAtMSlcbiAgICAgICAgICA6IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHJhdyB2YWx1ZSAoc3RvcmUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBmb3JtYXR0aW5nKVxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZSAoc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGZvciB0ZW1wbGF0ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0gdXNlIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXAgJiYgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIGZvcm1hdHRlZCB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayBhbmQgZW1pdFxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50ICh0aGlzIGlzIHdoYXQgZ2V0cyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSlcbiAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZS5uYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudi1vbi10ZXN0LWNhc2UgY29udHJhY3Q6IGEgdGVzdCBjYXNlIGhhcyBleGFjdGx5IG9uZSBlbnZpcm9ubWVudCwgc28gdGhlXG4gICAqIFwiRW52aXJvbm1lbnQgTmFtZVwiIGRyb3Bkb3duIGhhcyBub3RoaW5nIG1lYW5pbmdmdWwgdG8gY2hvb3NlIGZyb20uIFdlIHRydXN0XG4gICAqIGB0ZXN0Q2FzZUVudmlyb25tZW50TmFtZWAgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCDigJQgZXZlbiBpZiBpdCdzIG5vdCBpbiB0aGVcbiAgICogbG9hZGVkIGBlbnZpcm9ubWVudE9wdGlvbnNgIHlldCAodGhvc2UgYXJlIGFzeW5jLCBlbnYtc2NvcGVkLCBhbmQgbWF5IGJlXG4gICAqIGVtcHR5IHdoZW4gdGhlIGVudiBoYXMgbm8gcGFyYW1ldGVycykuIFRoZSBkcm9wZG93bidzIGBvcHRpb25zQXJyYXkudW5zaGlmdGBcbiAgICogZmFsbGJhY2sgaW4gYGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnYCBlbnN1cmVzIHRoZSB2YWx1ZSByZW5kZXJzIGV2ZW4gd2hlblxuICAgKiBtaXNzaW5nIGZyb20gdGhlIG9wdGlvbiBsaXN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdEVudmlyb25tZW50TmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRjTmFtZSA9ICh0aGlzLnRlc3RDYXNlRW52aXJvbm1lbnROYW1lID8/ICcnKS50cmltKCk7XG4gICAgaWYgKHRjTmFtZSkge1xuICAgICAgcmV0dXJuIHRjTmFtZTtcbiAgICB9XG4gICAgY29uc3QgdW5pcXVlID0gdGhpcy5nZXRVbmlxdWVFbnZpcm9ubWVudHMoKTtcbiAgICByZXR1cm4gdW5pcXVlLmxlbmd0aCA9PT0gMSA/IHVuaXF1ZVswXS5uYW1lIDogJyc7XG4gIH1cblxuICAvKipcbiAgICogUHJvYWN0aXZlIGNvbXBhbmlvbiB0byBgcmVzb2x2ZURlZmF1bHRFbnZpcm9ubWVudE5hbWVgOiB3YWxrcyBldmVyeSBlbnYtdHlwZVxuICAgKiB0ZW1wbGF0ZSB2YXJpYWJsZSB0aGF0IGhhc24ndCBiZWVuIHNlZWRlZCB5ZXQgYW5kIHByZS1maWxscyBpdHNcbiAgICogYHNlbGVjdGVkRW52aXJvbm1lbnRgIChwbHVzIHRoZSBtYXRjaGluZyBmb3JtIGNvbnRyb2wpIHdpdGggdGhlIHRlc3QgY2FzZSdzXG4gICAqIGVudmlyb25tZW50LiBJZGVtcG90ZW50IOKAlCB2YXJpYWJsZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBzZWxlY3Rpb24gYXJlXG4gICAqIHNraXBwZWQuIENhbGxlZCBmcm9tIGBuZ09uQ2hhbmdlc2Agd2hlbmV2ZXIgdGhlIGlucHV0cyB0aGF0IGNvdWxkIHVubG9jayB0aGVcbiAgICogc2VlZCAoYHRlc3RDYXNlRW52aXJvbm1lbnROYW1lYCwgYGVudmlyb25tZW50T3B0aW9uc2AsIGB0ZW1wbGF0ZVZhcmlhYmxlc2ApXG4gICAqIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgc2VlZERlZmF1bHRFbnZpcm9ubWVudEZvclZhcmlhYmxlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRvID0gdGhpcy5yZXNvbHZlRGVmYXVsdEVudmlyb25tZW50TmFtZSgpO1xuICAgIGlmICghYXV0bykgeyByZXR1cm47IH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPz8gW10pIHtcbiAgICAgIGlmICghdGhpcy5pc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSkpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7IGNvbnRpbnVlOyB9XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gYXV0bztcbiAgICAgIGNvbnN0IGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5lbnZpcm9ubWVudCA9PT0gYXV0byk7XG4gICAgICBpZiAoZW52T3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGdycCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICBpZiAoZ3JwKSB7XG4gICAgICAgIGlmICghZ3JwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgZ3JwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woYXV0bykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdycC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSEuc2V0VmFsdWUoYXV0bywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X2Vudmlyb25tZW50YCk7XG4gICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X2VudlBhcmFtYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgZW52aXJvbm1lbnRzIGZyb20gZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKi9cbiAgZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZW52TWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZm9yRWFjaChlbnYgPT4ge1xuICAgICAgaWYgKCFlbnZNYXAuaGFzKGVudi5lbnZpcm9ubWVudCkpIHtcbiAgICAgICAgZW52TWFwLnNldChlbnYuZW52aXJvbm1lbnQsIHtcbiAgICAgICAgICBpZDogZW52LmVudmlyb25tZW50LFxuICAgICAgICAgIG5hbWU6IGVudi5lbnZpcm9ubWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnZNYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoZW52aXJvbm1lbnROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50T3B0aW9uc1xuICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudE5hbWUpXG4gICAgICAubWFwKGVudiA9PiAoe1xuICAgICAgICBpZDogZW52Lm5hbWUsXG4gICAgICAgIG5hbWU6IGVudi5uYW1lXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biAtIHNlbGVjdCBlbnZpcm9ubWVudClcbiAgICovXG4gIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2Vudmlyb25tZW50YDtcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHNcbiAgICBjb25zdCB1bmlxdWVFbnZpcm9ubWVudHMgPSB0aGlzLmdldFVuaXF1ZUVudmlyb25tZW50cygpO1xuICAgIGNvbnN0IGxhYmVsU3VmZml4ID0gKHRoaXMudGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4ID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVjb3JhdGVMYWJlbCA9IChlbnZOYW1lOiBzdHJpbmcpID0+IGxhYmVsU3VmZml4ID8gYCR7ZW52TmFtZX0gJHtsYWJlbFN1ZmZpeH1gIDogZW52TmFtZTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gdW5pcXVlRW52aXJvbm1lbnRzLm1hcChlbnYgPT4gKHtcbiAgICAgIGlkOiBlbnYuaWQsXG4gICAgICB2YWx1ZTogZW52Lm5hbWUsXG4gICAgICBuYW1lOiBlbnYubmFtZSxcbiAgICAgIGxhYmVsOiBkZWNvcmF0ZUxhYmVsKGVudi5uYW1lKVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVudmlyb25tZW50IGlzIGFsd2F5cyBwcmVzZW50IGluIHRoZSBvcHRpb25zXG4gICAgLy8gKGl0IG1heSBiZSBtaXNzaW5nIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWQgYnkgYSBzZWFyY2ggaW4gYW5vdGhlciB2YXJpYWJsZSdzIGRyb3Bkb3duKVxuICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ICYmICFvcHRpb25zQXJyYXkuc29tZShvID0+IG8udmFsdWUgPT09IHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpKSB7XG4gICAgICBvcHRpb25zQXJyYXkudW5zaGlmdCh7XG4gICAgICAgIGlkOiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50LFxuICAgICAgICB2YWx1ZTogdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCxcbiAgICAgICAgbmFtZTogdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCxcbiAgICAgICAgbGFiZWw6IGRlY29yYXRlTGFiZWwodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBlbnZpcm9ubWVudCBzZWxlY3Rpb24uIEF1dG8tZGVmYXVsdCB0byB0aGVcbiAgICAvLyB0ZXN0IGNhc2UncyBlbnYgd2hlbiB0aGUgdmFyaWFibGUgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBzZWxlY3Rpb24g4oCUIHRoZVxuICAgIC8vIGVudi1vbi10ZXN0LWNhc2UgY29udHJhY3QgbGVhdmVzIG5vdGhpbmcgdG8gY2hvb3NlIGJldHdlZW4uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgY29uc3QgYXV0b0RlZmF1bHQgPSB0aGlzLnJlc29sdmVEZWZhdWx0RW52aXJvbm1lbnROYW1lKCk7XG4gICAgY29uc3QgY3VycmVudEVudiA9IHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgfHwgYXV0b0RlZmF1bHQgfHwgJyc7XG4gICAgaWYgKGN1cnJlbnRFbnYgJiYgY3VycmVudEVudiAhPT0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IGN1cnJlbnRFbnY7XG4gICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IGN1cnJlbnRFbnYpO1xuICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICBjb25zdCBpZE1hdGNoID0gZW52T3B0aW9uLmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudEVudikpO1xuICAgIH0gZWxzZSBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgY29uc3QgY3RybCA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk7XG4gICAgICBpZiAoY3RybCAmJiAhY3RybC52YWx1ZSAmJiBjdXJyZW50RW52KSB7XG4gICAgICAgIGN0cmwuc2V0VmFsdWUoY3VycmVudEVudiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudi1vbi10ZXN0LWNhc2U6IHdoZW4gdGhlIHRlc3QgY2FzZSBpcyBib3VuZCB0byBhIHNwZWNpZmljIGVudmlyb25tZW50LFxuICAgIC8vIHRoZXJlIGlzIG5vIG90aGVyIHZhbGlkIGNob2ljZSDigJQgZGlzYWJsZSB0aGUgZHJvcGRvd24gc28gdGhlIHVzZXIgY2FuJ3RcbiAgICAvLyBhY2NpZGVudGFsbHkgcGljayBhIGRpZmZlcmVudCBlbnYuIEF1dG8tc2VsZWN0IGNvbnRpbnVlcyB0byBwb3B1bGF0ZSBpdC5cbiAgICAvLyB0ZXN0Q2FzZUVudmlyb25tZW50TGFiZWxTdWZmaXggaXMgc2V0IG9ubHkgd2hlbiB0aGUgcGFyZW50IGZvcmNlcyBhIHRpZXItM1xuICAgIC8vICh3b3Jrc3BhY2UgZGVmYXVsdCkgZmFsbGJhY2ssIHdoaWNoIGFsc28gaW1wbGllcyBsb2NrLlxuICAgIGNvbnN0IGxvY2tUb1Rlc3RDYXNlRW52ID0gISEodGhpcy50ZXN0Q2FzZUVudmlyb25tZW50TmFtZSA/PyAnJykudHJpbSgpIHx8ICEhbGFiZWxTdWZmaXg7XG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZEVudmlyb25tZW50JywgLy8gVXNlICdzZWxlY3RlZEVudmlyb25tZW50JyBhcyBrZXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0IEVudmlyb25tZW50YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6ICFsb2NrVG9UZXN0Q2FzZUVudixcbiAgICAgIHNlcnZlclNlYXJjaDogIWxvY2tUb1Rlc3RDYXNlRW52LFxuICAgICAgZGlzYWJsZWQ6IGxvY2tUb1Rlc3RDYXNlRW52LFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRW52aXJvbm1lbnRzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0Vudmlyb25tZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IHZhbHVlO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEIGZyb20gZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVudmlyb25tZW50IG9wdGlvbiB3aXRoIG1hdGNoaW5nIGVudmlyb25tZW50IG5hbWUgdG8gZ2V0IHRoZSBJRFxuICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IHZhbHVlKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBJRCBmcm9tIGVudk9wdGlvbi5pZCAoZm9ybWF0OiBcImVudi03NC10ZXN0XCIgLT4gNzQpXG4gICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU25hcHNob3QgdGhlIGVudmlyb25tZW50J3MgcGFyYW1ldGVycyBzbyB0aGV5IHN1cnZpdmUgaWYgYW5vdGhlciB2YXJpYWJsZSB0cmlnZ2VycyBhIHNlYXJjaFxuICAgICAgICBjb25zdCBlbnZQYXJhbXMgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maWx0ZXIoZW52ID0+IGVudi5lbnZpcm9ubWVudCA9PT0gdmFsdWUpO1xuICAgICAgICBpZiAoZW52UGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRPcHRpb25zU25hcHNob3Quc2V0KHZhcmlhYmxlLm5hbWUsIGVudlBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRFbnZpcm9ubWVudCBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgbmV3IGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUlcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmVFbnZpcm9ubWVudFNlYXJjaFZhcmlhYmxlID0gdmFyaWFibGUubmFtZTtcbiAgICAgICAgdGhpcy5zZWFyY2hFbnZpcm9ubWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBzZWxlY3QgcGFyYW1ldGVyIGZyb20gZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IHNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICAgIGlmICghc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBubyBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbnZpcm9ubWVudCBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZW52aXJvbm1lbnQuXG4gICAgLy8gSWYgbGl2ZSBlbnZpcm9ubWVudE9wdGlvbnMgd2VyZSBmaWx0ZXJlZCBieSBhbm90aGVyIHZhcmlhYmxlJ3Mgc2VhcmNoLCBmYWxsIGJhY2sgdG8gdGhlIHNuYXBzaG90LlxuICAgIGxldCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwICYmIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudE9wdGlvbnNTbmFwc2hvdC5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50T3B0aW9uc1NuYXBzaG90LmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgICBwYXJhbWV0ZXJzID0gc25hcHNob3RcbiAgICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBzZWxlY3RlZEVudmlyb25tZW50KVxuICAgICAgICAubWFwKGVudiA9PiAoeyBpZDogZW52Lm5hbWUsIG5hbWU6IGVudi5uYW1lIH0pKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYCp8JHtwYXJhbS5uYW1lfXxgLFxuICAgICAgdmFsdWU6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBQYXJhbWV0ZXJgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gV2hlbiBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQsIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGZvcm1hdCBpdFxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVudmlyb25tZW50IElEIGlzIGFscmVhZHkgc3RvcmVkIG9uIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0ga2VlcCByYXcgdmFsdWUgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gcmF3IHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IElEIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50SWQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnZpcm9ubWVudCBJRHMgZm9yIHZhcmlhYmxlcyB0aGF0IHVzZSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIFJldHVybnMgYSBtYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgZW52SWRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCkge1xuICAgICAgICBlbnZJZHMuc2V0KHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVudklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwbGFpbi10ZXh0XG4gICAqL1xuICBpc1BsYWluVGV4dFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwYXJhbWV0ZXJcbiAgICovXG4gIGlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBzZXQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXBcbiAgICAgID8gISEodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KVxuICAgICAgOiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgc2V0IChmcm9tIHRlc3QgY2FzZSlcbiAgICogSWYgdHJ1ZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4ICE9IG51bGxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhISh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBlbnZpcm9ubWVudFxuICAgKi9cbiAgaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFyaWFibGUgaXMgZWxlbWVudCB0eXBlIChkYXRhS2V5ID09PSAnZWxlbWVudCcpXG4gICAqL1xuICBpc0VsZW1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCBmb3IgYW4gZWxlbWVudCB2YXJpYWJsZVxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNlbGVjdGVkU2NyZWVuTmFtZSBvciBzY3JlZW5OYW1lSWQgaXMgc2V0IChhbmQgbm90IFwiTm9uZVwiKVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgc2NyZWVuTmFtZUlkIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBudW1iZXIgKG5vdCBudWxsL3VuZGVmaW5lZClcbiAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkICE9IG51bGwgJiYgdHlwZW9mIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogY2hlY2sgc2VsZWN0ZWRTY3JlZW5OYW1lXG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBzY3JlZW4gbmFtZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICAgKi9cbiAgZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gSW5jbHVkZSBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gbG9hZGluZyBjb21wbGV0ZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3NjcmVlbk5hbWVfJHt0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzfWA7XG4gICAgaWYgKHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvcHRpb25zOiBpbmNsdWRlIGEgXCJOb25lXCIgb3B0aW9uIChkaXNwbGF5ZWQgYXMgXCJTZWxlY3RcIikgcGx1cyBzY3JlZW5OYW1lT3B0aW9ucyBmcm9tIEFQSVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnbm9uZScsXG4gICAgICAgIHZhbHVlOiAnU2VsZWN0JyxcbiAgICAgICAgbmFtZTogJ05vbmUnLFxuICAgICAgICBsYWJlbDogJ05vbmUnXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5tYXAoc2NyZWVuTmFtZSA9PiAoe1xuICAgICAgICBpZDogc2NyZWVuTmFtZS5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbmFtZTogc2NyZWVuTmFtZS5uYW1lLFxuICAgICAgICBsYWJlbDogc2NyZWVuTmFtZS5uYW1lXG4gICAgICB9KSlcbiAgICBdO1xuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBzY3JlZW4gbmFtZSBzZWxlY3Rpb25cbiAgICAvLyBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAvLyBDb21wYXJlIGFzIHN0cmluZ3MgdG8gaGFuZGxlIGJvdGggbnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHNjcmVlbk5hbWVJZCwgZW5zdXJlIGZvcm0gY29udHJvbCBpcyAnbm9uZScgKGZvciBcIk5vbmVcIiBzZWxlY3Rpb24gYnkgZGVmYXVsdClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09ICdub25lJyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSWYgXCJOb25lXCIgaXMgc2VsZWN0ZWQgKHZhbHVlIGlzICdub25lJyBzdHJpbmcgb3IgbnVsbCksIGNsZWFyIHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50IGluZm9cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICdub25lJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudGApKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkU2NyZWVuTmFtZSB0byAnbm9uZScgdG8gc2hvdyBcIk5vbmVcIiBpcyBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IElEIGZvcm0gY29udHJvbCB0byBlbnN1cmUgZWxlbWVudElkIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBzdG9wIChubyBlbGVtZW50IGZldGNoIHdoZW4gTm9uZSlcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWx1ZSBpcyB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXIgZm9yIHNjcmVlbk5hbWVJZCBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZE51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICdub25lJyA/IHBhcnNlSW50KHZhbHVlLCAxMCkgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogbnVsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyZWVuTmFtZUlkTnVtICYmICFpc05hTihzY3JlZW5OYW1lSWROdW0pKSB7XG4gICAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNjcmVlbk5hbWVJZE51bTtcblxuICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVPcHRpb24gPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHNjcmVlbk5hbWVJZE51bSk7XG4gICAgICAgICAgaWYgKHNjcmVlbk5hbWVPcHRpb24pIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIG5vdCBmb3VuZCwgc3RpbGwgc2V0IHRoZSBJRCBidXQgY2xlYXIgdGhlIG5hbWVcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgZWxlbWVudCBzZWxlY3Rpb24gd2hlbiBzY3JlZW4gbmFtZSBjaGFuZ2VzXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIChhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkKVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzY3JlZW5OYW1lSWROdW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBzY3JlZW4gbmFtZVxuICAgICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCh7XG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCxcbiAgICAgICAgICAgIHNlYXJjaFRlcm06ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZSAtIGNsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZWxlbWVudE9wdGlvbnMgaW5wdXQgY2hhbmdlc1xuICAgICAgICAvLyB2aWEgbmdPbkNoYW5nZXMsIHdoaWNoIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGFuZCB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uXG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgnJyk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU2NyZWVuTmFtZS5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVsZW1lbnQgZHJvcGRvd24gKHNlY29uZCBkcm9wZG93biAtIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICAgKiBPcHRpbWl6ZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIGdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCBzY3JlZW4gbmFtZSBJRFxuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlLlxuICAgIC8vIEV4Y2x1ZGUgaXNMb2FkaW5nRWxlbWVudHMgc28gdGhlIGRyb3Bkb3duL3NlYXJjaCBpbnB1dCBkb2VzIG5vdCByZS1pbml0aWFsaXplIGV2ZXJ5IGtleXN0cm9rZS5cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRfJHtzZWxlY3RlZFNjcmVlbk5hbWVJZCB8fCAnJ31fJHt0aGlzLmVsZW1lbnRPcHRpb25zLmxlbmd0aH1gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzY3JlZW4gbmFtZSBmcm9tIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzY3JlZW4gbmFtZSBkcm9wZG93biBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3Rpb25cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmluZCBhbmQgc3RvcmUgc2NyZWVuIG5hbWUgbmFtZSBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmluZCBhbmQgcGF0Y2ggdGhlIHNlbGVjdG9yIHZhcmlhYmxlIHdpdGggZGF0YUtleSAnbm90X2ZvdW5kJ1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQoXG4gICAgICAgICAgICB2ID0+IHYubmFtZSA9PT0gJ3NlbGVjdG9yJyAmJiB2LmRhdGFLZXkgPT09ICdub3RfZm91bmQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZSAmJiBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBzZWxlY3RvciB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JWYXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cChzZWxlY3RvclZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdG9yIHZhcmlhYmxlJ3MgdmFsdWUgd2l0aCB0aGUgZWxlbWVudCBsb2NhdG9yXG4gICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGUudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogaWYgZWxlbWVudCBub3QgZm91bmQsIGp1c3Qgc2V0IHRoZSB2YWx1ZVxuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIGlmIGVsZW1lbnQgaGFzIGEgc2NyZWVuIG5hbWVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcmVlbiBuYW1lIElEIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPHN0eWxlPlxuICAuY2FwaXRhbGl6ZS1maXJzdDo6Zmlyc3QtbGV0dGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG48L3N0eWxlPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gVGV4dGFyZWEgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAndGV4dGFyZWEnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMCBjcWEtcm91bmRlZC1sZyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTkwMCBjcWEtcmVzaXplLXkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtcmluZy0xIGZvY3VzOmNxYS1yaW5nLWluZGlnby01MDAgZm9jdXM6Y3FhLWJvcmRlci1pbmRpZ28tNTAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwidmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgIHJvd3M9XCI0XCJcbiAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQycHg7XCJcbiAgICAgICAgICAoaW5wdXQpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbnZpcm9ubWVudC1uYW1lIGRyb3Bkb3duIChzeW50aGV0aWMgdmFyIGluamVjdGVkIGZvciBBSSBBc2sgLyBBSSBWZXJpZnkgb25seSkuXG4gICAgICAgICBIaWRkZW4gdW5kZXIgVGllciAxICh0ZXN0Q2FzZS5lbnZpcm9ubWVudElkIHNldCkg4oCUIGJhbm5lciBhYm92ZSBhbHJlYWR5IG5hbWVzIHRoZSBlbnYuXG4gICAgICAgICBUaWVyIDIgKGxlZ2FjeSBzdGVwIGVudik6IHZpc2libGUgKyBlZGl0YWJsZSArIGRlcHJlY2F0aW9uIG5vdGUuXG4gICAgICAgICBUaWVyIDMgKHdvcmtzcGFjZSBkZWZhdWx0KTogdmlzaWJsZSArIGxvY2tlZCArICcoZGVmYXVsdCknIHN1ZmZpeCBvbiBvcHRpb24gbGFiZWxzICsgZGVwcmVjYXRpb24gbm90ZS4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW52aXJvbm1lbnROYW1lVHlwZSh2YXJpYWJsZSkgJiYgIWhpZGVFbnZpcm9ubWVudE5hbWVGaWVsZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVudmlyb25tZW50TmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZSlcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxwICpuZ0lmPVwiZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1pdGFsaWMgY3FhLXRleHQtYW1iZXItNjAwIGNxYS1tdC0xIGNxYS1tYi0wXCJcbiAgICAgICAgICAgW2lubmVySFRNTF09XCJlbnZpcm9ubWVudExlZ2FjeURlcHJlY2F0aW9uTWVzc2FnZVwiPjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBOdW1iZXIgdmFyaWFibGVzIHdpdGggbnVtYmVyIGlucHV0IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnbnVtYmVyJyAmJiB2YXJpYWJsZS5kYXRhS2V5ICE9PSAnZWxlbWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt0eXBlXT1cIidudW1iZXInXCIgW3BsYWNlaG9sZGVyXT1cIidOdW1iZXIgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vbi1ib29sZWFuLCBub24tY3VzdG9tX2NvZGUgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnICYmIHZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnZHJvcGRvd24nICYmIHZhcmlhYmxlLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdmFyaWFibGUudHlwZSAhPT0gJ2Vudmlyb25tZW50LW5hbWUnICYmICEodmFyaWFibGUudHlwZSA9PT0gJ251bWJlcicgJiYgdmFyaWFibGUuZGF0YUtleSAhPT0gJ2VsZW1lbnQnKVwiPlxuICAgICAgPCEtLSBFbGVtZW50IHZhcmlhYmxlcyB3aXRoIGNhc2NhZGluZyBkcm9wZG93bnMgKHNjcmVlbiBuYW1lICsgZWxlbWVudCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbGVtZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19IFNjcmVlbiBOYW1lPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkU2NyZWVuTmFtZSh2YXJpYWJsZSk7IGVsc2UgZWxlbWVudE1hbnVhbElucHV0XCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RWxlbWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxlbWVudE1hbnVhbElucHV0PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnbnVtYmVyJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdHlwZV09XCInbnVtYmVyJ1wiIFtwbGFjZWhvbGRlcl09XCInTnVtYmVyIElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlICE9PSAnbnVtYmVyJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFbGVtZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgIDwhLS0gT3RoZXIgZHJvcGRvd24gdmFyaWFibGVzICh0eXBlLCBzY3JvbGxUbywgbGFiZWwpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgZGVmYXVsdElucHV0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0PlxuICAgICAgICA8IS0tIFRlc3QtZGF0YSwgc291cmNlLXZhbHVlLCBvciB0YXJnZXQtdmFsdWUgd2l0aCBWYWx1ZSBTb3VyY2Ugc2VnbWVudCBzdHJpcCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgcmVndWxhcklucHV0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICBWYWx1ZSBTb3VyY2U8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzRWRpdEluRGVwdGhcIlxuICAgICAgICAgICAgICBbc2VnbWVudHNdPVwidmlzaWJsZURhdGFUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnXCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRGF0YVR5cGVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGFueSgkZXZlbnQpKVwiPlxuICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAqbmdJZj1cImlzRWRpdEluRGVwdGhcIlxuICAgICAgICAgICAgICBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSkgJiYgIWhpZGVFbnZpcm9ubWVudE5hbWVGaWVsZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBOYW1lPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDxwICpuZ0lmPVwiZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtaXRhbGljIGNxYS10ZXh0LWFtYmVyLTYwMCBjcWEtbXQtMSBjcWEtbWItMFwiXG4gICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImVudmlyb25tZW50TGVnYWN5RGVwcmVjYXRpb25NZXNzYWdlXCI+PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW3N0eWxlLmhlaWdodF09XCInZml0LWNvbnRlbnQnXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYWx1ZTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzR2xvYmFsVHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBHbG9iYWwgRGF0YTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRHbG9iYWxWYXJpYWJsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIFRlc3QgRGF0YSBQcm9maWxlPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSkgJiYgIWlzSW5zaWRlRm9yTG9vcFN0ZXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIERhdGEgU2V0PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUodmFyaWFibGUpICYmIGlzSW5zaWRlRm9yTG9vcFN0ZXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIERhdGEgU2V0IFN0YXJ0PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFTZXRSYW5nZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSwgJ3N0YXJ0JylcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSkgJiYgaXNJbnNpZGVGb3JMb29wU3RlcFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXQgRW5kPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFTZXRSYW5nZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSwgJ2VuZCcpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWREYXRhU2V0KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB8IGNxYUNhbWVsVG9UaXRsZSB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1BsYWluVGV4dFR5cGUodmFyaWFibGUpIHx8IGlzUnVudGltZVR5cGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xICBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIHwgY3FhQ2FtZWxUb1RpdGxlIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlKTsgZWxzZSBydW50aW1lUGxhaW5JbnB1dFwiPlxuICAgICAgICAgICAgICA8Y3FhLW1peGVkLXZhcmlhYmxlLWlucHV0XG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFJhd1ZhbHVlKHZhcmlhYmxlKVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAodmFsaWRpdHlDaGFuZ2UpPVwib25UZXN0RGF0YVZhbGlkaXR5Q2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtbWl4ZWQtdmFyaWFibGUtaW5wdXQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcnVudGltZVBsYWluSW5wdXQ+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwiZ2V0UmF3VmFsdWUodmFyaWFibGUpXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcklucHV0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfCBjcWFDYW1lbFRvVGl0bGUgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgPGNxYS1lbGVtZW50LWZvcm1cbiAgICBbaXNDcmVhdGVNb2RlXT1cInRydWVcIlxuICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgW2lzRWRpdEluRGVwdGhBdmFpbGFibGVdPVwiZmFsc2VcIlxuICAgIChjcmVhdGVFbGVtZW50KT1cIm9uQ3JlYXRlRWxlbWVudCgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsRWxlbWVudEZvcm0oKVwiXG4gICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCI+XG4gIDwvY3FhLWVsZW1lbnQtZm9ybT5cbjwvZGl2PiJdfQ==