@1money/component-ui 0.0.75 → 0.0.77

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 (153) hide show
  1. package/es/components/ProForm/ProForm.d.ts +1 -1
  2. package/es/components/ProForm/ProForm.js +46 -34
  3. package/es/components/ProForm/ProFormDependency.d.ts +2 -1
  4. package/es/components/ProForm/ProFormDependency.js +6 -16
  5. package/es/components/ProForm/ProFormItem.d.ts +7 -2
  6. package/es/components/ProForm/ProFormItem.js +5 -7
  7. package/es/components/ProForm/ProFormList.d.ts +6 -1
  8. package/es/components/ProForm/ProFormList.js +122 -42
  9. package/es/components/ProForm/SchemaForm.d.ts +1 -1
  10. package/es/components/ProForm/SchemaForm.js +8 -5
  11. package/es/components/ProForm/context.d.ts +8 -7
  12. package/es/components/ProForm/context.js +1 -1
  13. package/es/components/ProForm/core/constants.d.ts +3 -1
  14. package/es/components/ProForm/core/constants.js +8 -2
  15. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  16. package/es/components/ProForm/core/devWarning.js +22 -0
  17. package/es/components/ProForm/core/formStore.d.ts +14 -6
  18. package/es/components/ProForm/core/formStore.js +21 -2
  19. package/es/components/ProForm/core/hooks/useForm.d.ts +1 -1
  20. package/es/components/ProForm/core/hooks/useForm.js +275 -107
  21. package/es/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  22. package/es/components/ProForm/core/hooks/useFormCore.js +121 -121
  23. package/es/components/ProForm/core/interface.d.ts +157 -103
  24. package/es/components/ProForm/core/namePathType.d.ts +25 -0
  25. package/es/components/ProForm/core/namePathType.js +2 -0
  26. package/es/components/ProForm/core/pathUtils.d.ts +5 -3
  27. package/es/components/ProForm/core/pathUtils.js +19 -1
  28. package/es/components/ProForm/core/runRules.d.ts +40 -17
  29. package/es/components/ProForm/core/runRules.js +480 -136
  30. package/es/components/ProForm/core/useFormItem.d.ts +7 -8
  31. package/es/components/ProForm/core/useFormItem.js +52 -82
  32. package/es/components/ProForm/core/validationError.d.ts +13 -0
  33. package/es/components/ProForm/core/validationError.js +29 -0
  34. package/es/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  35. package/es/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  36. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  37. package/es/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  38. package/es/components/ProForm/fields/ProFormDatePicker.js +1 -1
  39. package/es/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  40. package/es/components/ProForm/fields/ProFormFieldSet.js +49 -12
  41. package/es/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  42. package/es/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  43. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  44. package/es/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  45. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  46. package/es/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  47. package/es/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  48. package/es/components/ProForm/fields/ProFormText.d.ts +1 -1
  49. package/es/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  50. package/es/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  51. package/es/components/ProForm/fields/ProFormUpload.js +1 -1
  52. package/es/components/ProForm/fields/createProFormField.d.ts +8 -2
  53. package/es/components/ProForm/fields/createProFormField.js +20 -27
  54. package/es/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  55. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  56. package/es/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  57. package/es/components/ProForm/hooks/useUrlSync.js +1 -1
  58. package/es/components/ProForm/index.d.ts +37 -27
  59. package/es/components/ProForm/index.js +4 -1
  60. package/es/components/ProForm/interface.d.ts +115 -119
  61. package/es/components/ProForm/layouts/DialogForm.d.ts +1 -1
  62. package/es/components/ProForm/layouts/DialogForm.js +1 -1
  63. package/es/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  64. package/es/components/ProForm/layouts/DrawerForm.js +1 -1
  65. package/es/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  66. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  67. package/es/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  68. package/es/components/ProForm/layouts/useOverlayForm.js +1 -1
  69. package/es/components/ProForm/utils.d.ts +15 -7
  70. package/es/components/ProForm/utils.js +51 -3
  71. package/es/components/Table/core/useTableSetup.js +2 -2
  72. package/es/components/Table/interface.d.ts +1 -1
  73. package/es/index.css +1 -1
  74. package/es/index.d.ts +1 -1
  75. package/es/index.js +1 -1
  76. package/lib/components/ProForm/ProForm.d.ts +1 -1
  77. package/lib/components/ProForm/ProForm.js +45 -33
  78. package/lib/components/ProForm/ProFormDependency.d.ts +2 -1
  79. package/lib/components/ProForm/ProFormDependency.js +5 -15
  80. package/lib/components/ProForm/ProFormItem.d.ts +7 -2
  81. package/lib/components/ProForm/ProFormItem.js +5 -7
  82. package/lib/components/ProForm/ProFormList.d.ts +6 -1
  83. package/lib/components/ProForm/ProFormList.js +120 -40
  84. package/lib/components/ProForm/SchemaForm.d.ts +1 -1
  85. package/lib/components/ProForm/SchemaForm.js +8 -5
  86. package/lib/components/ProForm/context.d.ts +8 -7
  87. package/lib/components/ProForm/context.js +1 -1
  88. package/lib/components/ProForm/core/constants.d.ts +3 -1
  89. package/lib/components/ProForm/core/constants.js +9 -3
  90. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  91. package/lib/components/ProForm/core/devWarning.js +29 -0
  92. package/lib/components/ProForm/core/formStore.d.ts +14 -6
  93. package/lib/components/ProForm/core/formStore.js +23 -2
  94. package/lib/components/ProForm/core/hooks/useForm.d.ts +1 -1
  95. package/lib/components/ProForm/core/hooks/useForm.js +271 -103
  96. package/lib/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  97. package/lib/components/ProForm/core/hooks/useFormCore.js +119 -119
  98. package/lib/components/ProForm/core/interface.d.ts +157 -103
  99. package/lib/components/ProForm/core/namePathType.d.ts +25 -0
  100. package/lib/components/ProForm/core/namePathType.js +6 -0
  101. package/lib/components/ProForm/core/pathUtils.d.ts +5 -3
  102. package/lib/components/ProForm/core/pathUtils.js +20 -1
  103. package/lib/components/ProForm/core/runRules.d.ts +40 -17
  104. package/lib/components/ProForm/core/runRules.js +483 -137
  105. package/lib/components/ProForm/core/useFormItem.d.ts +7 -8
  106. package/lib/components/ProForm/core/useFormItem.js +54 -84
  107. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  108. package/lib/components/ProForm/core/validationError.js +36 -0
  109. package/lib/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  110. package/lib/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  111. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  112. package/lib/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  113. package/lib/components/ProForm/fields/ProFormDatePicker.js +1 -1
  114. package/lib/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  115. package/lib/components/ProForm/fields/ProFormFieldSet.js +49 -12
  116. package/lib/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  117. package/lib/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  118. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  119. package/lib/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  120. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  121. package/lib/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  122. package/lib/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  123. package/lib/components/ProForm/fields/ProFormText.d.ts +1 -1
  124. package/lib/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  125. package/lib/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  126. package/lib/components/ProForm/fields/ProFormUpload.js +1 -1
  127. package/lib/components/ProForm/fields/createProFormField.d.ts +8 -2
  128. package/lib/components/ProForm/fields/createProFormField.js +20 -27
  129. package/lib/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  130. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  131. package/lib/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  132. package/lib/components/ProForm/hooks/useUrlSync.js +1 -1
  133. package/lib/components/ProForm/index.d.ts +37 -27
  134. package/lib/components/ProForm/index.js +10 -1
  135. package/lib/components/ProForm/interface.d.ts +115 -119
  136. package/lib/components/ProForm/layouts/DialogForm.d.ts +1 -1
  137. package/lib/components/ProForm/layouts/DialogForm.js +1 -1
  138. package/lib/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  139. package/lib/components/ProForm/layouts/DrawerForm.js +1 -1
  140. package/lib/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  141. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  142. package/lib/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  143. package/lib/components/ProForm/layouts/useOverlayForm.js +1 -1
  144. package/lib/components/ProForm/utils.d.ts +15 -7
  145. package/lib/components/ProForm/utils.js +52 -3
  146. package/lib/components/Table/core/useTableSetup.js +2 -2
  147. package/lib/components/Table/interface.d.ts +1 -1
  148. package/lib/index.css +1 -1
  149. package/lib/index.d.ts +1 -1
  150. package/lib/index.js +1 -1
  151. package/package.json +1 -1
  152. package/scripts/mcp-server/examples.generated.json +95 -53
  153. package/scripts/mcp-server/index.generated.json +1715 -185
@@ -4,11 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.coerceFailureReason = coerceFailureReason;
7
8
  exports.filterRulesByTrigger = filterRulesByTrigger;
9
+ exports.normalizeTriggers = normalizeTriggers;
10
+ exports.resolveRules = resolveRules;
8
11
  exports.runRulesAsync = runRulesAsync;
9
- exports.runRulesSync = runRulesSync;
10
12
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
14
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
15
+ var _pathUtils = require("./pathUtils");
16
+ var _devWarning = require("./devWarning");
12
17
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
13
18
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
19
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -39,212 +44,553 @@ var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P
39
44
  step((generator = generator.apply(thisArg, _arguments || [])).next());
40
45
  });
41
46
  };
42
- function isThenable(value) {
43
- return value !== null && (0, _typeof2["default"])(value) === 'object' && typeof value.then === 'function';
44
- }
45
47
  /** Empty for `required`: undefined / null / '' / empty array. */
46
48
  function isEmptyValue(value) {
47
49
  return value === undefined || value === null || value === '' || Array.isArray(value) && value.length === 0;
48
50
  }
