@1money/component-ui 0.0.74 → 0.0.76

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 (81) hide show
  1. package/es/components/Dialog/Dialog.js +7 -39
  2. package/es/components/Dialog/constants.d.ts +0 -3
  3. package/es/components/Dialog/constants.js +1 -4
  4. package/es/components/Dialog/style/Dialog.css +0 -21
  5. package/es/components/ProForm/ProForm.js +46 -33
  6. package/es/components/ProForm/ProFormDependency.js +6 -16
  7. package/es/components/ProForm/ProFormItem.js +5 -7
  8. package/es/components/ProForm/ProFormList.js +112 -40
  9. package/es/components/ProForm/core/constants.d.ts +2 -0
  10. package/es/components/ProForm/core/constants.js +7 -1
  11. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  12. package/es/components/ProForm/core/devWarning.js +22 -0
  13. package/es/components/ProForm/core/formStore.d.ts +10 -2
  14. package/es/components/ProForm/core/formStore.js +21 -2
  15. package/es/components/ProForm/core/hooks/useForm.js +246 -103
  16. package/es/components/ProForm/core/hooks/useFormCore.js +134 -28
  17. package/es/components/ProForm/core/interface.d.ts +124 -49
  18. package/es/components/ProForm/core/runRules.d.ts +44 -12
  19. package/es/components/ProForm/core/runRules.js +584 -133
  20. package/es/components/ProForm/core/useFormItem.d.ts +6 -7
  21. package/es/components/ProForm/core/useFormItem.js +44 -22
  22. package/es/components/ProForm/core/validationError.d.ts +13 -0
  23. package/es/components/ProForm/core/validationError.js +29 -0
  24. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  25. package/es/components/ProForm/fields/ProFormFieldSet.js +51 -12
  26. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  27. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  28. package/es/components/ProForm/fields/createProFormField.js +18 -25
  29. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  30. package/es/components/ProForm/index.d.ts +2 -1
  31. package/es/components/ProForm/index.js +4 -1
  32. package/es/components/ProForm/interface.d.ts +31 -40
  33. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  34. package/es/components/ProForm/style/ProForm.css +0 -1
  35. package/es/components/ProForm/utils.d.ts +8 -0
  36. package/es/components/ProForm/utils.js +51 -3
  37. package/es/components/Table/core/useTableSetup.js +2 -2
  38. package/es/components/Table/interface.d.ts +1 -1
  39. package/es/index.css +1 -1
  40. package/lib/components/Dialog/Dialog.js +6 -38
  41. package/lib/components/Dialog/constants.d.ts +0 -3
  42. package/lib/components/Dialog/constants.js +1 -4
  43. package/lib/components/Dialog/style/Dialog.css +0 -21
  44. package/lib/components/ProForm/ProForm.js +45 -32
  45. package/lib/components/ProForm/ProFormDependency.js +5 -15
  46. package/lib/components/ProForm/ProFormItem.js +5 -7
  47. package/lib/components/ProForm/ProFormList.js +110 -38
  48. package/lib/components/ProForm/core/constants.d.ts +2 -0
  49. package/lib/components/ProForm/core/constants.js +8 -2
  50. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  51. package/lib/components/ProForm/core/devWarning.js +29 -0
  52. package/lib/components/ProForm/core/formStore.d.ts +10 -2
  53. package/lib/components/ProForm/core/formStore.js +23 -2
  54. package/lib/components/ProForm/core/hooks/useForm.js +242 -99
  55. package/lib/components/ProForm/core/hooks/useFormCore.js +133 -27
  56. package/lib/components/ProForm/core/interface.d.ts +124 -49
  57. package/lib/components/ProForm/core/runRules.d.ts +44 -12
  58. package/lib/components/ProForm/core/runRules.js +587 -133
  59. package/lib/components/ProForm/core/useFormItem.d.ts +6 -7
  60. package/lib/components/ProForm/core/useFormItem.js +43 -21
  61. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  62. package/lib/components/ProForm/core/validationError.js +36 -0
  63. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  64. package/lib/components/ProForm/fields/ProFormFieldSet.js +51 -12
  65. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  66. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  67. package/lib/components/ProForm/fields/createProFormField.js +18 -25
  68. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  69. package/lib/components/ProForm/index.d.ts +2 -1
  70. package/lib/components/ProForm/index.js +10 -1
  71. package/lib/components/ProForm/interface.d.ts +31 -40
  72. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  73. package/lib/components/ProForm/style/ProForm.css +0 -1
  74. package/lib/components/ProForm/utils.d.ts +8 -0
  75. package/lib/components/ProForm/utils.js +52 -3
  76. package/lib/components/Table/core/useTableSetup.js +2 -2
  77. package/lib/components/Table/interface.d.ts +1 -1
  78. package/lib/index.css +1 -1
  79. package/package.json +1 -1
  80. package/scripts/mcp-server/examples.generated.json +42 -36
  81. package/scripts/mcp-server/index.generated.json +23 -67
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.useFormCore = exports["default"] = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
8
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _react = require("react");
10
11
  var _useEventCallback = _interopRequireDefault(require("@1money/hooks/useEventCallback"));
@@ -26,10 +27,6 @@ var useFormCore = exports.useFormCore = function useFormCore() {
26
27
  labelAlign = _config$labelAlign === void 0 ? 'left' : _config$labelAlign,
27
28
  _config$disabled = config.disabled,
28
29
  disabled = _config$disabled === void 0 ? false : _config$disabled,
29
- _config$colon = config.colon,
30
- colon = _config$colon === void 0 ? true : _config$colon,
31
- _config$requiredMark = config.requiredMark,
32
- requiredMark = _config$requiredMark === void 0 ? true : _config$requiredMark,
33
30
  _config$validateTrigg = config.validateTrigger,
34
31
  validateTrigger = _config$validateTrigg === void 0 ? 'onChange' : _config$validateTrigg;
35
32
  // initialValues is MOUNT-ONLY (the documented contract): freeze the first
@@ -55,26 +52,57 @@ var useFormCore = exports.useFormCore = function useFormCore() {
55
52
  // not trigger renders, and submit-time validation must always read the latest
56
53
  // rules (they can change between renders, e.g. a conditional `required`).
57
54
  var fieldRulesRef = (0, _react.useRef)({});
55
+ // Per-field validation run epochs. EVERY validation run (sync or async)
56
+ // bumps its field's epoch; an async run re-checks its captured epoch at
57
+ // settle time and discards a STALE outcome — the same protection as
58
+ // rc-field-form's validatePromise identity check. Without it, a slow async
59
+ // validator (e.g. a server-side uniqueness check started on blur) could
60
+ // settle after the user already fixed the value and stamp a stale error
61
+ // over a newer, passing result.
62
+ var validationEpochRef = (0, _react.useRef)({});
63
+ var beginValidationRun = (0, _useMemoizedFn["default"])(function (name) {
64
+ var next = (validationEpochRef.current[name] || 0) + 1;
65
+ validationEpochRef.current[name] = next;
66
+ return next;
67
+ });
68
+ var isValidationRunCurrent = (0, _useMemoizedFn["default"])(function (name, epoch) {
69
+ return validationEpochRef.current[name] === epoch;
70
+ });
71
+ // Bump (never delete — deletion would let a new run re-issue an old epoch
72
+ // number and collide with a still-in-flight pre-reset run).
73
+ var invalidateValidationRuns = (0, _useMemoizedFn["default"])(function (names) {
74
+ var keys = names !== null && names !== void 0 ? names : Object.keys(validationEpochRef.current);
75
+ keys.forEach(function (key) {
76
+ if (validationEpochRef.current[key] !== undefined) {
77
+ validationEpochRef.current[key] += 1;
78
+ }
79
+ });
80
+ });
81
+ // Instance handed to function-form rules. Defaults to the core methods
82
+ // (assigned at the end of this hook body); useForm upgrades it to the FULL
83
+ // form instance once it has built one, so rules see the same context on
84
+ // every path (interactive, blur, submit).
85
+ var ruleContextInstanceRef = (0, _react.useRef)({});
86
+ var setRuleContextInstance = (0, _useMemoizedFn["default"])(function (instance) {
87
+ ruleContextInstanceRef.current = instance;
88
+ });
89
+ var getRuleContextInstance = (0, _useMemoizedFn["default"])(function () {
90
+ return ruleContextInstanceRef.current;
91
+ });
58
92
  var commitValues = (0, _useMemoizedFn["default"])(function (newValues) {
59
93
  store.setState({
60
94
  values: newValues
61
95
  });
62
96
  });
97
+ // NOTE: setting a value does NOT touch the field's error — errors are
98
+ // cleared exclusively by validation runs (whose timing follows the
99
+ // validateTrigger config), so an onBlur-only field keeps its error while
100
+ // the user is still typing.
63
101
  var setFieldValue = (0, _useMemoizedFn["default"])(function (name, value) {
64
102
  var prev = store.getState().values;
65
103
  var newValues = name.includes('.') ? (0, _pathUtils.setNestedValue)(prev, name, value) : Object.assign(Object.assign({}, prev), (0, _defineProperty2["default"])({}, name, value));
66
104
  commitValues(newValues);
67
105
  onValuesChange === null || onValuesChange === void 0 ? void 0 : onValuesChange((0, _defineProperty2["default"])({}, name, value), newValues);
68
- if (value !== '' && value !== null && value !== undefined) {
69
- var errors = store.getState().errors;
70
- if (errors[name]) {
71
- var newErrors = Object.assign({}, errors);
72
- delete newErrors[name];
73
- store.setState({
74
- errors: newErrors
75
- });
76
- }
77
- }
78
106
  });
79
107
  var setFieldError = (0, _useMemoizedFn["default"])(function (name, error) {
80
108
  var errors = store.getState().errors;
@@ -87,7 +115,7 @@ var useFormCore = exports.useFormCore = function useFormCore() {
87
115
  });
88
116
  return;
89
117
  }
90
- if (errors[name] === error) return;
118
+ if ((0, _formStore.sameValidationNode)(errors[name], error)) return;
91
119
  store.setState({
92
120
  errors: Object.assign(Object.assign({}, errors), (0, _defineProperty2["default"])({}, name, error))
93
121
  });
@@ -103,26 +131,58 @@ var useFormCore = exports.useFormCore = function useFormCore() {
103
131
  });
104
132
  return;
105
133
  }