49
51
  /**
50
- * Filter rules applicable to an interactive trigger. A rule WITHOUT an
51
- * explicit `validateTrigger` follows the form-level trigger; a rule WITH one
52
- * runs on exactly those trigger(s), regardless of the form-level setting.
53
- * Submit-time validation bypasses this filter and runs every rule.
52
+ * Coerce a thrown/rejected reason into displayable failure content:
53
+ * a non-empty Error.message or a non-empty plain string otherwise null
54
+ * (caller picks its fallback). Shared with the form-level last-resort nets.
55
+ */
56
+ function coerceFailureReason(reason) {
57
+ if (reason instanceof Error && reason.message) return reason.message;
58
+ if (typeof reason === 'string' && reason) return reason;
59
+ return null;
60
+ }
61
+ /**
62
+ * Failure message for a rejected/thrown custom validator:
63
+ * Error.message → plain string reason → rule.message → generic fallback.
64
+ */
65
+ function resolveFailureMessage(reason, rule) {
66
+ var _a;
67
+ return (_a = coerceFailureReason(reason)) !== null && _a !== void 0 ? _a : rule.message || 'Validation failed';
68
+ }
69
+ /**
70
+ * Resolve function-form rules into static rules. The
71
+ * context exposes the value snapshot the run was invoked with; function rules
72
+ * must be cheap and side-effect free — they may be resolved more than once
73
+ * per validation pass.
74
+ */
75
+ function resolveRules(rules, values, instance) {
76
+ // Fast path: no function rules → nothing to resolve, no ctx allocation.
77
+ // This also makes the engine-internal re-resolution of already-resolved
78
+ // arrays free.
79
+ if (!rules.some(function (rule) {
80
+ return typeof rule === 'function';
81
+ })) {
82
+ return rules;
83
+ }
84
+ // Live-instance members (setFieldsValue, getFieldError, …) are spread in
85
+ // when available; the reads always come from the validation-time snapshot.
86
+ var ctx = Object.assign(Object.assign({}, instance), {
87
+ getFieldValue: function getFieldValue(name) {
88
+ return (0, _pathUtils.resolveValue)(values, name);
89
+ },
90
+ getFieldsValue: function getFieldsValue() {
91
+ return values;
92
+ }
93
+ });
94
+ return rules.map(function (rule) {
95
+ if (typeof rule !== 'function') return rule;
96
+ try {
97
+ return rule(ctx);
98
+ } catch (err) {
99
+ // A throwing rule factory must not crash rendering or validation —
100
+ // surface it as a rule that always fails with the thrown reason.
101
+ return {
102
+ validator: function validator() {
103
+ throw err;
104
+ }
105
+ };
106
+ }
107
+ });
108
+ }
109
+ /**
110
+ * Normalize a form/item-level validateTrigger config into the effective
111
+ * interactive event list: item-level (when present) overrides form-level;
112
+ * `false` disables interactive validation entirely.
54
113
  */
55
- function filterRulesByTrigger(rules, trigger, formTrigger) {
114
+ function normalizeTriggers(itemTrigger, formTrigger) {
115
+ var effective = itemTrigger === undefined ? formTrigger : itemTrigger;
116
+ if (effective === false) return [];
117
+ return Array.isArray(effective) ? effective : [effective];
118
+ }
119
+ /**
120
+ * Filter rules applicable to an interactive event: the event
121
+ * validates only when it is in the item's effective trigger set. Within the
122
+ * set, a rule WITHOUT `validateTrigger` runs on every event; a rule WITH one
123
+ * runs only on matching events — so a rule trigger outside the item's set
124
+ * never fires interactively. Submit-time validation bypasses this filter and
125
+ * runs every rule.
126
+ *
127
+ * Dev guard: a rule whose (non-empty) trigger set is fully OUTSIDE the
128
+ * active set can never fire interactively — usually a leftover of the
129
+ * pre-0.0.76 override semantics, so it warns once. `validateTrigger: []`
130
+ * is the deliberate submit-only idiom and stays silent.
131
+ */
132
+ function filterRulesByTrigger(rules, trigger, activeTriggers, fieldName) {
133
+ if (!activeTriggers.includes(trigger)) return [];
56
134
  return rules.filter(function (rule) {
57
135
  var ruleTrigger = rule.validateTrigger;
58
- if (!ruleTrigger) return formTrigger === trigger;
59
- return Array.isArray(ruleTrigger) ? ruleTrigger.includes(trigger) : ruleTrigger === trigger;
136
+ if (ruleTrigger === undefined) return true;
137
+ var ruleTriggers = Array.isArray(ruleTrigger) ? ruleTrigger : [ruleTrigger];
138
+ var matches = ruleTriggers.includes(trigger);
139
+ if (!matches && ruleTriggers.length > 0 && !ruleTriggers.some(function (t) {
140
+ return activeTriggers.includes(t);
141
+ })) {
142
+ var name = fieldName !== null && fieldName !== void 0 ? fieldName : '(any)';
143
+ (0, _devWarning.devWarnOnce)("trigger:".concat(name, ":").concat(ruleTriggers.join(',')), "[ProForm] Field \"".concat(name, "\": rule validateTrigger [").concat(ruleTriggers.join(', '), "] is outside this field's active trigger set [").concat(activeTriggers.join(', '), "] \u2014 the rule will only run on submit. Include it in the item/form validateTrigger to run it interactively."));
144
+ }
145
+ return matches;
60
146
  });
61
147
  }
148
+ /** Built-in `type` checks. `enum` is handled separately against `rule.enum`. */
149
+ var TYPE_CHECKS = {
150
+ string: function string(v) {
151
+ return typeof v === 'string';
152
+ },
153
+ number: function number(v) {
154
+ return typeof v === 'number' && !Number.isNaN(v);
155
+ },
156
+ "boolean": function boolean(v) {
157
+ return typeof v === 'boolean';
158
+ },
159
+ method: function method(v) {
160
+ return typeof v === 'function';
161
+ },
162
+ integer: function integer(v) {
163
+ return typeof v === 'number' && Number.isInteger(v);
164
+ },
165
+ "float": function float(v) {
166
+ return typeof v === 'number' && !Number.isNaN(v) && !Number.isInteger(v);
167
+ },
168
+ array: function array(v) {
169
+ return Array.isArray(v);
170
+ },
171
+ object: function object(v) {
172
+ return (0, _typeof2["default"])(v) === 'object' && v !== null && !Array.isArray(v);
173
+ },
174
+ date: function date(v) {
175
+ return v instanceof Date ? !Number.isNaN(v.getTime()) : typeof (v === null || v === void 0 ? void 0 : v.getTime) === 'function' && !Number.isNaN(v.getTime());
176
+ },
177
+ regexp: function regexp(v) {
178
+ if (v instanceof RegExp) return true;
179
+ if (typeof v !== 'string') return false;
180
+ try {
181
+ new RegExp(v);
182
+ return true;
183
+ } catch (_a) {
184
+ return false;
185
+ }
186
+ },
187
+ hex: function hex(v) {
188
+ return typeof v === 'string' && /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i.test(v);
189
+ },
190
+ // String-only: coercing via String() would let e.g. ['a@b.co'] stringify
191
+ // into a passing value.
192
+ email: function email(v) {
193
+ return typeof v === 'string' && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v);
194
+ },
195
+ url: function url(v) {
196
+ if (typeof v !== 'string') return false;
197
+ try {
198
+ new URL(v);
199
+ return true;
200
+ } catch (_a) {
201
+ return false;
202
+ }
203
+ }
204
+ };
205
+ /** Friendly generated messages for the legacy type names; others get a generic one. */
206
+ function typeFailureMessage(name, type) {
207
+ if (type === 'number') return "".concat(name, " must be a number");
208
+ if (type === 'email') return "".concat(name, " must be a valid email");
209
+ if (type === 'url') return "".concat(name, " must be a valid URL");
210
+ return "".concat(name, " is not a valid ").concat(type);
211
+ }
212
+ /** Measure a value for len/min/max: string → length, array → count, number → value. */
213
+ function measureValue(value) {
214
+ if (typeof value === 'string') return {
215
+ measured: value.length,
216
+ unit: ' characters'
217
+ };
218
+ if (Array.isArray(value)) return {
219
+ measured: value.length,
220
+ unit: ' items'
221
+ };
222
+ if (typeof value === 'number' && !Number.isNaN(value)) return {
223
+ measured: value,
224
+ unit: ''
225
+ };
226
+ return null;
227
+ }
62
228
  /**
63
229
  * Evaluate every built-in (non-`validator`) rule kind for a single rule.
64
- * Returns the error message for the first failing check, or null.
230
+ * Returns the error content for the first failing check, or null.
231
+ *
232
+ * Empty values (undefined / null / '' / empty array) are only checked by
233
+ * `required` — every other builtin check is skipped, so optional fields
234
+ * don't error until they have content. Custom validators are NOT subject to
235
+ * this skip (they receive the empty value and decide themselves).
65
236
  */
66
237
  function checkBuiltinRules(rule, value, name) {
67
238
  if (rule.required && isEmptyValue(value)) {
68
239
  return rule.message || "".concat(name, " is required");
69
240
  }
70
- // min/max: string → length, array → item count, number → numeric value
71
- if (rule.min !== undefined || rule.max !== undefined) {
72
- var measured = null;
73
- var unit = '';
74
- if (typeof value === 'string') {
75
- measured = value.length;
76
- unit = ' characters';
77
- } else if (Array.isArray(value)) {
78
- measured = value.length;
79
- unit = ' items';
80
- } else if (typeof value === 'number' && !Number.isNaN(value)) {
81
- measured = value;
241
+ if (isEmptyValue(value)) return null;
242
+ // Non-empty string of only whitespace (the required+whitespace trim idiom).
243
+ if (rule.whitespace && typeof value === 'string' && value.trim() === '') {
244
+ return rule.message || "".concat(name, " cannot be blank");
245
+ }
246
+ // len: exact length/count/value — takes precedence over min/max.
247
+ if (rule.len !== undefined) {
248
+ var m = measureValue(value);
249
+ if (m !== null && m.measured !== rule.len) {
250
+ return rule.message || "".concat(name, " must be exactly ").concat(rule.len).concat(m.unit);
82
251
  }
83
- if (measured !== null) {
84
- if (rule.min !== undefined && measured < rule.min) {
85
- return rule.message || "".concat(name, " must be at least ").concat(rule.min).concat(unit);
252
+ } else if (rule.min !== undefined || rule.max !== undefined) {
253
+ var _m = measureValue(value);
254
+ if (_m !== null) {
255
+ if (rule.min !== undefined && _m.measured < rule.min) {
256
+ return rule.message || "".concat(name, " must be at least ").concat(rule.min).concat(_m.unit);
86
257
  }
87
- if (rule.max !== undefined && measured > rule.max) {
88
- return rule.message || "".concat(name, " must be no more than ").concat(rule.max).concat(unit);
258
+ if (rule.max !== undefined && _m.measured > rule.max) {
259
+ return rule.message || "".concat(name, " must be no more than ").concat(rule.max).concat(_m.unit);
89
260
  }
90
261
  }
91
262
  }
92
- if (rule.pattern && typeof value === 'string' && !rule.pattern.test(value)) {
93
- return rule.message || "".concat(name, " format is invalid");
94
- }
95
- if (rule["enum"] && Array.isArray(rule["enum"]) && value) {
96
- if (!rule["enum"].includes(value)) {
97
- return rule.message || "".concat(name, " must be one of ").concat(rule["enum"].join(', '));
263
+ if (rule.pattern && typeof value === 'string') {
264
+ // A /g or /y regex is stateful: lastIndex persists across .test() calls,
265
+ // so repeated runs would alternate pass/fail — reset it every run.
266
+ if (rule.pattern.global || rule.pattern.sticky) rule.pattern.lastIndex = 0;
267
+ if (!rule.pattern.test(value)) {
268
+ return rule.message || "".concat(name, " format is invalid");
98
269
  }
99
270
  }
100
- if (rule.type === 'number' && value !== undefined && value !== null && value !== '') {
101
- if (typeof value !== 'number' || isNaN(value)) {
102
- return rule.message || "".concat(name, " must be a number");
103
- }
271
+ if (rule.type && rule.type !== 'enum' && !TYPE_CHECKS[rule.type](value)) {
272
+ return rule.message || typeFailureMessage(name, rule.type);
104
273
  }
105
- if (rule.type === 'email' && value) {
106
- var emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
107
- if (!emailPattern.test(String(value))) {
108
- return rule.message || "".concat(name, " must be a valid email");
109
- }
110
- }
111
- if (rule.type === 'url' && value) {
112
- try {
113
- new URL(String(value));
114
- } catch (_a) {
115
- return rule.message || "".concat(name, " must be a valid URL");
116
- }
274
+ // enum membership: applies for type 'enum' or whenever rule.enum is present.
275
+ if (rule["enum"] && Array.isArray(rule["enum"]) && !rule["enum"].includes(value)) {
276
+ return rule.message || "".concat(name, " must be one of ").concat(rule["enum"].join(', '));
117
277
  }
118
278
  return null;
119
279
  }
280
+ function toRuleArray(rules) {
281
+ if (!rules) return [];
282
+ return Array.isArray(rules) ? rules : [rules];
283
+ }
284
+ /** Members for deep rules: array → indexed entries, plain object → key entries. */
285
+ function deepMembers(value) {
286
+ if (Array.isArray(value)) return value.map(function (member, index) {
287
+ return [String(index), member];
288
+ });
289
+ if (value && (0, _typeof2["default"])(value) === 'object') return Object.entries(value);
290
+ return [];
291
+ }
292
+ var PASS = {
293
+ error: null,
294
+ warning: null
295
+ };
120
296
  /**
121
- * Synchronous rule run. A Promise-returning validator CANNOT be evaluated
122
- * here it is deferred (treated as passing for this run; its rejection is
123
- * swallowed) and left to the async runs (blur/submit), which always await it.
124
- * Failing it instead would mis-report "Validation failed" on every keystroke
125
- * for perfectly valid input.
297
+ * Dev guard for the pre-0.0.76 validator contract: returning a string or
298
+ * `false` used to FAIL the rule under the `(rule, value)` contract return
299
+ * values are ignored and only throw/reject fails. Such a return is almost
300
+ * certainly a legacy validator silently passing, so it warns once.
126
301
  */
127
- function runRulesSync(name, value, values, rules) {
128
- var warning = null;
129
- var _iterator = _createForOfIteratorHelper(rules),
130
- _step;
302
+ function warnLegacyValidatorReturn(name, result) {
303
+ if (typeof result !== 'string' && result !== false) return;
304
+ (0, _devWarning.devWarnOnce)("validator-return:".concat(name), "[ProForm] Field \"".concat(name, "\": a custom validator returned ").concat(typeof result === 'string' ? 'a string' : 'false', " \u2014 return values are IGNORED; validators fail by throwing or rejecting (a thrown Error's message becomes the field error)."));
305
+ }
306
+ /** Run a rule's transform, containing throws as a rule failure. */
307
+ function applyTransform(rule, rawValue) {
308
+ if (typeof rule.transform !== 'function') return {
309
+ ok: true,
310
+ value: rawValue
311
+ };
131
312
  try {
132
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
133
- var rule = _step.value;
134
- var failure = checkBuiltinRules(rule, value, name);
135
- if (failure === null && typeof rule.validator === 'function') {
313
+ return {
314
+ ok: true,
315
+ value: rule.transform(rawValue)
316
+ };
317
+ } catch (err) {
318
+ return {
319
+ ok: false,
320
+ failure: resolveFailureMessage(err, rule)
321
+ };
322
+ }
323
+ }
324
+ /**
325
+ * Flatten a rule's deep sources (`fields` per key, then `defaultField` per
326
+ * member) into [subRule, memberValue, memberName] tuples — the single place
327
+ * that knows how deep rules map onto a container value.
328
+ */
329
+ function deepRuleEntries(rule, value, name) {
330
+ var entries = [];
331
+ if (rule.fields) {
332
+ var source = value;
333
+ for (var _i = 0, _Object$entries = Object.entries(rule.fields); _i < _Object$entries.length; _i++) {
334
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
335
+ key = _Object$entries$_i[0],
336
+ subRules = _Object$entries$_i[1];
337
+ var _iterator = _createForOfIteratorHelper(toRuleArray(subRules)),
338
+ _step;
339
+ try {
340
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
341
+ var subRule = _step.value;
342
+ entries.push([subRule, source[key], "".concat(name, ".").concat(key)]);
343
+ }
344
+ } catch (err) {
345
+ _iterator.e(err);
346
+ } finally {
347
+ _iterator.f();
348
+ }
349
+ }
350
+ }
351
+ if (rule.defaultField) {
352
+ var _iterator2 = _createForOfIteratorHelper(deepMembers(value)),
353
+ _step2;
354
+ try {
355
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
356
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
357
+ _key = _step2$value[0],
358
+ member = _step2$value[1];
359
+ var _iterator3 = _createForOfIteratorHelper(toRuleArray(rule.defaultField)),
360
+ _step3;
136
361
  try {
137
- var result = rule.validator(value, values);
138
- if (isThenable(result)) {
139
- result.then(undefined, function () {});
140
- } else if (result !== true) {
141
- failure = typeof result === 'string' ? result : 'Validation failed';
362
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
363
+ var _subRule = _step3.value;
364
+ entries.push([_subRule, member, "".concat(name, ".").concat(_key)]);
142
365
  }
143
366
  } catch (err) {
144
- failure = err instanceof Error ? err.message : 'Validation error';
145
- }
146
- }
147
- if (failure !== null) {
148
- if (rule.warningOnly) {
149
- warning = warning !== null && warning !== void 0 ? warning : failure;
150
- } else {
151
- return {
152
- error: failure,
153
- warning: warning
154
- };
367
+ _iterator3.e(err);
368
+ } finally {
369
+ _iterator3.f();
155
370
  }
156
371
  }
372
+ } catch (err) {
373
+ _iterator2.e(err);
374
+ } finally {
375
+ _iterator2.f();
157
376
  }
158
- } catch (err) {
159
- _iterator.e(err);
160
- } finally {
161
- _iterator.f();
162
377
  }
163
- return {
164
- error: null,
165
- warning: warning
166
- };
378
+ return entries;
167
379
  }
168
380
  /**
169
- * Asynchronous rule run. Custom validators are awaited (sync or async). A
170
- * validator returning `undefined` is treated as passing.
381
+ * Merge a sub-rule's outcome into the parent's channels. A sub-rule flagged
382
+ * `warningOnly` contributes its failure as a WARNING; otherwise its error
383
+ * blocks. Returns true when a blocking error landed (stop walking).
171
384
  */
172
- function runRulesAsync(name, value, values, rules) {
385
+ function mergeSubResult(acc, subRule, sub) {
386
+ if (sub.warning !== null && acc.warning === null) acc.warning = sub.warning;
387
+ if (sub.error !== null) {
388
+ if (subRule.warningOnly) {
389
+ if (acc.warning === null) acc.warning = sub.error;
390
+ } else {
391
+ acc.error = sub.error;
392
+ return true;
393
+ }
394
+ }
395
+ return false;
396
+ }
397
+ /**
398
+ * Fold one rule's outcome into the run-level channels. A rule flagged
399
+ * `warningOnly` downgrades everything it produced (own checks AND deep
400
+ * sub-rules) to a warning. Returns the blocking error to surface, or null.
401
+ */
402
+ function foldRuleResult(rule, result, state) {
403
+ var _a;
404
+ if (rule.warningOnly) {
405
+ var content = (_a = result.error) !== null && _a !== void 0 ? _a : result.warning;
406
+ if (content !== null && state.warning === null) state.warning = content;
407
+ return null;
408
+ }
409
+ if (result.warning !== null && state.warning === null) state.warning = result.warning;
410
+ return result.error;
411
+ }
412
+ /** Evaluate ONE rule (transform → builtin checks → validator → deep rules); custom validators are awaited. */
413
+ function evalRuleAsync(rule, rawValue, name) {
173
414
  return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee() {
174
- var warning, _iterator2, _step2, rule, failure, result, _t, _t2;
415
+ var prep, value, failure, result, acc, _iterator4, _step4, _step4$value, subRule, subValue, subName, _t, _t2, _t3, _t4, _t5;
175
416
  return _regenerator["default"].wrap(function (_context) {
176
417
  while (1) switch (_context.prev = _context.next) {
177
418
  case 0:
178
- warning = null;
179
- _iterator2 = _createForOfIteratorHelper(rules);
180
- _context.prev = 1;
181
- _iterator2.s();
182
- case 2:
183
- if ((_step2 = _iterator2.n()).done) {
184
- _context.next = 9;
419
+ prep = applyTransform(rule, rawValue);
420
+ if (prep.ok) {
421
+ _context.next = 1;
185
422
  break;
186
423
  }
187
- rule = _step2.value;
424
+ return _context.abrupt("return", {
425
+ error: prep.failure,
426
+ warning: null
427
+ });
428
+ case 1:
429
+ value = prep.value;
188
430
  failure = checkBuiltinRules(rule, value, name);
189
431
  if (!(failure === null && typeof rule.validator === 'function')) {
190
- _context.next = 6;
432
+ _context.next = 5;
191
433
  break;
192
434
  }
193
- _context.prev = 3;
194
- _context.next = 4;
195
- return Promise.resolve(rule.validator(value, values));
196
- case 4:
435
+ _context.prev = 2;
436
+ _context.next = 3;
437
+ return rule.validator(rule, value);
438
+ case 3:
197
439
  result = _context.sent;
198
- if (result !== true && result !== undefined) {
199
- failure = typeof result === 'string' ? result : 'Validation failed';
200
- }
201
- _context.next = 6;
440
+ warnLegacyValidatorReturn(name, result);
441
+ _context.next = 5;
202
442
  break;
443
+ case 4:
444
+ _context.prev = 4;
445
+ _t = _context["catch"](2);
446
+ failure = resolveFailureMessage(_t, rule);
203
447
  case 5:
204
- _context.prev = 5;
205
- _t = _context["catch"](3);
206
- failure = _t instanceof Error ? _t.message : 'Validation error';
207
- case 6:
208
448
  if (!(failure !== null)) {
209
- _context.next = 8;
449
+ _context.next = 6;
450
+ break;
451
+ }
452
+ return _context.abrupt("return", {
453
+ error: failure,
454
+ warning: null
455
+ });
456
+ case 6:
457
+ if (!((rule.fields || rule.defaultField) && !isEmptyValue(value))) {
458
+ _context.next = 16;
210
459
  break;
211
460
  }
212
- if (!rule.warningOnly) {
461
+ if (!((0, _typeof2["default"])(value) !== 'object' || value === null)) {
213
462
  _context.next = 7;
214
463
  break;
215
464
  }
216
- warning = warning !== null && warning !== void 0 ? warning : failure;
217
- _context.next = 8;
218
- break;
219
- case 7:
220
465
  return _context.abrupt("return", {
221
- error: failure,
222
- warning: warning
466
+ error: rule.message || "".concat(name, " must be an object or an array"),
467
+ warning: null
223
468
  });
469
+ case 7:
470
+ acc = {
471
+ error: null,
472
+ warning: null
473
+ };
474
+ _iterator4 = _createForOfIteratorHelper(deepRuleEntries(rule, value, name));
475
+ _context.prev = 8;
476
+ _iterator4.s();
477
+ case 9:
478
+ if ((_step4 = _iterator4.n()).done) {
479
+ _context.next = 12;
480
+ break;
481
+ }
482
+ _step4$value = (0, _slicedToArray2["default"])(_step4.value, 3), subRule = _step4$value[0], subValue = _step4$value[1], subName = _step4$value[2];
483
+ _t2 = mergeSubResult;
484
+ _t3 = acc;
485
+ _t4 = subRule;
486
+ _context.next = 10;
487
+ return evalRuleAsync(subRule, subValue, subName);
488
+ case 10:
489
+ if (!_t2(_t3, _t4, _context.sent)) {
490
+ _context.next = 11;
491
+ break;
492
+ }
493
+ return _context.abrupt("continue", 12);
494
+ case 11:
495
+ _context.next = 9;
496
+ break;
497
+ case 12:
498
+ _context.next = 14;
499
+ break;
500
+ case 13:
501
+ _context.prev = 13;
502
+ _t5 = _context["catch"](8);
503
+ _iterator4.e(_t5);
504
+ case 14:
505
+ _context.prev = 14;
506
+ _iterator4.f();
507
+ return _context.finish(14);
508
+ case 15:
509
+ return _context.abrupt("return", acc);
510
+ case 16:
511
+ return _context.abrupt("return", PASS);
512
+ case 17:
513
+ case "end":
514
+ return _context.stop();
515
+ }
516
+ }, _callee, null, [[2, 4], [8, 13, 14, 15]]);
517
+ }));
518
+ }
519
+ /**
520
+ * Rule run. Custom validators are awaited (sync or async): resolving passes,
521
+ * rejecting/throwing fails. Return values are ignored.
522
+ *
523
+ * The per-rule try/catch is the totality choke point: NO input — including
524
+ * exotic values that break a builtin check — may escape as a throw; every
525
+ * failure surfaces through the error/warning channels.
526
+ */
527
+ function runRulesAsync(name, value, values, rules, instance) {
528
+ return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
529
+ var state, _iterator5, _step5, rule, result, error, _t6, _t7;
530
+ return _regenerator["default"].wrap(function (_context2) {
531
+ while (1) switch (_context2.prev = _context2.next) {
532
+ case 0:
533
+ state = {
534
+ warning: null
535
+ };
536
+ _iterator5 = _createForOfIteratorHelper(resolveRules(rules, values, instance));
537
+ _context2.prev = 1;
538
+ _iterator5.s();
539
+ case 2:
540
+ if ((_step5 = _iterator5.n()).done) {
541
+ _context2.next = 8;
542
+ break;
543
+ }
544
+ rule = _step5.value;
545
+ result = void 0;
546
+ _context2.prev = 3;
547
+ _context2.next = 4;
548
+ return evalRuleAsync(rule, value, name);
549
+ case 4:
550
+ result = _context2.sent;
551
+ _context2.next = 6;
552
+ break;
553
+ case 5:
554
+ _context2.prev = 5;
555
+ _t6 = _context2["catch"](3);
556
+ result = {
557
+ error: resolveFailureMessage(_t6, rule),
558
+ warning: null
559
+ };
560
+ case 6:
561
+ error = foldRuleResult(rule, result, state);
562
+ if (!(error !== null)) {
563
+ _context2.next = 7;
564
+ break;
565
+ }
566
+ return _context2.abrupt("return", {
567
+ error: error,
568
+ warning: state.warning
569
+ });
570
+ case 7:
571
+ _context2.next = 2;
572
+ break;
224
573
  case 8:
225
- _context.next = 2;
574
+ _context2.next = 10;
226
575
  break;
227
576
  case 9:
228
- _context.next = 11;
229
- break;
577
+ _context2.prev = 9;
578
+ _t7 = _context2["catch"](1);
579
+ _iterator5.e(_t7);
230
580
  case 10:
231
- _context.prev = 10;
232
- _t2 = _context["catch"](1);
233
- _iterator2.e(_t2);
581
+ _context2.prev = 10;
582
+ _iterator5.f();
583
+ return _context2.finish(10);
234
584
  case 11:
235
- _context.prev = 11;
236
- _iterator2.f();
237
- return _context.finish(11);
238
- case 12:
239
- return _context.abrupt("return", {
585
+ return _context2.abrupt("return", {
240
586
  error: null,
241
- warning: warning
587
+ warning: state.warning
242
588
  });
243
- case 13:
589
+ case 12:
244
590
  case "end":
245
- return _context.stop();
591
+ return _context2.stop();
246
592
  }
247
- }, _callee, null, [[1, 10, 11, 12], [3, 5]]);
593
+ }, _callee2, null, [[1, 9, 10, 11], [3, 5]]);
248
594
  }));
249
595
  }
250
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3J1blJ1bGVzLmpzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJpc1RoZW5hYmxlIiwiX3R5cGVvZjIiLCJpc0VtcHR5VmFsdWUiLCJ1bmRlZmluZWQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJmaWx0ZXJSdWxlc0J5VHJpZ2dlciIsInJ1bGVzIiwidHJpZ2dlciIsImZvcm1UcmlnZ2VyIiwiZmlsdGVyIiwicnVsZSIsInJ1bGVUcmlnZ2VyIiwidmFsaWRhdGVUcmlnZ2VyIiwiaW5jbHVkZXMiLCJjaGVja0J1aWx0aW5SdWxlcyIsIm5hbWUiLCJyZXF1aXJlZCIsIm1lc3NhZ2UiLCJjb25jYXQiLCJtaW4iLCJtYXgiLCJtZWFzdXJlZCIsInVuaXQiLCJOdW1iZXIiLCJpc05hTiIsInBhdHRlcm4iLCJ0ZXN0Iiwiam9pbiIsInR5cGUiLCJlbWFpbFBhdHRlcm4iLCJTdHJpbmciLCJVUkwiLCJfYSIsInJ1blJ1bGVzU3luYyIsInZhbHVlcyIsIndhcm5pbmciLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJmYWlsdXJlIiwidmFsaWRhdG9yIiwiZXJyIiwiRXJyb3IiLCJ3YXJuaW5nT25seSIsImVycm9yIiwiZiIsInJ1blJ1bGVzQXN5bmMiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfdCIsIl90MiIsIndy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QUEsQ0FDaEMsRUFBQTtBRGxDRCIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4vKiogRW1wdHkgZm9yIGByZXF1aXJlZGA6IHVuZGVmaW5lZCAvIG51bGwgLyAnJyAvIGVtcHR5IGFycmF5LiAqL1xuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgIHZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSk7XG59XG4vKipcbiAqIEZpbHRlciBydWxlcyBhcHBsaWNhYmxlIHRvIGFuIGludGVyYWN0aXZlIHRyaWdnZXIuIEEgcnVsZSBXSVRIT1VUIGFuXG4gKiBleHBsaWNpdCBgdmFsaWRhdGVUcmlnZ2VyYCBmb2xsb3dzIHRoZSBmb3JtLWxldmVsIHRyaWdnZXI7IGEgcnVsZSBXSVRIIG9uZVxuICogcnVucyBvbiBleGFjdGx5IHRob3NlIHRyaWdnZXIocyksIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm0tbGV2ZWwgc2V0dGluZy5cbiAqIFN1Ym1pdC10aW1lIHZhbGlkYXRpb24gYnlwYXNzZXMgdGhpcyBmaWx0ZXIgYW5kIHJ1bnMgZXZlcnkgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJ1bGVzQnlUcmlnZ2VyKHJ1bGVzLCB0cmlnZ2VyLCBmb3JtVHJpZ2dlcikge1xuICAgIHJldHVybiBydWxlcy5maWx0ZXIoKHJ1bGUpID0+IHtcbiAgICAgICAgY29uc3QgcnVsZVRyaWdnZXIgPSBydWxlLnZhbGlkYXRlVHJpZ2dlcjtcbiAgICAgICAgaWYgKCFydWxlVHJpZ2dlcilcbiAgICAgICAgICAgIHJldHVybiBmb3JtVHJpZ2dlciA9PT0gdHJpZ2dlcjtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocnVsZVRyaWdnZXIpXG4gICAgICAgICAgICA/IHJ1bGVUcmlnZ2VyLmluY2x1ZGVzKHRyaWdnZXIpXG4gICAgICAgICAgICA6IHJ1bGVUcmlnZ2VyID09PSB0cmlnZ2VyO1xuICAgIH0pO1xufVxuLyoqXG4gKiBFdmFsdWF0ZSBldmVyeSBidWlsdC1pbiAobm9uLWB2YWxpZGF0b3JgKSBydWxlIGtpbmQgZm9yIGEgc2luZ2xlIHJ1bGUuXG4gKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgZmlyc3QgZmFpbGluZyBjaGVjaywgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tCdWlsdGluUnVsZXMocnVsZSwgdmFsdWUsIG5hbWUpIHtcbiAgICBpZiAocnVsZS5yZXF1aXJlZCAmJiBpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gaXMgcmVxdWlyZWRgO1xuICAgIH1cbiAgICAvLyBtaW4vbWF4OiBzdHJpbmcg4oaSIGxlbmd0aCwgYXJyYXkg4oaSIGl0ZW0gY291bnQsIG51bWJlciDihpIgbnVtZXJpYyB2YWx1ZVxuICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkIHx8IHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG1lYXN1cmVkID0gbnVsbDtcbiAgICAgICAgbGV0IHVuaXQgPSAnJztcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1lYXN1cmVkID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdW5pdCA9ICcgY2hhcmFjdGVycyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIG1lYXN1cmVkID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdW5pdCA9ICcgaXRlbXMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIG1lYXN1cmVkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lYXN1cmVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBtZWFzdXJlZCA8IHJ1bGUubWluKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGF0IGxlYXN0ICR7cnVsZS5taW59JHt1bml0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZS5tYXggIT09IHVuZGVmaW5lZCAmJiBtZWFzdXJlZCA+IHJ1bGUubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIG5vIG1vcmUgdGhhbiAke3J1bGUubWF4fSR7dW5pdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnBhdHRlcm4gJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gZm9ybWF0IGlzIGludmFsaWRgO1xuICAgIH1cbiAgICBpZiAocnVsZS5lbnVtICYmIEFycmF5LmlzQXJyYXkocnVsZS5lbnVtKSAmJiB2YWx1ZSkge1xuICAgICAgICBpZiAoIXJ1bGUuZW51bS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBvbmUgb2YgJHtydWxlLmVudW0uam9pbignLCAnKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnR5cGUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGEgbnVtYmVyYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocnVsZS50eXBlID09PSAnZW1haWwnICYmIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGVtYWlsUGF0dGVybiA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xuICAgICAgICBpZiAoIWVtYWlsUGF0dGVybi50ZXN0KFN0cmluZyh2YWx1ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgYSB2YWxpZCBlbWFpbGA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGUudHlwZSA9PT0gJ3VybCcgJiYgdmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBVUkwoU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgYSB2YWxpZCBVUkxgO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBTeW5jaHJvbm91cyBydWxlIHJ1bi4gQSBQcm9taXNlLXJldHVybmluZyB2YWxpZGF0b3IgQ0FOTk9UIGJlIGV2YWx1YXRlZFxuICogaGVyZSDigJQgaXQgaXMgZGVmZXJyZWQgKHRyZWF0ZWQgYXMgcGFzc2luZyBmb3IgdGhpcyBydW47IGl0cyByZWplY3Rpb24gaXNcbiAqIHN3YWxsb3dlZCkgYW5kIGxlZnQgdG8gdGhlIGFzeW5jIHJ1bnMgKGJsdXIvc3VibWl0KSwgd2hpY2ggYWx3YXlzIGF3YWl0IGl0LlxuICogRmFpbGluZyBpdCBpbnN0ZWFkIHdvdWxkIG1pcy1yZXBvcnQgXCJWYWxpZGF0aW9uIGZhaWxlZFwiIG9uIGV2ZXJ5IGtleXN0cm9rZVxuICogZm9yIHBlcmZlY3RseSB2YWxpZCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJ1bGVzU3luYyhuYW1lLCB2YWx1ZSwgdmFsdWVzLCBydWxlcykge1xuICAgIGxldCB3YXJuaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgbGV0IGZhaWx1cmUgPSBjaGVja0J1aWx0aW5SdWxlcyhydWxlLCB2YWx1ZSwgbmFtZSk7XG4gICAgICAgIGlmIChmYWlsdXJlID09PSBudWxsICYmIHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRvcih2YWx1ZSwgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHVuZGVmaW5lZCwgKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1ZhbGlkYXRpb24gZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsdXJlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocnVsZS53YXJuaW5nT25seSkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcgPSB3YXJuaW5nICE9PSBudWxsICYmIHdhcm5pbmcgIT09IHZvaWQgMCA/IHdhcm5pbmcgOiBmYWlsdXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhaWx1cmUsIHdhcm5pbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgd2FybmluZyB9O1xufVxuLyoqXG4gKiBBc3luY2hyb25vdXMgcnVsZSBydW4uIEN1c3RvbSB2YWxpZGF0b3JzIGFyZSBhd2FpdGVkIChzeW5jIG9yIGFzeW5jKS4gQVxuICogdmFsaWRhdG9yIHJldHVybmluZyBgdW5kZWZpbmVkYCBpcyB0cmVhdGVkIGFzIHBhc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5SdWxlc0FzeW5jKG5hbWUsIHZhbHVlLCB2YWx1ZXMsIHJ1bGVzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHdhcm5pbmcgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIGxldCBmYWlsdXJlID0gY2hlY2tCdWlsdGluUnVsZXMocnVsZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGZhaWx1cmUgPT09IG51bGwgJiYgdHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgUHJvbWlzZS5yZXNvbHZlKHJ1bGUudmFsaWRhdG9yKHZhbHVlLCB2YWx1ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID8gcmVzdWx0IDogJ1ZhbGlkYXRpb24gZmFpbGVkJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1ZhbGlkYXRpb24gZXJyb3InO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmYWlsdXJlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUud2FybmluZ09ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IHdhcm5pbmcgIT09IG51bGwgJiYgd2FybmluZyAhPT0gdm9pZCAwID8gd2FybmluZyA6IGZhaWx1cmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogZmFpbHVyZSwgd2FybmluZyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgd2FybmluZyB9O1xuICAgIH0pO1xufSIsbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
596
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvcnVuUnVsZXMudHMiLCJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy5qcyJdLCJuYW1lcyI6WyJfcGF0aFV0aWxzIiwicmVxdWlyZSIsIl9kZXZXYXJuaW5nIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInJlc29sdmUiLCJQcm9taXNlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwic3RlcCIsInJlamVjdGVkIiwicmVzdWx0IiwidGhlbiIsImFwcGx5IiwiaXNFbXB0eVZhbHVlIiwidW5kZWZpbmVkIiwiY29lcmNlRmFpbHVyZVJlYXNvbiIsInJlYXNvbiIsIkVycm9yIiwibWVzc2FnZSIsInJlc29sdmVGYWlsdXJlTWVzc2FnZSIsInJ1bGUiLCJfYSIsInJlc29sdmVSdWxlcyIsInJ1bGVzIiwidmFsdWVzIiwiaW5zdGFuY2UiLCJzb21lIiwiY3R4IiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0RmllbGRWYWx1ZSIsInJlc29sdmVWYWx1ZSIsImdldEZpZWxkc1ZhbHVlIiwibWFwIiwiZXJyIiwidmFsaWRhdG9yIiwibm9ybWFsaXplVHJpZ2dlcnMiLCJpdGVtVHJpZ2dlciIsImZvcm1UcmlnZ2VyIiwiZWZmZWN0aXZlIiwiZmlsdGVyUnVsZXNCeVRyaWdnZXIiLCJ0cmlnZ2VyIiwiYWN0aXZlVHJpZ2dlcnMiLCJmaWVsZE5hbWUiLCJpbmNsdWRlcyIsImZpbHRlciIsInJ1bGVUcmlnZ2VyIiwidmFsaWRhdGVUcmlnZ2VyIiwicnVsZVRyaWdnZXJzIiwibWF0Y2hlcyIsImRldldhcm5PbmNlIiwiY29uY2F0Iiwiam9pbiIsIlRZUEVfQ0hFQ0tTIiwic3RyaW5nIiwidiIsIm51bWJlciIsIk51bWJlciIsImlzTmFOIiwiYm9vbGVhbiIsIm1ldGhvZCIsImludGVnZXIiLCJpc0ludGVnZXIiLCJmbG9hdCIsImFycmF5Iiwib2JqZWN0IiwiX3R5cGVvZjIiLCJkYXRlIiwiRGF0ZSIsImdldFRpbWUiLCJyZWdleHAiLCJSZWdFeHAiLCJoZXgiLCJlbWFpbCIsInVybCIsIlVSTCIsInR5cGVGYWlsdXJlTWVzc2FnZSIsInR5cGUiLCJtZWFzdXJlVmFsdWUiLCJtZWFzdXJlZCIsInVuaXQiLCJjaGVja0J1aWx0aW5SdWxlcyIsInJlcXVpcmVkIiwid2hpdGVzcGFjZSIsInRyaW0iLCJsZW4iLCJtIiwibWluIiwibWF4IiwicGF0dGVybiIsImdsb2JhbCIsInN0aWNreSIsImxhc3RJbmRleCIsInRvUnVsZUFycmF5IiwiZGVlcE1lbWJlcnMiLCJtZW1iZXIiLCJpbmRleCIsIlN0cmluZyIsImVudHJpZXMiLCJQQVNTIiwiZXJyb3IiLCJ3YXJuaW5nIiwid2FybkxlZ2FjeVZhbGlkYXRvclJldHVybiIsImFwcGx5VHJhbnNmb3JtIiwicmF3VmFsdWUiLCJ0cmFuc2Zvcm0iLCJvayIsImZhaWx1cmUiLCJkZWVwUnVsZUVudHJpZXMiLCJmaWVsZHMiLCJzb3VyY2UiLCJfaSIsIl9PYmplY3QkZW50cmllcyIsIl9PYmplY3QkZW50cmllcyRfaSIsIl9zbGljZWRUb0FycmF5MiIsImtleSIsInN1YlJ1bGVzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJzdWJSdWxlIiwicHVzaCIsImRlZmF1bHRGaWVsZCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwibWVyZ2VTdWJSZXN1bHQiLCJhY2MiLCJzdWIiLCJ3YXJuaW5nT25seSIsImZvbGRSdWxlUmVzdWx0Iiwic3RhdGUiLCJjb250ZW50IiwiZXZhbFJ1bGVBc3luYyIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicHJlcCIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJfc3RlcDQkdmFsdWUiLCJzdWJWYWx1ZSIsInN1Yk5hbWUiLCJfdCIsIl90MiIsIl90MyIsIl90NCIsIl90NSIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJhYnJ1cHQiLCJzZW50IiwiZmluaXNoIiwic3RvcCIsInJ1blJ1bGVzQXN5bmMiLCJfY2FsbGVlMiIsIl9pdGVyYXRvcjUiLCJfc3RlcDUiLCJfdDYiLCJfdDciLCJfY29udGV4dDIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQTJDLFNBQUFFLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFB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cyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuL3BhdGhVdGlscyc7XG5pbXBvcnQgeyBkZXZXYXJuT25jZSB9IGZyb20gJy4vZGV2V2FybmluZyc7XG4vKiogRW1wdHkgZm9yIGByZXF1aXJlZGA6IHVuZGVmaW5lZCAvIG51bGwgLyAnJyAvIGVtcHR5IGFycmF5LiAqL1xuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgIHZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSk7XG59XG4vKipcbiAqIENvZXJjZSBhIHRocm93bi9yZWplY3RlZCByZWFzb24gaW50byBkaXNwbGF5YWJsZSBmYWlsdXJlIGNvbnRlbnQ6XG4gKiBhIG5vbi1lbXB0eSBFcnJvci5tZXNzYWdlIG9yIGEgbm9uLWVtcHR5IHBsYWluIHN0cmluZyDigJQgb3RoZXJ3aXNlIG51bGxcbiAqIChjYWxsZXIgcGlja3MgaXRzIGZhbGxiYWNrKS4gU2hhcmVkIHdpdGggdGhlIGZvcm0tbGV2ZWwgbGFzdC1yZXNvcnQgbmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUZhaWx1cmVSZWFzb24ocmVhc29uKSB7XG4gICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yICYmIHJlYXNvbi5tZXNzYWdlKVxuICAgICAgICByZXR1cm4gcmVhc29uLm1lc3NhZ2U7XG4gICAgaWYgKHR5cGVvZiByZWFzb24gPT09ICdzdHJpbmcnICYmIHJlYXNvbilcbiAgICAgICAgcmV0dXJuIHJlYXNvbjtcbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogRmFpbHVyZSBtZXNzYWdlIGZvciBhIHJlamVjdGVkL3Rocm93biBjdXN0b20gdmFsaWRhdG9yOlxuICogRXJyb3IubWVzc2FnZSDihpIgcGxhaW4gc3RyaW5nIHJlYXNvbiDihpIgcnVsZS5tZXNzYWdlIOKGkiBnZW5lcmljIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRmFpbHVyZU1lc3NhZ2UocmVhc29uLCBydWxlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKHJlYXNvbikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChydWxlLm1lc3NhZ2UgfHwgJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XG59XG4vKipcbiAqIFJlc29sdmUgZnVuY3Rpb24tZm9ybSBydWxlcyBpbnRvIHN0YXRpYyBydWxlcy4gVGhlXG4gKiBjb250ZXh0IGV4cG9zZXMgdGhlIHZhbHVlIHNuYXBzaG90IHRoZSBydW4gd2FzIGludm9rZWQgd2l0aDsgZnVuY3Rpb24gcnVsZXNcbiAqIG11c3QgYmUgY2hlYXAgYW5kIHNpZGUtZWZmZWN0IGZyZWUg4oCUIHRoZXkgbWF5IGJlIHJlc29sdmVkIG1vcmUgdGhhbiBvbmNlXG4gKiBwZXIgdmFsaWRhdGlvbiBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJ1bGVzKHJ1bGVzLCB2YWx1ZXMsIGluc3RhbmNlKSB7XG4gICAgLy8gRmFzdCBwYXRoOiBubyBmdW5jdGlvbiBydWxlcyDihpIgbm90aGluZyB0byByZXNvbHZlLCBubyBjdHggYWxsb2NhdGlvbi5cbiAgICAvLyBUaGlzIGFsc28gbWFrZXMgdGhlIGVuZ2luZS1pbnRlcm5hbCByZS1yZXNvbHV0aW9uIG9mIGFscmVhZHktcmVzb2x2ZWRcbiAgICAvLyBhcnJheXMgZnJlZS5cbiAgICBpZiAoIXJ1bGVzLnNvbWUoKHJ1bGUpID0+IHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuICAgIC8vIExpdmUtaW5zdGFuY2UgbWVtYmVycyAoc2V0RmllbGRzVmFsdWUsIGdldEZpZWxkRXJyb3IsIOKApikgYXJlIHNwcmVhZCBpblxuICAgIC8vIHdoZW4gYXZhaWxhYmxlOyB0aGUgcmVhZHMgYWx3YXlzIGNvbWUgZnJvbSB0aGUgdmFsaWRhdGlvbi10aW1lIHNuYXBzaG90LlxuICAgIGNvbnN0IGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5zdGFuY2UpLCB7IGdldEZpZWxkVmFsdWU6IChuYW1lKSA9PiByZXNvbHZlVmFsdWUodmFsdWVzLCBuYW1lKSwgZ2V0RmllbGRzVmFsdWU6ICgpID0+IHZhbHVlcyB9KTtcbiAgICByZXR1cm4gcnVsZXMubWFwKChydWxlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUoY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBBIHRocm93aW5nIHJ1bGUgZmFjdG9yeSBtdXN0IG5vdCBjcmFzaCByZW5kZXJpbmcgb3IgdmFsaWRhdGlvbiDigJRcbiAgICAgICAgICAgIC8vIHN1cmZhY2UgaXQgYXMgYSBydWxlIHRoYXQgYWx3YXlzIGZhaWxzIHdpdGggdGhlIHRocm93biByZWFzb24uXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgZm9ybS9pdGVtLWxldmVsIHZhbGlkYXRlVHJpZ2dlciBjb25maWcgaW50byB0aGUgZWZmZWN0aXZlXG4gKiBpbnRlcmFjdGl2ZSBldmVudCBsaXN0OiBpdGVtLWxldmVsICh3aGVuIHByZXNlbnQpIG92ZXJyaWRlcyBmb3JtLWxldmVsO1xuICogYGZhbHNlYCBkaXNhYmxlcyBpbnRlcmFjdGl2ZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVHJpZ2dlcnMoaXRlbVRyaWdnZXIsIGZvcm1UcmlnZ2VyKSB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gaXRlbVRyaWdnZXIgPT09IHVuZGVmaW5lZCA/IGZvcm1UcmlnZ2VyIDogaXRlbVRyaWdnZXI7XG4gICAgaWYgKGVmZmVjdGl2ZSA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlZmZlY3RpdmUpID8gZWZmZWN0aXZlIDogW2VmZmVjdGl2ZV07XG59XG4vKipcbiAqIEZpbHRlciBydWxlcyBhcHBsaWNhYmxlIHRvIGFuIGludGVyYWN0aXZlIGV2ZW50OiB0aGUgZXZlbnRcbiAqIHZhbGlkYXRlcyBvbmx5IHdoZW4gaXQgaXMgaW4gdGhlIGl0ZW0ncyBlZmZlY3RpdmUgdHJpZ2dlciBzZXQuIFdpdGhpbiB0aGVcbiAqIHNldCwgYSBydWxlIFdJVEhPVVQgYHZhbGlkYXRlVHJpZ2dlcmAgcnVucyBvbiBldmVyeSBldmVudDsgYSBydWxlIFdJVEggb25lXG4gKiBydW5zIG9ubHkgb24gbWF0Y2hpbmcgZXZlbnRzIOKAlCBzbyBhIHJ1bGUgdHJpZ2dlciBvdXRzaWRlIHRoZSBpdGVtJ3Mgc2V0XG4gKiBuZXZlciBmaXJlcyBpbnRlcmFjdGl2ZWx5LiBTdWJtaXQtdGltZSB2YWxpZGF0aW9uIGJ5cGFzc2VzIHRoaXMgZmlsdGVyIGFuZFxuICogcnVucyBldmVyeSBydWxlLlxuICpcbiAqIERldiBndWFyZDogYSBydWxlIHdob3NlIChub24tZW1wdHkpIHRyaWdnZXIgc2V0IGlzIGZ1bGx5IE9VVFNJREUgdGhlXG4gKiBhY3RpdmUgc2V0IGNhbiBuZXZlciBmaXJlIGludGVyYWN0aXZlbHkg4oCUIHVzdWFsbHkgYSBsZWZ0b3ZlciBvZiB0aGVcbiAqIHByZS0wLjAuNzYgb3ZlcnJpZGUgc2VtYW50aWNzLCBzbyBpdCB3YXJucyBvbmNlLiBgdmFsaWRhdGVUcmlnZ2VyOiBbXWBcbiAqIGlzIHRoZSBkZWxpYmVyYXRlIHN1Ym1pdC1vbmx5IGlkaW9tIGFuZCBzdGF5cyBzaWxlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSdWxlc0J5VHJpZ2dlcihydWxlcywgdHJpZ2dlciwgYWN0aXZlVHJpZ2dlcnMsIGZpZWxkTmFtZSkge1xuICAgIGlmICghYWN0aXZlVHJpZ2dlcnMuaW5jbHVkZXModHJpZ2dlcikpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gcnVsZXMuZmlsdGVyKChydWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVUcmlnZ2VyID0gcnVsZS52YWxpZGF0ZVRyaWdnZXI7XG4gICAgICAgIGlmIChydWxlVHJpZ2dlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IHJ1bGVUcmlnZ2VycyA9IEFycmF5LmlzQXJyYXkocnVsZVRyaWdnZXIpID8gcnVsZVRyaWdnZXIgOiBbcnVsZVRyaWdnZXJdO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gcnVsZVRyaWdnZXJzLmluY2x1ZGVzKHRyaWdnZXIpO1xuICAgICAgICBpZiAoIW1hdGNoZXMgJiZcbiAgICAgICAgICAgIHJ1bGVUcmlnZ2Vycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAhcnVsZVRyaWdnZXJzLnNvbWUoKHQpID0+IGFjdGl2ZVRyaWdnZXJzLmluY2x1ZGVzKHQpKSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkTmFtZSAhPT0gbnVsbCAmJiBmaWVsZE5hbWUgIT09IHZvaWQgMCA/IGZpZWxkTmFtZSA6ICcoYW55KSc7XG4gICAgICAgICAgICBkZXZXYXJuT25jZShgdHJpZ2dlcjoke25hbWV9OiR7cnVsZVRyaWdnZXJzLmpvaW4oJywnKX1gLCBgW1Byb0Zvcm1dIEZpZWxkIFwiJHtuYW1lfVwiOiBydWxlIHZhbGlkYXRlVHJpZ2dlciBbJHtydWxlVHJpZ2dlcnMuam9pbignLCAnKX1dIGlzIG91dHNpZGUgdGhpcyBmaWVsZCdzIGFjdGl2ZSB0cmlnZ2VyIHNldCBbJHthY3RpdmVUcmlnZ2Vycy5qb2luKCcsICcpfV0g4oCUIHRoZSBydWxlIHdpbGwgb25seSBydW4gb24gc3VibWl0LiBJbmNsdWRlIGl0IGluIHRoZSBpdGVtL2Zvcm0gdmFsaWRhdGVUcmlnZ2VyIHRvIHJ1biBpdCBpbnRlcmFjdGl2ZWx5LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH0pO1xufVxuLyoqIEJ1aWx0LWluIGB0eXBlYCBjaGVja3MuIGBlbnVtYCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYWdhaW5zdCBgcnVsZS5lbnVtYC4gKi9cbmNvbnN0IFRZUEVfQ0hFQ0tTID0ge1xuICAgIHN0cmluZzogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyxcbiAgICBudW1iZXI6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih2KSxcbiAgICBib29sZWFuOiAodikgPT4gdHlwZW9mIHYgPT09ICdib29sZWFuJyxcbiAgICBtZXRob2Q6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyxcbiAgICBpbnRlZ2VyOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodiksXG4gICAgZmxvYXQ6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih2KSAmJiAhTnVtYmVyLmlzSW50ZWdlcih2KSxcbiAgICBhcnJheTogKHYpID0+IEFycmF5LmlzQXJyYXkodiksXG4gICAgb2JqZWN0OiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodiksXG4gICAgZGF0ZTogKHYpID0+IHYgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgID8gIU51bWJlci5pc05hTih2LmdldFRpbWUoKSlcbiAgICAgICAgOiB0eXBlb2YgKHYgPT09IG51bGwgfHwgdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdi5nZXRUaW1lKSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgIU51bWJlci5pc05hTih2LmdldFRpbWUoKSksXG4gICAgcmVnZXhwOiAodikgPT4ge1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IFJlZ0V4cCh2KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBoZXg6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2kudGVzdCh2KSxcbiAgICAvLyBTdHJpbmctb25seTogY29lcmNpbmcgdmlhIFN0cmluZygpIHdvdWxkIGxldCBlLmcuIFsnYUBiLmNvJ10gc3RyaW5naWZ5XG4gICAgLy8gaW50byBhIHBhc3NpbmcgdmFsdWUuXG4gICAgZW1haWw6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdCh2KSxcbiAgICB1cmw6ICh2KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdiAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgVVJMKHYpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxufTtcbi8qKiBGcmllbmRseSBnZW5lcmF0ZWQgbWVzc2FnZXMgZm9yIHRoZSBsZWdhY3kgdHlwZSBuYW1lczsgb3RoZXJzIGdldCBhIGdlbmVyaWMgb25lLiAqL1xuZnVuY3Rpb24gdHlwZUZhaWx1cmVNZXNzYWdlKG5hbWUsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBgJHtuYW1lfSBtdXN0IGJlIGEgbnVtYmVyYDtcbiAgICBpZiAodHlwZSA9PT0gJ2VtYWlsJylcbiAgICAgICAgcmV0dXJuIGAke25hbWV9IG11c3QgYmUgYSB2YWxpZCBlbWFpbGA7XG4gICAgaWYgKHR5cGUgPT09ICd1cmwnKVxuICAgICAgICByZXR1cm4gYCR7bmFtZX0gbXVzdCBiZSBhIHZhbGlkIFVSTGA7XG4gICAgcmV0dXJuIGAke25hbWV9IGlzIG5vdCBhIHZhbGlkICR7dHlwZX1gO1xufVxuLyoqIE1lYXN1cmUgYSB2YWx1ZSBmb3IgbGVuL21pbi9tYXg6IHN0cmluZyDihpIgbGVuZ3RoLCBhcnJheSDihpIgY291bnQsIG51bWJlciDihpIgdmFsdWUuICovXG5mdW5jdGlvbiBtZWFzdXJlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHsgbWVhc3VyZWQ6IHZhbHVlLmxlbmd0aCwgdW5pdDogJyBjaGFyYWN0ZXJzJyB9O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHsgbWVhc3VyZWQ6IHZhbHVlLmxlbmd0aCwgdW5pdDogJyBpdGVtcycgfTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHsgbWVhc3VyZWQ6IHZhbHVlLCB1bml0OiAnJyB9O1xuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBFdmFsdWF0ZSBldmVyeSBidWlsdC1pbiAobm9uLWB2YWxpZGF0b3JgKSBydWxlIGtpbmQgZm9yIGEgc2luZ2xlIHJ1bGUuXG4gKiBSZXR1cm5zIHRoZSBlcnJvciBjb250ZW50IGZvciB0aGUgZmlyc3QgZmFpbGluZyBjaGVjaywgb3IgbnVsbC5cbiAqXG4gKiBFbXB0eSB2YWx1ZXMgKHVuZGVmaW5lZCAvIG51bGwgLyAnJyAvIGVtcHR5IGFycmF5KSBhcmUgb25seSBjaGVja2VkIGJ5XG4gKiBgcmVxdWlyZWRgIOKAlCBldmVyeSBvdGhlciBidWlsdGluIGNoZWNrIGlzIHNraXBwZWQsIHNvIG9wdGlvbmFsIGZpZWxkc1xuICogZG9uJ3QgZXJyb3IgdW50aWwgdGhleSBoYXZlIGNvbnRlbnQuIEN1c3RvbSB2YWxpZGF0b3JzIGFyZSBOT1Qgc3ViamVjdCB0b1xuICogdGhpcyBza2lwICh0aGV5IHJlY2VpdmUgdGhlIGVtcHR5IHZhbHVlIGFuZCBkZWNpZGUgdGhlbXNlbHZlcykuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQnVpbHRpblJ1bGVzKHJ1bGUsIHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IGlzIHJlcXVpcmVkYDtcbiAgICB9XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vIE5vbi1lbXB0eSBzdHJpbmcgb2Ygb25seSB3aGl0ZXNwYWNlICh0aGUgcmVxdWlyZWQrd2hpdGVzcGFjZSB0cmltIGlkaW9tKS5cbiAgICBpZiAocnVsZS53aGl0ZXNwYWNlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IGNhbm5vdCBiZSBibGFua2A7XG4gICAgfVxuICAgIC8vIGxlbjogZXhhY3QgbGVuZ3RoL2NvdW50L3ZhbHVlIOKAlCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbWluL21heC5cbiAgICBpZiAocnVsZS5sZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtID0gbWVhc3VyZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgbS5tZWFzdXJlZCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBleGFjdGx5ICR7cnVsZS5sZW59JHttLnVuaXR9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkIHx8IHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbSA9IG1lYXN1cmVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChtICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBtLm1lYXN1cmVkIDwgcnVsZS5taW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgYXQgbGVhc3QgJHtydWxlLm1pbn0ke20udW5pdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGUubWF4ICE9PSB1bmRlZmluZWQgJiYgbS5tZWFzdXJlZCA+IHJ1bGUubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIG5vIG1vcmUgdGhhbiAke3J1bGUubWF4fSR7bS51bml0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGUucGF0dGVybiAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEEgL2cgb3IgL3kgcmVnZXggaXMgc3RhdGVmdWw6IGxhc3RJbmRleCBwZXJzaXN0cyBhY3Jvc3MgLnRlc3QoKSBjYWxscyxcbiAgICAgICAgLy8gc28gcmVwZWF0ZWQgcnVucyB3b3VsZCBhbHRlcm5hdGUgcGFzcy9mYWlsIOKAlCByZXNldCBpdCBldmVyeSBydW4uXG4gICAgICAgIGlmIChydWxlLnBhdHRlcm4uZ2xvYmFsIHx8IHJ1bGUucGF0dGVybi5zdGlja3kpXG4gICAgICAgICAgICBydWxlLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gZm9ybWF0IGlzIGludmFsaWRgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnR5cGUgJiYgcnVsZS50eXBlICE9PSAnZW51bScgJiYgIVRZUEVfQ0hFQ0tTW3J1bGUudHlwZV0odmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgdHlwZUZhaWx1cmVNZXNzYWdlKG5hbWUsIHJ1bGUudHlwZSk7XG4gICAgfVxuICAgIC8vIGVudW0gbWVtYmVyc2hpcDogYXBwbGllcyBmb3IgdHlwZSAnZW51bScgb3Igd2hlbmV2ZXIgcnVsZS5lbnVtIGlzIHByZXNlbnQuXG4gICAgaWYgKHJ1bGUuZW51bSAmJiBBcnJheS5pc0FycmF5KHJ1bGUuZW51bSkgJiYgIXJ1bGUuZW51bS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIG9uZSBvZiAke3J1bGUuZW51bS5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdG9SdWxlQXJyYXkocnVsZXMpIHtcbiAgICBpZiAoIXJ1bGVzKVxuICAgICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocnVsZXMpID8gcnVsZXMgOiBbcnVsZXNdO1xufVxuLyoqIE1lbWJlcnMgZm9yIGRlZXAgcnVsZXM6IGFycmF5IOKGkiBpbmRleGVkIGVudHJpZXMsIHBsYWluIG9iamVjdCDihpIga2V5IGVudHJpZXMuICovXG5mdW5jdGlvbiBkZWVwTWVtYmVycyh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgobWVtYmVyLCBpbmRleCkgPT4gW1N0cmluZyhpbmRleCksIG1lbWJlcl0pO1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgIHJldHVybiBbXTtcbn1cbmNvbnN0IFBBU1MgPSB7IGVycm9yOiBudWxsLCB3YXJuaW5nOiBudWxsIH07XG4vKipcbiAqIERldiBndWFyZCBmb3IgdGhlIHByZS0wLjAuNzYgdmFsaWRhdG9yIGNvbnRyYWN0OiByZXR1cm5pbmcgYSBzdHJpbmcgb3JcbiAqIGBmYWxzZWAgdXNlZCB0byBGQUlMIHRoZSBydWxlIOKAlCB1bmRlciB0aGUgYChydWxlLCB2YWx1ZSlgIGNvbnRyYWN0IHJldHVyblxuICogdmFsdWVzIGFyZSBpZ25vcmVkIGFuZCBvbmx5IHRocm93L3JlamVjdCBmYWlscy4gU3VjaCBhIHJldHVybiBpcyBhbG1vc3RcbiAqIGNlcnRhaW5seSBhIGxlZ2FjeSB2YWxpZGF0b3Igc2lsZW50bHkgcGFzc2luZywgc28gaXQgd2FybnMgb25jZS5cbiAqL1xuZnVuY3Rpb24gd2FybkxlZ2FjeVZhbGlkYXRvclJldHVybihuYW1lLCByZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3N0cmluZycgJiYgcmVzdWx0ICE9PSBmYWxzZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGRldldhcm5PbmNlKGB2YWxpZGF0b3ItcmV0dXJuOiR7bmFtZX1gLCBgW1Byb0Zvcm1dIEZpZWxkIFwiJHtuYW1lfVwiOiBhIGN1c3RvbSB2YWxpZGF0b3IgcmV0dXJuZWQgJHt0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/ICdhIHN0cmluZycgOiAnZmFsc2UnfSDigJQgcmV0dXJuIHZhbHVlcyBhcmUgSUdOT1JFRDsgdmFsaWRhdG9ycyBmYWlsIGJ5IHRocm93aW5nIG9yIHJlamVjdGluZyAoYSB0aHJvd24gRXJyb3IncyBtZXNzYWdlIGJlY29tZXMgdGhlIGZpZWxkIGVycm9yKS5gKTtcbn1cbi8qKiBSdW4gYSBydWxlJ3MgdHJhbnNmb3JtLCBjb250YWluaW5nIHRocm93cyBhcyBhIHJ1bGUgZmFpbHVyZS4gKi9cbmZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtKHJ1bGUsIHJhd1ZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBydWxlLnRyYW5zZm9ybSAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiByYXdWYWx1ZSB9O1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcnVsZS50cmFuc2Zvcm0ocmF3VmFsdWUpIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBmYWlsdXJlOiByZXNvbHZlRmFpbHVyZU1lc3NhZ2UoZXJyLCBydWxlKSB9O1xuICAgIH1cbn1cbi8qKlxuICogRmxhdHRlbiBhIHJ1bGUncyBkZWVwIHNvdXJjZXMgKGBmaWVsZHNgIHBlciBrZXksIHRoZW4gYGRlZmF1bHRGaWVsZGAgcGVyXG4gKiBtZW1iZXIpIGludG8gW3N1YlJ1bGUsIG1lbWJlclZhbHVlLCBtZW1iZXJOYW1lXSB0dXBsZXMg4oCUIHRoZSBzaW5nbGUgcGxhY2VcbiAqIHRoYXQga25vd3MgaG93IGRlZXAgcnVsZXMgbWFwIG9udG8gYSBjb250YWluZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBSdWxlRW50cmllcyhydWxlLCB2YWx1ZSwgbmFtZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICBpZiAocnVsZS5maWVsZHMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdmFsdWU7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc3ViUnVsZXNdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bGUuZmllbGRzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJSdWxlIG9mIHRvUnVsZUFycmF5KHN1YlJ1bGVzKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChbc3ViUnVsZSwgc291cmNlW2tleV0sIGAke25hbWV9LiR7a2V5fWBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocnVsZS5kZWZhdWx0RmllbGQpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBtZW1iZXJdIG9mIGRlZXBNZW1iZXJzKHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJSdWxlIG9mIHRvUnVsZUFycmF5KHJ1bGUuZGVmYXVsdEZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChbc3ViUnVsZSwgbWVtYmVyLCBgJHtuYW1lfS4ke2tleX1gXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG4vKipcbiAqIE1lcmdlIGEgc3ViLXJ1bGUncyBvdXRjb21lIGludG8gdGhlIHBhcmVudCdzIGNoYW5uZWxzLiBBIHN1Yi1ydWxlIGZsYWdnZWRcbiAqIGB3YXJuaW5nT25seWAgY29udHJpYnV0ZXMgaXRzIGZhaWx1cmUgYXMgYSBXQVJOSU5HOyBvdGhlcndpc2UgaXRzIGVycm9yXG4gKiBibG9ja3MuIFJldHVybnMgdHJ1ZSB3aGVuIGEgYmxvY2tpbmcgZXJyb3IgbGFuZGVkIChzdG9wIHdhbGtpbmcpLlxuICovXG5mdW5jdGlvbiBtZXJnZVN1YlJlc3VsdChhY2MsIHN1YlJ1bGUsIHN1Yikge1xuICAgIGlmIChzdWIud2FybmluZyAhPT0gbnVsbCAmJiBhY2Mud2FybmluZyA9PT0gbnVsbClcbiAgICAgICAgYWNjLndhcm5pbmcgPSBzdWIud2FybmluZztcbiAgICBpZiAoc3ViLmVycm9yICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdWJSdWxlLndhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICBpZiAoYWNjLndhcm5pbmcgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgYWNjLndhcm5pbmcgPSBzdWIuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhY2MuZXJyb3IgPSBzdWIuZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEZvbGQgb25lIHJ1bGUncyBvdXRjb21lIGludG8gdGhlIHJ1bi1sZXZlbCBjaGFubmVscy4gQSBydWxlIGZsYWdnZWRcbiAqIGB3YXJuaW5nT25seWAgZG93bmdyYWRlcyBldmVyeXRoaW5nIGl0IHByb2R1Y2VkIChvd24gY2hlY2tzIEFORCBkZWVwXG4gKiBzdWItcnVsZXMpIHRvIGEgd2FybmluZy4gUmV0dXJucyB0aGUgYmxvY2tpbmcgZXJyb3IgdG8gc3VyZmFjZSwgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZm9sZFJ1bGVSZXN1bHQocnVsZSwgcmVzdWx0LCBzdGF0ZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAocnVsZS53YXJuaW5nT25seSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZXN1bHQud2FybmluZztcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG51bGwgJiYgc3RhdGUud2FybmluZyA9PT0gbnVsbClcbiAgICAgICAgICAgIHN0YXRlLndhcm5pbmcgPSBjb250ZW50O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXJuaW5nICE9PSBudWxsICYmIHN0YXRlLndhcm5pbmcgPT09IG51bGwpXG4gICAgICAgIHN0YXRlLndhcm5pbmcgPSByZXN1bHQud2FybmluZztcbiAgICByZXR1cm4gcmVzdWx0LmVycm9yO1xufVxuLyoqIEV2YWx1YXRlIE9ORSBydWxlICh0cmFuc2Zvcm0g4oaSIGJ1aWx0aW4gY2hlY2tzIOKGkiB2YWxpZGF0b3Ig4oaSIGRlZXAgcnVsZXMpOyBjdXN0b20gdmFsaWRhdG9ycyBhcmUgYXdhaXRlZC4gKi9cbmZ1bmN0aW9uIGV2YWxSdWxlQXN5bmMocnVsZSwgcmF3VmFsdWUsIG5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBwcmVwID0gYXBwbHlUcmFuc2Zvcm0ocnVsZSwgcmF3VmFsdWUpO1xuICAgICAgICBpZiAoIXByZXAub2spXG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogcHJlcC5mYWlsdXJlLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJlcC52YWx1ZTtcbiAgICAgICAgbGV0IGZhaWx1cmUgPSBjaGVja0J1aWx0aW5SdWxlcyhydWxlLCB2YWx1ZSwgbmFtZSk7XG4gICAgICAgIGlmIChmYWlsdXJlID09PSBudWxsICYmIHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAoeWllbGQgcnVsZS52YWxpZGF0b3IocnVsZSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB3YXJuTGVnYWN5VmFsaWRhdG9yUmV0dXJuKG5hbWUsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZSA9IHJlc29sdmVGYWlsdXJlTWVzc2FnZShlcnIsIHJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsdXJlICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhaWx1cmUsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgaWYgKChydWxlLmZpZWxkcyB8fCBydWxlLmRlZmF1bHRGaWVsZCkgJiYgIWlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIERlZXAgcnVsZXMgbmVlZCBhIGNvbnRhaW5lcjsgYSBub24tZW1wdHkgcHJpbWl0aXZlIGZhaWxzIHRoZSBQQVJFTlRcbiAgICAgICAgICAgIC8vIChjbGVhciBhdHRyaWJ1dGlvbikgaW5zdGVhZCBvZiBwcm9kdWNpbmcgY29uZnVzaW5nIGNoaWxkIGVycm9ycy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheWAsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjYyA9IHsgZXJyb3I6IG51bGwsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3N1YlJ1bGUsIHN1YlZhbHVlLCBzdWJOYW1lXSBvZiBkZWVwUnVsZUVudHJpZXMocnVsZSwgdmFsdWUsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lcmdlU3ViUmVzdWx0KGFjYywgc3ViUnVsZSwgeWllbGQgZXZhbFJ1bGVBc3luYyhzdWJSdWxlLCBzdWJWYWx1ZSwgc3ViTmFtZSkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBBU1M7XG4gICAgfSk7XG59XG4vKipcbiAqIFJ1bGUgcnVuLiBDdXN0b20gdmFsaWRhdG9ycyBhcmUgYXdhaXRlZCAoc3luYyBvciBhc3luYyk6IHJlc29sdmluZyBwYXNzZXMsXG4gKiByZWplY3RpbmcvdGhyb3dpbmcgZmFpbHMuIFJldHVybiB2YWx1ZXMgYXJlIGlnbm9yZWQuXG4gKlxuICogVGhlIHBlci1ydWxlIHRyeS9jYXRjaCBpcyB0aGUgdG90YWxpdHkgY2hva2UgcG9pbnQ6IE5PIGlucHV0IOKAlCBpbmNsdWRpbmdcbiAqIGV4b3RpYyB2YWx1ZXMgdGhhdCBicmVhayBhIGJ1aWx0aW4gY2hlY2sg4oCUIG1heSBlc2NhcGUgYXMgYSB0aHJvdzsgZXZlcnlcbiAqIGZhaWx1cmUgc3VyZmFjZXMgdGhyb3VnaCB0aGUgZXJyb3Ivd2FybmluZyBjaGFubmVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJ1bGVzQXN5bmMobmFtZSwgdmFsdWUsIHZhbHVlcywgcnVsZXMsIGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJlc29sdmVSdWxlcyhydWxlcywgdmFsdWVzLCBpbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIGV2YWxSdWxlQXN5bmMocnVsZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZXJyb3I6IHJlc29sdmVGYWlsdXJlTWVzc2FnZShlcnIsIHJ1bGUpLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGZvbGRSdWxlUmVzdWx0KHJ1bGUsIHJlc3VsdCwgc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yLCB3YXJuaW5nOiBzdGF0ZS53YXJuaW5nIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHdhcm5pbmc6IHN0YXRlLndhcm5pbmcgfTtcbiAgICB9KTtcbn0iXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9