106
- if (warnings[name] === warning) return;
134
+ if ((0, _formStore.sameValidationNode)(warnings[name], warning)) return;
107
135
  store.setState({
108
136
  warnings: Object.assign(Object.assign({}, warnings), (0, _defineProperty2["default"])({}, name, warning))
109
137
  });
110
138
  });
139
+ // Mounted-instance counts per field name, plus whether the CURRENT rules
140
+ // registration was made by a counted instance. Rules are removed only when
141
+ // the LAST mounted instance for a name releases: with two same-name fields
142
+ // mounted, the first unmount must not wipe the registration while the
143
+ // survivor (possibly memo-bailed, so not re-rendering to re-register) still
144
+ // relies on it for submit-time validation. A MANUAL registerField (no
145
+ // mounted holder, owned=false) survives the unmount of piggybacking
146
+ // instances that never registered rules themselves.
147
+ // NOTE: callers must retain BEFORE registering (retain effect declared
148
+ // first), or the registration is misclassified as manual and leaks.
149
+ var fieldMountCountsRef = (0, _react.useRef)({});
150
+ var fieldRegistrationOwnedRef = (0, _react.useRef)({});
111
151
  var registerField = (0, _useMemoizedFn["default"])(function (name, rules) {
112
152
  fieldRulesRef.current[name] = rules;
153
+ fieldRegistrationOwnedRef.current[name] = (fieldMountCountsRef.current[name] || 0) > 0;
113
154
  });
114
155
  var getFieldRules = (0, _useMemoizedFn["default"])(function (name) {
115
156
  return fieldRulesRef.current[name];
116
157
  });
117
158
  var unregisterField = (0, _useMemoizedFn["default"])(function (name) {
118
159
  delete fieldRulesRef.current[name];
160
+ delete fieldRegistrationOwnedRef.current[name];
161
+ });
162
+ var retainField = (0, _useMemoizedFn["default"])(function (name) {
163
+ fieldMountCountsRef.current[name] = (fieldMountCountsRef.current[name] || 0) + 1;
164
+ });
165
+ var releaseField = (0, _useMemoizedFn["default"])(function (name) {
166
+ var count = (fieldMountCountsRef.current[name] || 0) - 1;
167
+ if (count <= 0) {
168
+ delete fieldMountCountsRef.current[name];
169
+ if (fieldRegistrationOwnedRef.current[name]) {
170
+ delete fieldRulesRef.current[name];
171
+ delete fieldRegistrationOwnedRef.current[name];
172
+ }
173
+ } else {
174
+ fieldMountCountsRef.current[name] = count;
175
+ }
119
176
  });
120
177
  var validateField = (0, _useMemoizedFn["default"])(function (name) {
121
178
  var rules = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
122
179
  var providedValue = arguments.length > 2 ? arguments[2] : undefined;
180
+ // A sync run commits immediately, so it is always current — bumping the
181
+ // epoch here SUPERSEDES any in-flight async run for this field.
182
+ beginValidationRun(name);
123
183
  var currentValues = store.getState().values;
124
184
  var value = providedValue !== undefined ? providedValue : (0, _pathUtils.resolveValue)(currentValues, name);
125
- var _runRulesSync = (0, _runRules.runRulesSync)(name, value, currentValues, rules),
185
+ var _runRulesSync = (0, _runRules.runRulesSync)(name, value, currentValues, rules, ruleContextInstanceRef.current),
126
186
  error = _runRulesSync.error,
127
187
  warning = _runRulesSync.warning;
128
188
  setFieldWarning(name, warning);
@@ -147,22 +207,32 @@ var useFormCore = exports.useFormCore = function useFormCore() {
147
207
  return isValid;
148
208
  });
149
209
  var handleSubmitInternal = (0, _useMemoizedFn["default"])(function () {
150
- var currentValues = store.getState().values;
210
+ var state = store.getState();
211
+ var currentValues = state.values;
151
212
  var currentRules = fieldRulesRef.current;
152
213
  var hasErrors = false;
153
- var newErrors = {};
154
- var newWarnings = {};
214
+ var failedErrors = {};
215
+ // MERGE over the current maps: only fields in the rule registry are
216
+ // re-decided — a manually-set error on a field without rules survives.
217
+ var newErrors = Object.assign({}, state.errors);
218
+ var newWarnings = Object.assign({}, state.warnings);
155
219
  Object.keys(currentRules).forEach(function (fieldName) {
220
+ beginValidationRun(fieldName);
156
221
  var value = (0, _pathUtils.resolveValue)(currentValues, fieldName);
157
- var _runRulesSync2 = (0, _runRules.runRulesSync)(fieldName, value, currentValues, currentRules[fieldName]),
222
+ var _runRulesSync2 = (0, _runRules.runRulesSync)(fieldName, value, currentValues, currentRules[fieldName], ruleContextInstanceRef.current),
158
223
  error = _runRulesSync2.error,
159
224
  warning = _runRulesSync2.warning;
160
225
  if (error !== null) {
161
226
  newErrors[fieldName] = error;
227
+ failedErrors[fieldName] = error;
162
228
  hasErrors = true;
229
+ } else {
230
+ delete newErrors[fieldName];
163
231
  }
164
232
  if (warning !== null) {
165
233
  newWarnings[fieldName] = warning;
234
+ } else {
235
+ delete newWarnings[fieldName];
166
236
  }
167
237
  });
168
238
  store.setState({
@@ -178,11 +248,11 @@ var useFormCore = exports.useFormCore = function useFormCore() {
178
248
  } else {
179
249
  onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
180
250
  values: currentValues,
181
- errors: newErrors
251
+ errors: failedErrors
182
252
  });
183
253
  return {
184
254
  success: false,
185
- errors: newErrors
255
+ errors: failedErrors
186
256
  };
187
257
  }
188
258
  });
@@ -194,6 +264,9 @@ var useFormCore = exports.useFormCore = function useFormCore() {
194
264
  // never fires onReset. The callback belongs to the reset ACTION layer
195
265
  // (submitter button / native reset event), which fires it exactly once.
196
266
  var resetFields = (0, _useMemoizedFn["default"])(function () {
267
+ // Invalidate in-flight async validation runs — their results belong to
268
+ // pre-reset values and must not stamp errors onto the reset form.
269
+ invalidateValidationRuns();
197
270
  store.setState({
198
271
  values: mountInitialValues,
199
272
  errors: {},
@@ -214,10 +287,38 @@ var useFormCore = exports.useFormCore = function useFormCore() {
214
287
  return store.getState().values;
215
288
  });
216
289
  var setFieldsValue = (0, _useMemoizedFn["default"])(function (newValues) {
217
- var updatedValues = Object.assign(Object.assign({}, store.getState().values), newValues);
290
+ var prev = store.getState().values;
291
+ var updatedValues;
292
+ if (Object.keys(newValues).some(function (key) {
293
+ return key.includes('.');
294
+ })) {
295
+ // Dot-path keys write into the NESTED structure (the setFieldValue
296
+ // contract) — a shallow merge would land them as literal top-level
297
+ // keys that the nested-aware readers never find.
298
+ updatedValues = prev;
299
+ for (var _i = 0, _Object$entries = Object.entries(newValues); _i < _Object$entries.length; _i++) {
300
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
301
+ key = _Object$entries$_i[0],
302
+ value = _Object$entries$_i[1];
303
+ updatedValues = key.includes('.') ? (0, _pathUtils.setNestedValue)(updatedValues, key, value) : Object.assign(Object.assign({}, updatedValues), (0, _defineProperty2["default"])({}, key, value));
304
+ }
305
+ } else {
306
+ updatedValues = Object.assign(Object.assign({}, prev), newValues);
307
+ }
218
308
  commitValues(updatedValues);
219
309
  onValuesChange === null || onValuesChange === void 0 ? void 0 : onValuesChange(newValues, updatedValues);
220
310
  });
311
+ // Seed the rule-context instance with the core methods exactly once —
312
+ // useForm's richer instance must not be downgraded on later renders.
313
+ if (Object.keys(ruleContextInstanceRef.current).length === 0) {
314
+ ruleContextInstanceRef.current = {
315
+ getFieldValue: getFieldValue,
316
+ getFieldsValue: getFieldsValue,
317
+ setFieldValue: setFieldValue,
318
+ setFieldsValue: setFieldsValue,
319
+ resetFields: resetFields
320
+ };
321
+ }
221
322
  var formInstance = (0, _react.useMemo)(function () {
222
323
  return {
223
324
  submit: handleSubmitInternal,
@@ -247,8 +348,6 @@ var useFormCore = exports.useFormCore = function useFormCore() {
247
348
  size: size,
248
349
  labelAlign: labelAlign,
249
350
  disabled: disabled,
250
- colon: colon,
251
- requiredMark: requiredMark,
252
351
  validateTrigger: validateTrigger
253
352
  };
254
353
  return {
@@ -259,6 +358,11 @@ var useFormCore = exports.useFormCore = function useFormCore() {
259
358
  // Live registry — stable identity, mutated in place by register/unregister.
260
359
  fieldRules: fieldRulesRef.current,
261
360
  getFieldRules: getFieldRules,
361
+ getRuleContextInstance: getRuleContextInstance,
362
+ setRuleContextInstance: setRuleContextInstance,
363
+ beginValidationRun: beginValidationRun,
364
+ isValidationRunCurrent: isValidationRunCurrent,
365
+ invalidateValidationRuns: invalidateValidationRuns,
262
366
  setFieldValue: setFieldValue,
263
367
  setFieldError: setFieldError,
264
368
  setFieldWarning: setFieldWarning,
@@ -269,6 +373,8 @@ var useFormCore = exports.useFormCore = function useFormCore() {
269
373
  validateFields: validateFields,
270
374
  registerField: registerField,
271
375
  unregisterField: unregisterField,
376
+ retainField: retainField,
377
+ releaseField: releaseField,
272
378
  handleSubmit: handleSubmit,
273
379
  handleReset: handleReset,
274
380
  resetFields: resetFields,
@@ -281,4 +387,4 @@ var useFormCore = exports.useFormCore = function useFormCore() {
281
387
  };
282
388
  };
283
389
  var _default = exports["default"] = useFormCore;
284
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtQ29yZS50cyIsImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIl0sIm5hbWVzIjpbIl9yZWFjdCIsInJlcXVpcmUiLCJfdXNlRXZlbnRDYWxsYmFjayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXNlTWVtb2l6ZWRGbiIsIl9wYXRoVXRpbHMiLCJfcnVuUnVsZXMiLCJfZm9ybVN0b3JlIiwidXNlRm9ybUNvcmUiLCJleHBvcnRzIiwiY29uZmlnIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX2NvbmZpZyRpbml0aWFsVmFsdWVzIiwiaW5pdGlhbFZhbHVlcyIsIm9uRmluaXNoIiwib25GaW5pc2hGYWlsZWQiLCJvblZhbHVlc0NoYW5nZSIsIm9uUmVzZXQiLCJfY29uZmlnJHNpemUiLCJzaXplIiwiX2NvbmZpZyRsYWJlbEFsaWduIiwibGFiZWxBbGlnbiIsIl9jb25maWckZGlzYWJsZWQiLCJkaXNhYmxlZCIsIl9jb25maWckY29sb24iLCJjb2xvbiIsIl9jb25maWckcmVxdWlyZWRNYXJrIiwicmVxdWlyZWRNYXJrIiwiX2NvbmZpZyR2YWxpZGF0ZVRyaWdnIiwidmFsaWRhdGVUcmlnZ2VyIiwiaW5pdGlhbFZhbHVlc1JlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJtb3VudEluaXRpYWxWYWx1ZXMiLCJzdG9yZVJlZiIsImNyZWF0ZUZvcm1TdG9yZSIsInN0b3JlIiwiZmllbGRSdWxlc1JlZiIsImNvbW1pdFZhbHVlcyIsInVzZU1lbW9pemVkRm4iLCJuZXdWYWx1ZXMiLCJzZXRTdGF0ZSIsInZhbHVlcyIsInNldEZpZWxkVmFsdWUiLCJuYW1lIiwidmFsdWUiLCJwcmV2IiwiZ2V0U3RhdGUiLCJpbmNsdWRlcyIsInNldE5lc3RlZFZhbHVlIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmluZVByb3BlcnR5MiIsImVycm9ycyIsIm5ld0Vycm9ycyIsInNldEZpZWxkRXJyb3IiLCJlcnJvciIsInNldEZpZWxkV2FybmluZyIsIndhcm5pbmciLCJ3YXJuaW5ncyIsIm5ld1dhcm5pbmdzIiwicmVnaXN0ZXJGaWVsZCIsInJ1bGVzIiwiZ2V0RmllbGRSdWxlcyIsInVucmVnaXN0ZXJGaWVsZCIsInZhbGlkYXRlRmllbGQiLCJwcm92aWRlZFZhbHVlIiwiY3VycmVudFZhbHVlcyIsInJlc29sdmVWYWx1ZSIsIl9ydW5SdWxlc1N5bmMiLCJydW5SdWxlc1N5bmMiLCJ2YWxpZGF0ZUZpZWxkcyIsImZpZWxkc1J1bGVzVG9WYWxpZGF0ZSIsImlzVmFsaWQiLCJrZXlzIiwiZm9yRWFjaCIsImhhbmRsZVN1Ym1pdEludGVybmFsIiwiY3VycmVudFJ1bGVzIiwiaGFzRXJyb3JzIiwiZmllbGROYW1lIiwiX3J1blJ1bGVzU3luYzIiLCJzdWNjZXNzIiwiaGFuZGxlU3VibWl0IiwidXNlRXZlbnRDYWxsYmFjayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlc2V0RmllbGRzIiwidG91Y2hlZCIsInZhbGlkYXRpbmciLCJoYW5kbGVSZXNldCIsImdldEZpZWxkVmFsdWUiLCJnZXRGaWVsZHNWYWx1ZSIsInNldEZpZWxkc1ZhbHVlIiwidXBkYXRlZFZhbHVlcyIsImZvcm1JbnN0YW5jZSIsInVzZU1lbW8iLCJzdWJtaXQiLCJzdGF0ZSIsImNvcmVDb250ZXh0U2hhcGUiLCJmaWVsZFJ1bGVzIiwiZ2V0SW5pdGlhbFZhbHVlcyIsIl9kZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxjQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFO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LEVBQWJBLGFBQWE7SUFDYkcsZUFBZSxFQUFmQSxlQUFlO0lBQ2ZrQixZQUFZLEVBQVpBLFlBQVk7SUFDWk8sV0FBVyxFQUFYQSxXQUFXO0lBQ1hILFdBQVcsRUFBWEEsV0FBVztJQUNYUSxZQUFZLEVBQVpBLFlBQVk7SUFDWkksZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7SUFDaEI5RCxLQUFLLEVBQUxBLEtBQUs7SUFDTGdFLGdCQUFnQixFQUFFLFNBQWxCQSxnQkFBZ0JBLENBQUE7TUFBQSxPQUFRbkUsa0JBQWtCO0lBQUE7RUN6RDFDLENEMEREO0FBQ0gsQ0FBQztBQUFDLElBQUFvRSxRQUFBLEdBQUE5RixPQUFBLGNBRWFELFdBQVciLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybUNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6W251bGwsImltcG9ydCB7IHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVtb2l6ZWRGbiBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZU1lbW9pemVkRm4nO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJy4uL3BhdGhVdGlscyc7XG5pbXBvcnQgeyBydW5SdWxlc1N5bmMgfSBmcm9tICcuLi9ydW5SdWxlcyc7XG5pbXBvcnQgeyBjcmVhdGVGb3JtU3RvcmUgfSBmcm9tICcuLi9mb3JtU3RvcmUnO1xuZXhwb3J0IGNvbnN0IHVzZUZvcm1Db3JlID0gKGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBpbml0aWFsVmFsdWVzID0ge30sIG9uRmluaXNoLCBvbkZpbmlzaEZhaWxlZCwgb25WYWx1ZXNDaGFuZ2UsIG9uUmVzZXQsIHNpemUgPSAnbGFyZ2UnLCBsYWJlbEFsaWduID0gJ2xlZnQnLCBkaXNhYmxlZCA9IGZhbHNlLCBjb2xvbiA9IHRydWUsIHJlcXVpcmVkTWFyayA9IHRydWUsIHZhbGlkYXRlVHJpZ2dlciA9ICdvbkNoYW5nZScsIH0gPSBjb25maWc7XG4gICAgLy8gaW5pdGlhbFZhbHVlcyBpcyBNT1VOVC1PTkxZICh0aGUgZG9jdW1lbnRlZCBjb250cmFjdCk6IGZyZWV6ZSB0aGUgZmlyc3RcbiAgICAvLyByZW5kZXIncyB2YWx1ZSBzbyByZXNldEZpZWxkcyBhbHdheXMgcmVzdG9yZXMgdGhlIG1vdW50LXRpbWUgZGVmYXVsdHMsXG4gICAgLy8gZXZlbiB3aGVuIHRoZSBjb25zdW1lciByZS1yZW5kZXJzIHdpdGggYSBkaWZmZXJlbnQgKGUuZy4gY29udHJvbGxlZClcbiAgICAvLyBpbml0aWFsVmFsdWVzIG9iamVjdC5cbiAgICBjb25zdCBpbml0aWFsVmFsdWVzUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGlmIChpbml0aWFsVmFsdWVzUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID0gaW5pdGlhbFZhbHVlcztcbiAgICB9XG4gICAgY29uc3QgbW91bnRJbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50O1xuICAgIC8vIEFsbCB2b2xhdGlsZSBmb3JtIHN0YXRlIGxpdmVzIGluIGFuIGV4dGVybmFsIHN0b3JlLCBOT1QgUmVhY3Qgc3RhdGUg4oCUIGFcbiAgICAvLyBrZXlzdHJva2UgbXVzdCBuZXZlciByZS1yZW5kZXIgdGhlIGNvbXBvbmVudCB0aGF0IG93bnMgdGhlIGZvcm0uIEZpZWxkc1xuICAgIC8vIGFuZCB3YXRjaGVycyBzdWJzY3JpYmUgd2l0aCBwZXItZmllbGQgc2VsZWN0b3JzICh1c2VTdG9yZVNlbGVjdG9yKTsgZXZlcnlcbiAgICAvLyBtdXRhdG9yIGJlbG93IHJlYWRzIHRoZSBMQVRFU1Qgc3RhdGUgdmlhIHN0b3JlLmdldFN0YXRlKCksIHdoaWNoIGFsc29cbiAgICAvLyBrZWVwcyBtdWx0aXBsZSB3cml0ZXMgaW4gdGhlIHNhbWUgdGljayB2aXNpYmxlIHRvIGVhY2ggb3RoZXIuXG4gICAgY29uc3Qgc3RvcmVSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgaWYgKHN0b3JlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgc3RvcmVSZWYuY3VycmVudCA9IGNyZWF0ZUZvcm1TdG9yZShtb3VudEluaXRpYWxWYWx1ZXMpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZSA9IHN0b3JlUmVmLmN1cnJlbnQ7XG4gICAgLy8gTGl2ZSBydWxlIHJlZ2lzdHJ5IOKAlCBPTkUgc3RhYmxlIG9iamVjdCBtdXRhdGVkIGluIHBsYWNlLiBSZWdpc3RyYXRpb24gbXVzdFxuICAgIC8vIG5vdCB0cmlnZ2VyIHJlbmRlcnMsIGFuZCBzdWJtaXQtdGltZSB2YWxpZGF0aW9uIG11c3QgYWx3YXlzIHJlYWQgdGhlIGxhdGVzdFxuICAgIC8vIHJ1bGVzICh0aGV5IGNhbiBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLCBlLmcuIGEgY29uZGl0aW9uYWwgYHJlcXVpcmVkYCkuXG4gICAgY29uc3QgZmllbGRSdWxlc1JlZiA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgY29tbWl0VmFsdWVzID0gdXNlTWVtb2l6ZWRGbigobmV3VmFsdWVzKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdmFsdWVzOiBuZXdWYWx1ZXMgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmFtZS5pbmNsdWRlcygnLicpXG4gICAgICAgICAgICA/IHNldE5lc3RlZFZhbHVlKHByZXYsIG5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIGNvbW1pdFZhbHVlcyhuZXdWYWx1ZXMpO1xuICAgICAgICBvblZhbHVlc0NoYW5nZSA9PT0gbnVsbCB8fCBvblZhbHVlc0NoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25WYWx1ZXNDaGFuZ2UoeyBbbmFtZV06IHZhbHVlIH0sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnM7XG4gICAgICAgICAgICBpZiAoZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgZXJyb3JzKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3RXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgZXJyb3JzOiBuZXdFcnJvcnMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZXRGaWVsZEVycm9yID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnM7XG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFlcnJvcnNbbmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbmV3RXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgZXJyb3JzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGVycm9yczogbmV3RXJyb3JzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcnNbbmFtZV0gPT09IGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGVycm9yczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlcnJvcnMpLCB7IFtuYW1lXTogZXJyb3IgfSkgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRXYXJuaW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgd2FybmluZykgPT4ge1xuICAgICAgICBjb25zdCB3YXJuaW5ncyA9IHN0b3JlLmdldFN0YXRlKCkud2FybmluZ3M7XG4gICAgICAgIGlmICh3YXJuaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXdhcm5pbmdzW25hbWVdKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgd2FybmluZ3MpO1xuICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW25hbWVdO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB3YXJuaW5nczogbmV3V2FybmluZ3MgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhcm5pbmdzW25hbWVdID09PSB3YXJuaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHdhcm5pbmdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKSwgeyBbbmFtZV06IHdhcm5pbmcgfSkgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVnaXN0ZXJGaWVsZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHJ1bGVzKSA9PiB7XG4gICAgICAgIGZpZWxkUnVsZXNSZWYuY3VycmVudFtuYW1lXSA9IHJ1bGVzO1xuICAgIH0pO1xuICAgIGNvbnN0IGdldEZpZWxkUnVsZXMgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5yZWdpc3RlckZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBkZWxldGUgZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdO1xuICAgIH0pO1xuICAgIGNvbnN0IHZhbGlkYXRlRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBydWxlcyA9IFtdLCBwcm92aWRlZFZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcm92aWRlZFZhbHVlICE9PSB1bmRlZmluZWQgPyBwcm92aWRlZFZhbHVlIDogcmVzb2x2ZVZhbHVlKGN1cnJlbnRWYWx1ZXMsIG5hbWUpO1xuICAgICAgICBjb25zdCB7IGVycm9yLCB3YXJuaW5nIH0gPSBydW5SdWxlc1N5bmMobmFtZSwgdmFsdWUsIGN1cnJlbnRWYWx1ZXMsIHJ1bGVzKTtcbiAgICAgICAgc2V0RmllbGRXYXJuaW5nKG5hbWUsIHdhcm5pbmcpO1xuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldEZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdG9yZS5nZXRTdGF0ZSgpLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgICAgc2V0RmllbGRFcnJvcihuYW1lLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkcyA9IHVzZU1lbW9pemVkRm4oKGZpZWxkc1J1bGVzVG9WYWxpZGF0ZSA9IGZpZWxkUnVsZXNSZWYuY3VycmVudCkgPT4ge1xuICAgICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1J1bGVzVG9WYWxpZGF0ZSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBmaWVsZHNSdWxlc1RvVmFsaWRhdGVbbmFtZV07XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlRmllbGQobmFtZSwgcnVsZXMpKSB7XG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlU3VibWl0SW50ZXJuYWwgPSB1c2VNZW1vaXplZEZuKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgICAgICBjb25zdCBjdXJyZW50UnVsZXMgPSBmaWVsZFJ1bGVzUmVmLmN1cnJlbnQ7XG4gICAgICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbmV3RXJyb3JzID0ge307XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRSdWxlcykuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmVWYWx1ZShjdXJyZW50VmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0gcnVuUnVsZXNTeW5jKGZpZWxkTmFtZSwgdmFsdWUsIGN1cnJlbnRWYWx1ZXMsIGN1cnJlbnRSdWxlc1tmaWVsZE5hbWVdKTtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0Vycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3V2FybmluZ3NbZmllbGROYW1lXSA9IHdhcm5pbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGVycm9yczogbmV3RXJyb3JzLCB3YXJuaW5nczogbmV3V2FybmluZ3MgfSk7XG4gICAgICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICAgICAgICBvbkZpbmlzaCA9PT0gbnVsbCB8fCBvbkZpbmlzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2goY3VycmVudFZhbHVlcyk7XG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZXM6IGN1cnJlbnRWYWx1ZXMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRmluaXNoRmFpbGVkID09PSBudWxsIHx8IG9uRmluaXNoRmFpbGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaEZhaWxlZCh7IHZhbHVlczogY3VycmVudFZhbHVlcywgZXJyb3JzOiBuZXdFcnJvcnMgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3JzOiBuZXdFcnJvcnMgfTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBoYW5kbGVTdWJtaXRJbnRlcm5hbCgpO1xuICAgIH0pO1xuICAgIC8vIFB1cmUgc3RhdGUgQVBJOiB0aGUgaW1wZXJhdGl2ZSByZXNldEZpZWxkcygpXG4gICAgLy8gbmV2ZXIgZmlyZXMgb25SZXNldC4gVGhlIGNhbGxiYWNrIGJlbG9uZ3MgdG8gdGhlIHJlc2V0IEFDVElPTiBsYXllclxuICAgIC8vIChzdWJtaXR0ZXIgYnV0dG9uIC8gbmF0aXZlIHJlc2V0IGV2ZW50KSwgd2hpY2ggZmlyZXMgaXQgZXhhY3RseSBvbmNlLlxuICAgIGNvbnN0IHJlc2V0RmllbGRzID0gdXNlTWVtb2l6ZWRGbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHZhbHVlczogbW91bnRJbml0aWFsVmFsdWVzLFxuICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgICAgIHRvdWNoZWQ6IHt9LFxuICAgICAgICAgICAgdmFsaWRhdGluZzoge30sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlRXZlbnRDYWxsYmFjaygoZSkgPT4ge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVzZXRGaWVsZHMoKTtcbiAgICAgICAgb25SZXNldCA9PT0gbnVsbCB8fCBvblJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2V0KCk7XG4gICAgfSk7XG4gICAgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVWYWx1ZShzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcywgbmFtZSk7XG4gICAgfSk7XG4gICAgY29uc3QgZ2V0RmllbGRzVmFsdWUgPSB1c2VNZW1vaXplZEZuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkc1ZhbHVlID0gdXNlTWVtb2l6ZWRGbigobmV3VmFsdWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudmFsdWVzKSwgbmV3VmFsdWVzKTtcbiAgICAgICAgY29tbWl0VmFsdWVzKHVwZGF0ZWRWYWx1ZXMpO1xuICAgICAgICBvblZhbHVlc0NoYW5nZSA9PT0gbnVsbCB8fCBvblZhbHVlc0NoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25WYWx1ZXNDaGFuZ2UobmV3VmFsdWVzLCB1cGRhdGVkVmFsdWVzKTtcbiAgICB9KTtcbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIHN1Ym1pdDogaGFuZGxlU3VibWl0SW50ZXJuYWwsXG4gICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICBnZXRGaWVsZFZhbHVlLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzLFxuICAgIH0pLCBbXG4gICAgICAgIGhhbmRsZVN1Ym1pdEludGVybmFsLFxuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkc1ZhbHVlLFxuICAgICAgICBzZXRGaWVsZFZhbHVlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkcyxcbiAgICBdKTtcbiAgICAvLyBSZW5kZXItdGltZSBzbmFwc2hvdCDigJQga2VwdCBmb3IgdGhlIFVzZUZvcm1Db3JlUmV0dXJuIGNvbnRyYWN0LiBSZWFjdGl2ZVxuICAgIC8vIGNvbnN1bWVycyBtdXN0IGdvIHRocm91Z2ggdGhlIHN0b3JlLCBuZXZlciB0aHJvdWdoIHRoZXNlIGZpZWxkcy5cbiAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29yZUNvbnRleHRTaGFwZSA9IHtcbiAgICAgICAgdmFsdWVzOiBzdGF0ZS52YWx1ZXMsXG4gICAgICAgIGVycm9yczogc3RhdGUuZXJyb3JzLFxuICAgICAgICB3YXJuaW5nczogc3RhdGUud2FybmluZ3MsXG4gICAgICAgIHRvdWNoZWQ6IHN0YXRlLnRvdWNoZWQsXG4gICAgICAgIGZvcm1JbnN0YW5jZSxcbiAgICAgICAgc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRFcnJvcixcbiAgICAgICAgc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICByZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGxhYmVsQWxpZ24sXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBjb2xvbixcbiAgICAgICAgcmVxdWlyZWRNYXJrLFxuICAgICAgICB2YWxpZGF0ZVRyaWdnZXIsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZXM6IHN0YXRlLnZhbHVlcyxcbiAgICAgICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnMsXG4gICAgICAgIHdhcm5pbmdzOiBzdGF0ZS53YXJuaW5ncyxcbiAgICAgICAgdG91Y2hlZDogc3RhdGUudG91Y2hlZCxcbiAgICAgICAgLy8gTGl2ZSByZWdpc3RyeSDigJQgc3RhYmxlIGlkZW50aXR5LCBtdXRhdGVkIGluIHBsYWNlIGJ5IHJlZ2lzdGVyL3VucmVnaXN0ZXIuXG4gICAgICAgIGZpZWxkUnVsZXM6IGZpZWxkUnVsZXNSZWYuY3VycmVudCxcbiAgICAgICAgZ2V0RmllbGRSdWxlcyxcbiAgICAgICAgc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRFcnJvcixcbiAgICAgICAgc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBzZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHZhbGlkYXRlRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzLFxuICAgICAgICByZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgaGFuZGxlUmVzZXQsXG4gICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICBmb3JtSW5zdGFuY2UsXG4gICAgICAgIGNvcmVDb250ZXh0U2hhcGUsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBnZXRJbml0aWFsVmFsdWVzOiAoKSA9PiBtb3VudEluaXRpYWxWYWx1ZXMsXG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtQ29yZTsiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
390
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtQ29yZS50cyIsImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIl0sIm5hbWVzIjpbIl9yZWFjdCIsInJlcXVpcmUiLCJfdXNlRXZlbnRDYWxsYmFjayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXNlTWVtb2l6ZWRGbiIsIl9wYXRoVXRpbHMiLCJfcnVuUnVsZXMiLCJfZm9ybVN0b3JlIiwidXNlRm9ybUNvcmUiLCJleHBvcnRzIiwiY29uZmlnIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX2NvbmZpZyRpbml0aWFsVmFsdWVzIiwiaW5pdGlhbFZhbHVlcyIsIm9uRmluaXNoIiwib25GaW5pc2hGYWlsZWQiLCJvblZhbHVlc0NoYW5nZSIsIm9uUmVzZXQiLCJfY29uZmlnJHNpemUiLCJzaXplIiwiX2NvbmZpZyRsYWJlbEFsaWduIiwibGFiZWxBbGlnbiIsIl9jb25maWckZGlzYWJsZWQiLCJkaXNhYmxlZCIsIl9jb25maWckdmFsaWRhdGVUcmlnZyIsInZhbGlkYXRlVHJpZ2dlciIsImluaXRpYWxWYWx1ZXNSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwibW91bnRJbml0aWFsVmFsdWVzIiwic3RvcmVSZWYiLCJjcmVhdGVGb3JtU3RvcmUiLCJzdG9yZSIsImZpZWxkUnVsZXNSZWYiLCJ2YWxpZGF0aW9uRXBvY2hSZWYiLCJiZWdpblZhbGlkYXRpb25SdW4iLCJ1c2VNZW1vaXplZEZuIiwibmFtZSIsIm5leHQiLCJpc1ZhbGlkYXRpb25SdW5DdXJyZW50IiwiZXBvY2giLCJpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMiLCJuYW1lcyIsImtleXMiLCJPYmplY3QiLCJmb3JFYWNoIiwia2V5IiwicnVsZUNvbnRleHRJbnN0YW5jZVJlZiIsInNldFJ1bGVDb250ZXh0SW5zdGFuY2UiLCJpbnN0YW5jZSIsImdldFJ1bGVDb250ZXh0SW5zdGFuY2UiLCJjb21taXRWYWx1ZXMiLCJuZXdWYWx1ZXMiLCJzZXRTdGF0ZSIsInZhbHVlcyIsInNldEZpZWxkVmFsdWUiLCJ2YWx1ZSIsInByZXYiLCJnZXRTdGF0ZSIsImluY2x1ZGVzIiwic2V0TmVzdGVkVmFsdWUiLCJhc3NpZ24iLCJfZGVmaW5lUHJvcGVydHkyIiwic2V0RmllbGRFcnJvciIsImVycm9yIiwiZXJyb3JzIiwibmV3RXJyb3JzIiwic2FtZVZhbGlkYXRpb25Ob2RlIiwic2V0RmllbGRXYXJuaW5nIiwid2FybmluZyIsIndhcm5pbmdzIiwibmV3V2FybmluZ3MiLCJmaWVsZE1vdW50Q291bnRzUmVmIiwiZmllbGRSZWdpc3RyYXRpb25Pd25lZFJlZiIsInJlZ2lzdGVyRmllbGQiLCJydWxlcyIsImdldEZpZWxkUnVsZXMiLCJ1bnJlZ2lzdGVyRmllbGQiLCJyZXRhaW5GaWVsZCIsInJlbGVhc2VGaWVsZCIsImNvdW50IiwidmFsaWRhdGVGaWVsZCIsInByb3ZpZGVkVmFsdWUiLCJjdXJyZW50VmFsdWVzIiwicmVzb2x2ZVZhbHVlIiwiX3J1blJ1bGVzU3luYyIsInJ1blJ1bGVzU3luYyIsInZhbGlkYXRlRmllbGRzIiwiZmllbGRzUnVsZXNUb1ZhbGlkYXRlIiwiaXNWYWxpZCIsImhhbmRsZVN1Ym1pdEludGVybmFsIiwic3RhdGUiLCJjdXJyZW50UnVsZXMiLCJoYXNFcnJvcnMiLCJmYWlsZWRFcnJvcnMiLCJmaWVsZE5hbWUiLCJfcnVuUnVsZXNTeW5jMiIsInN1Y2Nlc3MiLCJoYW5kbGVTdWJtaXQiLCJ1c2VFdmVudENhbGxiYWNrIiwiZSIsInByZXZlbnREZWZhdWx0IiwicmVzZXRGaWVsZHMiLCJ0b3VjaGVkIiwidmFsaWRhdGluZyIsImhhbmRsZVJlc2V0IiwiZ2V0RmllbGRWYWx1ZSIsImdldEZpZWxkc1ZhbHVlIiwic2V0RmllbGRzVmFsdWUiLCJ1cGRhdGVkVmFsdWVzIiwic29tZSIsIl9pIiwiX09iamVjdCRlbnRyaWVzIiwiZW50cmllcyIsIl9PYmplY3QkZW50cmllcyRfaSIsIl9zbGljZWRUb0FycmF5MiIsImZvcm1JbnN0YW5jZSIsInVzZU1lbW8iLCJzdWJtaXQiLCJjb3JlQ29udGV4dFNoYXBlIiwiZmllbGRSdWxlcyIsImdldEluaXRpYWxWYWx1ZXMiLCJfZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQVVPLElBQU1PLFdBQVcsR0FBQUMsT0FBQSxDQUFBRCxXQUFBLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQSxFQUV1RTtFQUFBLElBRDdGRSxNQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUE0QixDQUFBLENBQUU7RUFFOUIsSUFBQUcscUJBQUEsR0FVSUosTUFBTSxDQVRSSyxhQUFhO0lBQWJBLGFBQWEsR0FBQUQscUJBQUEsY0FBRyxDQUFBLENBQUUsR0FBQUEscUJBQUE7SUFDbEJFLFFBQVEsR0FRTk4sTUFBTSxDQVJSTSxRQUFRO0lBQ1JDLGNBQWMsR0FPWlAsTUFBTSxDQVBSTyxjQUFjO0lBQ2RDLGNBQWMsR0FNWlIsTUFBTSxDQU5SUSxjQUFjO0lBQ2RDLE9BQU8sR0FLTFQsTUFBTSxDQUxSUyxPQUFPO0lBQUFDLFlBQUEsR0FLTFYsTUFBTSxDQUpSVyxJQUFJO0lBQUpBLElBQUksR0FBQUQsWUFBQSxjQUFHLE9BQU8sR0FBQUEsWUFBQTtJQUFBRSxrQkFBQSxHQUlaWixNQUFNLENBSFJhLFVBQVU7SUFBVkEsVUFBVSxHQUFBRCxrQkFBQSxjQUFHLE1BQU0sR0FBQUEsa0JBQUE7SUFBQUUsZ0JBQUEs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RyxlQUFlLEVBQWZBLGVBQWU7SUFDZkMsV0FBVyxFQUFYQSxXQUFXO0lBQ1hDLFlBQVksRUFBWkEsWUFBWTtJQUNabUIsWUFBWSxFQUFaQSxZQUFZO0lBQ1pPLFdBQVcsRUFBWEEsV0FBVztJQUNYSCxXQUFXLEVBQVhBLFdBQVc7SUFDWGMsWUFBWSxFQUFaQSxZQUFZO0lBQ1pHLGdCQUFnQixFQUFoQkEsZ0JBQWdCO0lBQ2hCdkYsS0FBSyxFQUFMQSxLQUFLO0lBQ0x5RixnQkFBZ0IsRUFBRSxTQUFsQkEsZ0JBQWdCQSxDQUFBO01BQUEsT0FBUTVGLGtCQUFrQjtJQUFBO0VDdEUxQyxDRHVFRDtBQUNILENBQUM7QUFBQyxJQUFBNkYsUUFBQSxHQUFBbkgsT0FBQSxjQUVhRCxXQUFXIiwiZmlsZSI6ImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJpbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZU1lbW9pemVkRm4gZnJvbSAnQDFtb25leS9ob29rcy91c2VNZW1vaXplZEZuJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuLi9wYXRoVXRpbHMnO1xuaW1wb3J0IHsgcnVuUnVsZXNTeW5jIH0gZnJvbSAnLi4vcnVuUnVsZXMnO1xuaW1wb3J0IHsgY3JlYXRlRm9ybVN0b3JlLCBzYW1lVmFsaWRhdGlvbk5vZGUgfSBmcm9tICcuLi9mb3JtU3RvcmUnO1xuZXhwb3J0IGNvbnN0IHVzZUZvcm1Db3JlID0gKGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBpbml0aWFsVmFsdWVzID0ge30sIG9uRmluaXNoLCBvbkZpbmlzaEZhaWxlZCwgb25WYWx1ZXNDaGFuZ2UsIG9uUmVzZXQsIHNpemUgPSAnbGFyZ2UnLCBsYWJlbEFsaWduID0gJ2xlZnQnLCBkaXNhYmxlZCA9IGZhbHNlLCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIC8vIGluaXRpYWxWYWx1ZXMgaXMgTU9VTlQtT05MWSAodGhlIGRvY3VtZW50ZWQgY29udHJhY3QpOiBmcmVlemUgdGhlIGZpcnN0XG4gICAgLy8gcmVuZGVyJ3MgdmFsdWUgc28gcmVzZXRGaWVsZHMgYWx3YXlzIHJlc3RvcmVzIHRoZSBtb3VudC10aW1lIGRlZmF1bHRzLFxuICAgIC8vIGV2ZW4gd2hlbiB0aGUgY29uc3VtZXIgcmUtcmVuZGVycyB3aXRoIGEgZGlmZmVyZW50IChlLmcuIGNvbnRyb2xsZWQpXG4gICAgLy8gaW5pdGlhbFZhbHVlcyBvYmplY3QuXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlc1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudCA9IGluaXRpYWxWYWx1ZXM7XG4gICAgfVxuICAgIGNvbnN0IG1vdW50SW5pdGlhbFZhbHVlcyA9IGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudDtcbiAgICAvLyBBbGwgdm9sYXRpbGUgZm9ybSBzdGF0ZSBsaXZlcyBpbiBhbiBleHRlcm5hbCBzdG9yZSwgTk9UIFJlYWN0IHN0YXRlIOKAlCBhXG4gICAgLy8ga2V5c3Ryb2tlIG11c3QgbmV2ZXIgcmUtcmVuZGVyIHRoZSBjb21wb25lbnQgdGhhdCBvd25zIHRoZSBmb3JtLiBGaWVsZHNcbiAgICAvLyBhbmQgd2F0Y2hlcnMgc3Vic2NyaWJlIHdpdGggcGVyLWZpZWxkIHNlbGVjdG9ycyAodXNlU3RvcmVTZWxlY3Rvcik7IGV2ZXJ5XG4gICAgLy8gbXV0YXRvciBiZWxvdyByZWFkcyB0aGUgTEFURVNUIHN0YXRlIHZpYSBzdG9yZS5nZXRTdGF0ZSgpLCB3aGljaCBhbHNvXG4gICAgLy8ga2VlcHMgbXVsdGlwbGUgd3JpdGVzIGluIHRoZSBzYW1lIHRpY2sgdmlzaWJsZSB0byBlYWNoIG90aGVyLlxuICAgIGNvbnN0IHN0b3JlUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGlmIChzdG9yZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHN0b3JlUmVmLmN1cnJlbnQgPSBjcmVhdGVGb3JtU3RvcmUobW91bnRJbml0aWFsVmFsdWVzKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBzdG9yZVJlZi5jdXJyZW50O1xuICAgIC8vIExpdmUgcnVsZSByZWdpc3RyeSDigJQgT05FIHN0YWJsZSBvYmplY3QgbXV0YXRlZCBpbiBwbGFjZS4gUmVnaXN0cmF0aW9uIG11c3RcbiAgICAvLyBub3QgdHJpZ2dlciByZW5kZXJzLCBhbmQgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBtdXN0IGFsd2F5cyByZWFkIHRoZSBsYXRlc3RcbiAgICAvLyBydWxlcyAodGhleSBjYW4gY2hhbmdlIGJldHdlZW4gcmVuZGVycywgZS5nLiBhIGNvbmRpdGlvbmFsIGByZXF1aXJlZGApLlxuICAgIGNvbnN0IGZpZWxkUnVsZXNSZWYgPSB1c2VSZWYoe30pO1xuICAgIC8vIFBlci1maWVsZCB2YWxpZGF0aW9uIHJ1biBlcG9jaHMuIEVWRVJZIHZhbGlkYXRpb24gcnVuIChzeW5jIG9yIGFzeW5jKVxuICAgIC8vIGJ1bXBzIGl0cyBmaWVsZCdzIGVwb2NoOyBhbiBhc3luYyBydW4gcmUtY2hlY2tzIGl0cyBjYXB0dXJlZCBlcG9jaCBhdFxuICAgIC8vIHNldHRsZSB0aW1lIGFuZCBkaXNjYXJkcyBhIFNUQUxFIG91dGNvbWUg4oCUIHRoZSBzYW1lIHByb3RlY3Rpb24gYXNcbiAgICAvLyByYy1maWVsZC1mb3JtJ3MgdmFsaWRhdGVQcm9taXNlIGlkZW50aXR5IGNoZWNrLiBXaXRob3V0IGl0LCBhIHNsb3cgYXN5bmNcbiAgICAvLyB2YWxpZGF0b3IgKGUuZy4gYSBzZXJ2ZXItc2lkZSB1bmlxdWVuZXNzIGNoZWNrIHN0YXJ0ZWQgb24gYmx1cikgY291bGRcbiAgICAvLyBzZXR0bGUgYWZ0ZXIgdGhlIHVzZXIgYWxyZWFkeSBmaXhlZCB0aGUgdmFsdWUgYW5kIHN0YW1wIGEgc3RhbGUgZXJyb3JcbiAgICAvLyBvdmVyIGEgbmV3ZXIsIHBhc3NpbmcgcmVzdWx0LlxuICAgIGNvbnN0IHZhbGlkYXRpb25FcG9jaFJlZiA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgYmVnaW5WYWxpZGF0aW9uUnVuID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gKHZhbGlkYXRpb25FcG9jaFJlZi5jdXJyZW50W25hbWVdIHx8IDApICsgMTtcbiAgICAgICAgdmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRbbmFtZV0gPSBuZXh0O1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICBjb25zdCBpc1ZhbGlkYXRpb25SdW5DdXJyZW50ID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgZXBvY2gpID0+IHZhbGlkYXRpb25FcG9jaFJlZi5jdXJyZW50W25hbWVdID09PSBlcG9jaCk7XG4gICAgLy8gQnVtcCAobmV2ZXIgZGVsZXRlIOKAlCBkZWxldGlvbiB3b3VsZCBsZXQgYSBuZXcgcnVuIHJlLWlzc3VlIGFuIG9sZCBlcG9jaFxuICAgIC8vIG51bWJlciBhbmQgY29sbGlkZSB3aXRoIGEgc3RpbGwtaW4tZmxpZ2h0IHByZS1yZXNldCBydW4pLlxuICAgIGNvbnN0IGludmFsaWRhdGVWYWxpZGF0aW9uUnVucyA9IHVzZU1lbW9pemVkRm4oKG5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBuYW1lcyAhPT0gbnVsbCAmJiBuYW1lcyAhPT0gdm9pZCAwID8gbmFtZXMgOiBPYmplY3Qua2V5cyh2YWxpZGF0aW9uRXBvY2hSZWYuY3VycmVudCk7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRba2V5XSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBJbnN0YW5jZSBoYW5kZWQgdG8gZnVuY3Rpb24tZm9ybSBydWxlcy4gRGVmYXVsdHMgdG8gdGhlIGNvcmUgbWV0aG9kc1xuICAgIC8vIChhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHRoaXMgaG9vayBib2R5KTsgdXNlRm9ybSB1cGdyYWRlcyBpdCB0byB0aGUgRlVMTFxuICAgIC8vIGZvcm0gaW5zdGFuY2Ugb25jZSBpdCBoYXMgYnVpbHQgb25lLCBzbyBydWxlcyBzZWUgdGhlIHNhbWUgY29udGV4dCBvblxuICAgIC8vIGV2ZXJ5IHBhdGggKGludGVyYWN0aXZlLCBibHVyLCBzdWJtaXQpLlxuICAgIGNvbnN0IHJ1bGVDb250ZXh0SW5zdGFuY2VSZWYgPSB1c2VSZWYoe30pO1xuICAgIGNvbnN0IHNldFJ1bGVDb250ZXh0SW5zdGFuY2UgPSB1c2VNZW1vaXplZEZuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQgPSBpbnN0YW5jZTtcbiAgICB9KTtcbiAgICBjb25zdCBnZXRSdWxlQ29udGV4dEluc3RhbmNlID0gdXNlTWVtb2l6ZWRGbigoKSA9PiBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQpO1xuICAgIGNvbnN0IGNvbW1pdFZhbHVlcyA9IHVzZU1lbW9pemVkRm4oKG5ld1ZhbHVlcykgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbHVlczogbmV3VmFsdWVzIH0pO1xuICAgIH0pO1xuICAgIC8vIE5PVEU6IHNldHRpbmcgYSB2YWx1ZSBkb2VzIE5PVCB0b3VjaCB0aGUgZmllbGQncyBlcnJvciDigJQgZXJyb3JzIGFyZVxuICAgIC8vIGNsZWFyZWQgZXhjbHVzaXZlbHkgYnkgdmFsaWRhdGlvbiBydW5zICh3aG9zZSB0aW1pbmcgZm9sbG93cyB0aGVcbiAgICAvLyB2YWxpZGF0ZVRyaWdnZXIgY29uZmlnKSwgc28gYW4gb25CbHVyLW9ubHkgZmllbGQga2VlcHMgaXRzIGVycm9yIHdoaWxlXG4gICAgLy8gdGhlIHVzZXIgaXMgc3RpbGwgdHlwaW5nLlxuICAgIGNvbnN0IHNldEZpZWxkVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5hbWUuaW5jbHVkZXMoJy4nKVxuICAgICAgICAgICAgPyBzZXROZXN0ZWRWYWx1ZShwcmV2LCBuYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICBjb21taXRWYWx1ZXMobmV3VmFsdWVzKTtcbiAgICAgICAgb25WYWx1ZXNDaGFuZ2UgPT09IG51bGwgfHwgb25WYWx1ZXNDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmFsdWVzQ2hhbmdlKHsgW25hbWVdOiB2YWx1ZSB9LCBuZXdWYWx1ZXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yc1tuYW1lXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBuZXdFcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBlcnJvcnMpO1xuICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tuYW1lXTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgZXJyb3JzOiBuZXdFcnJvcnMgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbWVWYWxpZGF0aW9uTm9kZShlcnJvcnNbbmFtZV0sIGVycm9yKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXJyb3JzKSwgeyBbbmFtZV06IGVycm9yIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkV2FybmluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBzdG9yZS5nZXRTdGF0ZSgpLndhcm5pbmdzO1xuICAgICAgICBpZiAod2FybmluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF3YXJuaW5nc1tuYW1lXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgd2FybmluZ3M6IG5ld1dhcm5pbmdzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVmFsaWRhdGlvbk5vZGUod2FybmluZ3NbbmFtZV0sIHdhcm5pbmcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHdhcm5pbmdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKSwgeyBbbmFtZV06IHdhcm5pbmcgfSkgfSk7XG4gICAgfSk7XG4gICAgLy8gTW91bnRlZC1pbnN0YW5jZSBjb3VudHMgcGVyIGZpZWxkIG5hbWUsIHBsdXMgd2hldGhlciB0aGUgQ1VSUkVOVCBydWxlc1xuICAgIC8vIHJlZ2lzdHJhdGlvbiB3YXMgbWFkZSBieSBhIGNvdW50ZWQgaW5zdGFuY2UuIFJ1bGVzIGFyZSByZW1vdmVkIG9ubHkgd2hlblxuICAgIC8vIHRoZSBMQVNUIG1vdW50ZWQgaW5zdGFuY2UgZm9yIGEgbmFtZSByZWxlYXNlczogd2l0aCB0d28gc2FtZS1uYW1lIGZpZWxkc1xuICAgIC8vIG1vdW50ZWQsIHRoZSBmaXJzdCB1bm1vdW50IG11c3Qgbm90IHdpcGUgdGhlIHJlZ2lzdHJhdGlvbiB3aGlsZSB0aGVcbiAgICAvLyBzdXJ2aXZvciAocG9zc2libHkgbWVtby1iYWlsZWQsIHNvIG5vdCByZS1yZW5kZXJpbmcgdG8gcmUtcmVnaXN0ZXIpIHN0aWxsXG4gICAgLy8gcmVsaWVzIG9uIGl0IGZvciBzdWJtaXQtdGltZSB2YWxpZGF0aW9uLiBBIE1BTlVBTCByZWdpc3RlckZpZWxkIChub1xuICAgIC8vIG1vdW50ZWQgaG9sZGVyLCBvd25lZD1mYWxzZSkgc3Vydml2ZXMgdGhlIHVubW91bnQgb2YgcGlnZ3liYWNraW5nXG4gICAgLy8gaW5zdGFuY2VzIHRoYXQgbmV2ZXIgcmVnaXN0ZXJlZCBydWxlcyB0aGVtc2VsdmVzLlxuICAgIC8vIE5PVEU6IGNhbGxlcnMgbXVzdCByZXRhaW4gQkVGT1JFIHJlZ2lzdGVyaW5nIChyZXRhaW4gZWZmZWN0IGRlY2xhcmVkXG4gICAgLy8gZmlyc3QpLCBvciB0aGUgcmVnaXN0cmF0aW9uIGlzIG1pc2NsYXNzaWZpZWQgYXMgbWFudWFsIGFuZCBsZWFrcy5cbiAgICBjb25zdCBmaWVsZE1vdW50Q291bnRzUmVmID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCBmaWVsZFJlZ2lzdHJhdGlvbk93bmVkUmVmID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCByZWdpc3RlckZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgcnVsZXMpID0+IHtcbiAgICAgICAgZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdID0gcnVsZXM7XG4gICAgICAgIGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXSA9IChmaWVsZE1vdW50Q291bnRzUmVmLmN1cnJlbnRbbmFtZV0gfHwgMCkgPiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IGdldEZpZWxkUnVsZXMgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5yZWdpc3RlckZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBkZWxldGUgZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdO1xuICAgICAgICBkZWxldGUgZmllbGRSZWdpc3RyYXRpb25Pd25lZFJlZi5jdXJyZW50W25hbWVdO1xuICAgIH0pO1xuICAgIGNvbnN0IHJldGFpbkZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBmaWVsZE1vdW50Q291bnRzUmVmLmN1cnJlbnRbbmFtZV0gPSAoZmllbGRNb3VudENvdW50c1JlZi5jdXJyZW50W25hbWVdIHx8IDApICsgMTtcbiAgICB9KTtcbiAgICBjb25zdCByZWxlYXNlRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gKGZpZWxkTW91bnRDb3VudHNSZWYuY3VycmVudFtuYW1lXSB8fCAwKSAtIDE7XG4gICAgICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgZmllbGRNb3VudENvdW50c1JlZi5jdXJyZW50W25hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkTW91bnRDb3VudHNSZWYuY3VycmVudFtuYW1lXSA9IGNvdW50O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdmFsaWRhdGVGaWVsZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHJ1bGVzID0gW10sIHByb3ZpZGVkVmFsdWUpID0+IHtcbiAgICAgICAgLy8gQSBzeW5jIHJ1biBjb21taXRzIGltbWVkaWF0ZWx5LCBzbyBpdCBpcyBhbHdheXMgY3VycmVudCDigJQgYnVtcGluZyB0aGVcbiAgICAgICAgLy8gZXBvY2ggaGVyZSBTVVBFUlNFREVTIGFueSBpbi1mbGlnaHQgYXN5bmMgcnVuIGZvciB0aGlzIGZpZWxkLlxuICAgICAgICBiZWdpblZhbGlkYXRpb25SdW4obmFtZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcm92aWRlZFZhbHVlICE9PSB1bmRlZmluZWQgPyBwcm92aWRlZFZhbHVlIDogcmVzb2x2ZVZhbHVlKGN1cnJlbnRWYWx1ZXMsIG5hbWUpO1xuICAgICAgICBjb25zdCB7IGVycm9yLCB3YXJuaW5nIH0gPSBydW5SdWxlc1N5bmMobmFtZSwgdmFsdWUsIGN1cnJlbnRWYWx1ZXMsIHJ1bGVzLCBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQpO1xuICAgICAgICBzZXRGaWVsZFdhcm5pbmcobmFtZSwgd2FybmluZyk7XG4gICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0RmllbGRFcnJvcihuYW1lLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgICBzZXRGaWVsZEVycm9yKG5hbWUsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRzID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzUnVsZXNUb1ZhbGlkYXRlID0gZmllbGRSdWxlc1JlZi5jdXJyZW50KSA9PiB7XG4gICAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzUnVsZXNUb1ZhbGlkYXRlKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydWxlcyA9IGZpZWxkc1J1bGVzVG9WYWxpZGF0ZVtuYW1lXTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVGaWVsZChuYW1lLCBydWxlcykpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVTdWJtaXRJbnRlcm5hbCA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBzdGF0ZS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSdWxlcyA9IGZpZWxkUnVsZXNSZWYuY3VycmVudDtcbiAgICAgICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBmYWlsZWRFcnJvcnMgPSB7fTtcbiAgICAgICAgLy8gTUVSR0Ugb3ZlciB0aGUgY3VycmVudCBtYXBzOiBvbmx5IGZpZWxkcyBpbiB0aGUgcnVsZSByZWdpc3RyeSBhcmVcbiAgICAgICAgLy8gcmUtZGVjaWRlZCDigJQgYSBtYW51YWxseS1zZXQgZXJyb3Igb24gYSBmaWVsZCB3aXRob3V0IHJ1bGVzIHN1cnZpdmVzLlxuICAgICAgICBjb25zdCBuZXdFcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5lcnJvcnMpO1xuICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLndhcm5pbmdzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudFJ1bGVzKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgIGJlZ2luVmFsaWRhdGlvblJ1bihmaWVsZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlVmFsdWUoY3VycmVudFZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIHdhcm5pbmcgfSA9IHJ1blJ1bGVzU3luYyhmaWVsZE5hbWUsIHZhbHVlLCBjdXJyZW50VmFsdWVzLCBjdXJyZW50UnVsZXNbZmllbGROYW1lXSwgcnVsZUNvbnRleHRJbnN0YW5jZVJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0Vycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgZmFpbGVkRXJyb3JzW2ZpZWxkTmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5pbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXdXYXJuaW5nc1tmaWVsZE5hbWVdID0gd2FybmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IG5ld0Vycm9ycywgd2FybmluZ3M6IG5ld1dhcm5pbmdzIH0pO1xuICAgICAgICBpZiAoIWhhc0Vycm9ycykge1xuICAgICAgICAgICAgb25GaW5pc2ggPT09IG51bGwgfHwgb25GaW5pc2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmluaXNoKGN1cnJlbnRWYWx1ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmFsdWVzOiBjdXJyZW50VmFsdWVzIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvbkZpbmlzaEZhaWxlZCA9PT0gbnVsbCB8fCBvbkZpbmlzaEZhaWxlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2hGYWlsZWQoeyB2YWx1ZXM6IGN1cnJlbnRWYWx1ZXMsIGVycm9yczogZmFpbGVkRXJyb3JzIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yczogZmFpbGVkRXJyb3JzIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gaGFuZGxlU3VibWl0SW50ZXJuYWwoKTtcbiAgICB9KTtcbiAgICAvLyBQdXJlIHN0YXRlIEFQSTogdGhlIGltcGVyYXRpdmUgcmVzZXRGaWVsZHMoKVxuICAgIC8vIG5ldmVyIGZpcmVzIG9uUmVzZXQuIFRoZSBjYWxsYmFjayBiZWxvbmdzIHRvIHRoZSByZXNldCBBQ1RJT04gbGF5ZXJcbiAgICAvLyAoc3VibWl0dGVyIGJ1dHRvbiAvIG5hdGl2ZSByZXNldCBldmVudCksIHdoaWNoIGZpcmVzIGl0IGV4YWN0bHkgb25jZS5cbiAgICBjb25zdCByZXNldEZpZWxkcyA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICAvLyBJbnZhbGlkYXRlIGluLWZsaWdodCBhc3luYyB2YWxpZGF0aW9uIHJ1bnMg4oCUIHRoZWlyIHJlc3VsdHMgYmVsb25nIHRvXG4gICAgICAgIC8vIHByZS1yZXNldCB2YWx1ZXMgYW5kIG11c3Qgbm90IHN0YW1wIGVycm9ycyBvbnRvIHRoZSByZXNldCBmb3JtLlxuICAgICAgICBpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMoKTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdmFsdWVzOiBtb3VudEluaXRpYWxWYWx1ZXMsXG4gICAgICAgICAgICBlcnJvcnM6IHt9LFxuICAgICAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICAgICAgdG91Y2hlZDoge30sXG4gICAgICAgICAgICB2YWxpZGF0aW5nOiB7fSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlUmVzZXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXNldEZpZWxkcygpO1xuICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoKTtcbiAgICB9KTtcbiAgICBjb25zdCBnZXRGaWVsZFZhbHVlID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVZhbHVlKHN0b3JlLmdldFN0YXRlKCkudmFsdWVzLCBuYW1lKTtcbiAgICB9KTtcbiAgICBjb25zdCBnZXRGaWVsZHNWYWx1ZSA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRzVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuZXdWYWx1ZXMpID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgICAgICBsZXQgdXBkYXRlZFZhbHVlcztcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG5ld1ZhbHVlcykuc29tZSgoa2V5KSA9PiBrZXkuaW5jbHVkZXMoJy4nKSkpIHtcbiAgICAgICAgICAgIC8vIERvdC1wYXRoIGtleXMgd3JpdGUgaW50byB0aGUgTkVTVEVEIHN0cnVjdHVyZSAodGhlIHNldEZpZWxkVmFsdWVcbiAgICAgICAgICAgIC8vIGNvbnRyYWN0KSDigJQgYSBzaGFsbG93IG1lcmdlIHdvdWxkIGxhbmQgdGhlbSBhcyBsaXRlcmFsIHRvcC1sZXZlbFxuICAgICAgICAgICAgLy8ga2V5cyB0aGF0IHRoZSBuZXN0ZWQtYXdhcmUgcmVhZGVycyBuZXZlciBmaW5kLlxuICAgICAgICAgICAgdXBkYXRlZFZhbHVlcyA9IHByZXY7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhuZXdWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcyA9IGtleS5pbmNsdWRlcygnLicpXG4gICAgICAgICAgICAgICAgICAgID8gc2V0TmVzdGVkVmFsdWUodXBkYXRlZFZhbHVlcywga2V5LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVwZGF0ZWRWYWx1ZXMpLCB7IFtrZXldOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCBuZXdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdFZhbHVlcyh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgb25WYWx1ZXNDaGFuZ2UgPT09IG51bGwgfHwgb25WYWx1ZXNDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmFsdWVzQ2hhbmdlKG5ld1ZhbHVlcywgdXBkYXRlZFZhbHVlcyk7XG4gICAgfSk7XG4gICAgLy8gU2VlZCB0aGUgcnVsZS1jb250ZXh0IGluc3RhbmNlIHdpdGggdGhlIGNvcmUgbWV0aG9kcyBleGFjdGx5IG9uY2Ug4oCUXG4gICAgLy8gdXNlRm9ybSdzIHJpY2hlciBpbnN0YW5jZSBtdXN0IG5vdCBiZSBkb3duZ3JhZGVkIG9uIGxhdGVyIHJlbmRlcnMuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJ1bGVDb250ZXh0SW5zdGFuY2VSZWYuY3VycmVudCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJ1bGVDb250ZXh0SW5zdGFuY2VSZWYuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGdldEZpZWxkVmFsdWUsXG4gICAgICAgICAgICBnZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgICAgICBzZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIHN1Ym1pdDogaGFuZGxlU3VibWl0SW50ZXJuYWwsXG4gICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICBnZXRGaWVsZFZhbHVlLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzLFxuICAgIH0pLCBbXG4gICAgICAgIGhhbmRsZVN1Ym1pdEludGVybmFsLFxuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkc1ZhbHVlLFxuICAgICAgICBzZXRGaWVsZFZhbHVlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkcyxcbiAgICBdKTtcbiAgICAvLyBSZW5kZXItdGltZSBzbmFwc2hvdCDigJQga2VwdCBmb3IgdGhlIFVzZUZvcm1Db3JlUmV0dXJuIGNvbnRyYWN0LiBSZWFjdGl2ZVxuICAgIC8vIGNvbnN1bWVycyBtdXN0IGdvIHRocm91Z2ggdGhlIHN0b3JlLCBuZXZlciB0aHJvdWdoIHRoZXNlIGZpZWxkcy5cbiAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29yZUNvbnRleHRTaGFwZSA9IHtcbiAgICAgICAgdmFsdWVzOiBzdGF0ZS52YWx1ZXMsXG4gICAgICAgIGVycm9yczogc3RhdGUuZXJyb3JzLFxuICAgICAgICB3YXJuaW5nczogc3RhdGUud2FybmluZ3MsXG4gICAgICAgIHRvdWNoZWQ6IHN0YXRlLnRvdWNoZWQsXG4gICAgICAgIGZvcm1JbnN0YW5jZSxcbiAgICAgICAgc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRFcnJvcixcbiAgICAgICAgc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICByZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGxhYmVsQWxpZ24sXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0ZVRyaWdnZXIsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZXM6IHN0YXRlLnZhbHVlcyxcbiAgICAgICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnMsXG4gICAgICAgIHdhcm5pbmdzOiBzdGF0ZS53YXJuaW5ncyxcbiAgICAgICAgdG91Y2hlZDogc3RhdGUudG91Y2hlZCxcbiAgICAgICAgLy8gTGl2ZSByZWdpc3RyeSDigJQgc3RhYmxlIGlkZW50aXR5LCBtdXRhdGVkIGluIHBsYWNlIGJ5IHJlZ2lzdGVyL3VucmVnaXN0ZXIuXG4gICAgICAgIGZpZWxkUnVsZXM6IGZpZWxkUnVsZXNSZWYuY3VycmVudCxcbiAgICAgICAgZ2V0RmllbGRSdWxlcyxcbiAgICAgICAgZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSxcbiAgICAgICAgc2V0UnVsZUNvbnRleHRJbnN0YW5jZSxcbiAgICAgICAgYmVnaW5WYWxpZGF0aW9uUnVuLFxuICAgICAgICBpc1ZhbGlkYXRpb25SdW5DdXJyZW50LFxuICAgICAgICBpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZyxcbiAgICAgICAgc2V0RmllbGRzVmFsdWUsXG4gICAgICAgIGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGdldEZpZWxkc1ZhbHVlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkcyxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdW5yZWdpc3RlckZpZWxkLFxuICAgICAgICByZXRhaW5GaWVsZCxcbiAgICAgICAgcmVsZWFzZUZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZm9ybUluc3RhbmNlLFxuICAgICAgICBjb3JlQ29udGV4dFNoYXBlLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlczogKCkgPT4gbW91bnRJbml0aWFsVmFsdWVzLFxuICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlRm9ybUNvcmU7Il0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==