@fgv/ts-utils 1.2.1 → 1.4.0

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 (78) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +4 -0
  3. package/brand.d.ts +8 -0
  4. package/brand.d.ts.map +1 -0
  5. package/brand.js +24 -0
  6. package/converter.d.ts +149 -105
  7. package/converter.d.ts.map +1 -0
  8. package/converter.js +46 -59
  9. package/converters.d.ts +432 -194
  10. package/converters.d.ts.map +1 -0
  11. package/converters.js +262 -151
  12. package/csvHelpers.d.ts +7 -0
  13. package/csvHelpers.d.ts.map +1 -0
  14. package/csvHelpers.js +12 -2
  15. package/extendedArray.d.ts +46 -0
  16. package/extendedArray.d.ts.map +1 -0
  17. package/extendedArray.js +46 -1
  18. package/formatter.d.ts +53 -0
  19. package/formatter.d.ts.map +1 -0
  20. package/formatter.js +24 -1
  21. package/hash.d.ts +31 -3
  22. package/hash.d.ts.map +1 -0
  23. package/hash.js +36 -5
  24. package/index.d.ts +8 -3
  25. package/index.d.ts.map +1 -0
  26. package/index.js +18 -6
  27. package/logger.d.ts +3 -2
  28. package/logger.d.ts.map +1 -0
  29. package/logger.js +1 -1
  30. package/normalize.d.ts +43 -0
  31. package/normalize.d.ts.map +1 -0
  32. package/normalize.js +139 -0
  33. package/package.json +13 -9
  34. package/rangeOf.d.ts +96 -0
  35. package/rangeOf.d.ts.map +1 -0
  36. package/rangeOf.js +80 -1
  37. package/result.d.ts +393 -39
  38. package/result.d.ts.map +1 -0
  39. package/result.js +259 -49
  40. package/utils.d.ts +71 -27
  41. package/utils.d.ts.map +1 -0
  42. package/utils.js +74 -29
  43. package/validation/boolean.d.ts +27 -0
  44. package/validation/boolean.d.ts.map +1 -0
  45. package/validation/boolean.js +59 -0
  46. package/validation/classes.d.ts +5 -0
  47. package/validation/classes.d.ts.map +1 -0
  48. package/validation/classes.js +34 -0
  49. package/validation/field.d.ts +43 -0
  50. package/validation/field.d.ts.map +1 -0
  51. package/validation/field.js +72 -0
  52. package/validation/genericValidator.d.ts +84 -0
  53. package/validation/genericValidator.d.ts.map +1 -0
  54. package/validation/genericValidator.js +138 -0
  55. package/validation/index.d.ts +7 -0
  56. package/validation/index.d.ts.map +1 -0
  57. package/validation/index.js +59 -0
  58. package/validation/number.d.ts +27 -0
  59. package/validation/number.d.ts.map +1 -0
  60. package/validation/number.js +57 -0
  61. package/validation/object.d.ts +115 -0
  62. package/validation/object.d.ts.map +1 -0
  63. package/validation/object.js +143 -0
  64. package/validation/string.d.ts +27 -0
  65. package/validation/string.d.ts.map +1 -0
  66. package/validation/string.js +57 -0
  67. package/validation/traits.d.ts +68 -0
  68. package/validation/traits.d.ts.map +1 -0
  69. package/validation/traits.js +58 -0
  70. package/validation/validator.d.ts +82 -0
  71. package/validation/validator.d.ts.map +1 -0
  72. package/validation/validator.js +24 -0
  73. package/validation/validatorBase.d.ts +25 -0
  74. package/validation/validatorBase.d.ts.map +1 -0
  75. package/validation/validatorBase.js +44 -0
  76. package/validation/validators.d.ts +32 -0
  77. package/validation/validators.d.ts.map +1 -0
  78. package/validation/validators.js +59 -0
package/rangeOf.js CHANGED
@@ -27,12 +27,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.RangeOf = exports.DEFAULT_RANGEOF_FORMATS = void 0;
28
28
  const result_1 = require("./result");
29
29
  const mustache_1 = __importDefault(require("mustache"));
30
+ /**
31
+ * Default {@link RangeOfFormats | formats} to use for both
32
+ * open-ended and complete {@link RangeOf | RangeOf<T>}.
33
+ * @public
34
+ */
30
35
  exports.DEFAULT_RANGEOF_FORMATS = {
31
36
  minOnly: '{{min}}-',
32
37
  maxOnly: '-{{max}}',
33
38
  minMax: '{{min}}-{{max}}',
34
39
  };
40
+ /**
41
+ * Simple implementation of a possibly open-ended range of some comparable
42
+ * type `<T>` with test and formatting.
43
+ * @public
44
+ */
35
45
  class RangeOf {
46
+ /**
47
+ * Creates a new {@link RangeOf | RangeOf<T>}.
48
+ * @param min - Optional mininum extent of the range.
49
+ * @param max - Optional maximum extent of the range.
50
+ */
36
51
  constructor(min, max) {
37
52
  if (((min !== undefined) && (max !== undefined)) &&
38
53
  this._compare(min, max) === 'greater') {
@@ -41,9 +56,23 @@ class RangeOf {
41
56
  this.min = min;
42
57
  this.max = max;
43
58
  }
59
+ /**
60
+ * Static constructor for a {@link RangeOf | RangeOf<T>}.
61
+ * @param init - {@link RangeOfProperties | Range initializer}.
62
+ * @returns A new {@link RangeOf | RangeOf<T>}.
63
+ */
44
64
  static createRange(init) {
45
65
  return (0, result_1.captureResult)(() => new RangeOf(init === null || init === void 0 ? void 0 : init.min, init === null || init === void 0 ? void 0 : init.max));
46
66
  }
67
+ /**
68
+ * Gets a formatted description of a {@link RangeOfProperties | RangeOfProperties<T>} given an
69
+ * optional set of formats and 'empty' value to use.
70
+ * @param range - The {@link RangeOfProperties | RangeOfProperties<T>} to be formatted.
71
+ * @param formats - Optionas {@link RangeOfFormats | formats} to use. Default is
72
+ * {@link DEFAULT_RANGEOF_FORMATS | DEFAULT_RANGEOF_FORMATS}.
73
+ * @param emptyValue - Value which represents unbounded minimum or maximum for this range. Default is `undefined`.
74
+ * @returns A string representation of the range.
75
+ */
47
76
  static propertiesToString(range, formats, emptyValue) {
48
77
  formats = formats !== null && formats !== void 0 ? formats : exports.DEFAULT_RANGEOF_FORMATS;
49
78
  if ((range.min !== undefined) && (range.min !== emptyValue)) {
@@ -59,6 +88,14 @@ class RangeOf {
59
88
  }
60
89
  return undefined;
61
90
  }
91
+ /**
92
+ * Default comparison uses javascript built-in comparison.
93
+ * @param t1 - First value to be compared.
94
+ * @param t2 - Second value to be compared.
95
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
96
+ * and `'equal'` if `t1` and `t2` are equal.
97
+ * @internal
98
+ */
62
99
  static _defaultCompare(t1, t2) {
63
100
  if (t1 < t2) {
64
101
  return 'less';
@@ -68,6 +105,13 @@ class RangeOf {
68
105
  }
69
106
  return 'equal';
70
107
  }
108
+ /**
109
+ * Checks if a supplied value is within this range.
110
+ * @param t - The value to be tested.
111
+ * @returns `'included'` if `t` falls within the range, `'less'` if `t` falls
112
+ * below the minimum extent of the range and `'greater'` if `t` is above the
113
+ * maximum extent.
114
+ */
71
115
  check(t) {
72
116
  if ((this.min !== undefined) && (this._compare(t, this.min) === 'less')) {
73
117
  return 'less';
@@ -77,9 +121,22 @@ class RangeOf {
77
121
  }
78
122
  return 'included';
79
123
  }
124
+ /**
125
+ * Determines if a supplied value is within this range.
126
+ * @param t - The value to be tested.
127
+ * @returns Returns `true` if `t` falls within the range, `false` otherwise.
128
+ */
80
129
  includes(t) {
81
130
  return this.check(t) === 'included';
82
131
  }
132
+ /**
133
+ * Finds the transition value that would bring a supplied value `t` into
134
+ * range.
135
+ * @param t - The value to be tested.
136
+ * @returns The minimum extent of the range if `t` is below the range or
137
+ * the maximum extent of the range if `t` is above the range. Returns
138
+ * `undefined` if `t` already falls within the range.
139
+ */
83
140
  findTransition(t) {
84
141
  switch (this.check(t)) {
85
142
  case 'less':
@@ -89,18 +146,40 @@ class RangeOf {
89
146
  }
90
147
  return undefined;
91
148
  }
149
+ /**
150
+ * Formats the minimum and maximum values of this range.
151
+ * @param format - A format function used to format the values.
152
+ * @returns A {@link RangeOfProperties | RangeOfProperties<string>} contaning the
153
+ * formatted representation of the {@link RangeOf.min | minimum} and {@link RangeOf.max | maximum}
154
+ * extent of the range, or `undefined` for an extent that is not present.
155
+ */
92
156
  toFormattedProperties(format) {
93
157
  return {
94
158
  min: (this.min !== undefined) ? format(this.min) : undefined,
95
159
  max: (this.max !== undefined) ? format(this.max) : undefined,
96
160
  };
97
161
  }
162
+ /**
163
+ * Formats this range using the supplied format function.
164
+ * @param format - Format function used to format minimum and maxiumum extent values.
165
+ * @param formats - The {@link RangeOfFormats | format strings} used to format the range
166
+ * (default {@link DEFAULT_RANGEOF_FORMATS}).
167
+ * @returns Returns a formatted representation of this range.
168
+ */
98
169
  format(format, formats) {
99
170
  return RangeOf.propertiesToString(this.toFormattedProperties(format), formats);
100
171
  }
172
+ /**
173
+ * Inner compare method can be overriden by a derived class.
174
+ * @param t1 - First value to compare.
175
+ * @param t2 - Second value to compare.
176
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
177
+ * and `'equal'` if `t1` and `t2` are equal.
178
+ * @internal
179
+ */
101
180
  _compare(t1, t2) {
102
181
  return RangeOf._defaultCompare(t1, t2);
103
182
  }
104
183
  }
105
184
  exports.RangeOf = RangeOf;
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUFhbkIsUUFBQSx1QkFBdUIsR0FBRztJQUNuQyxPQUFPLEVBQUUsVUFBVTtJQUNuQixPQUFPLEVBQUUsVUFBVTtJQUNuQixNQUFNLEVBQUUsaUJBQWlCO0NBQzVCLENBQUM7QUFFRixNQUFhLE9BQU87SUFJaEIsWUFBbUIsR0FBTyxFQUFFLEdBQU87UUFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pHO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBSSxJQUEyQjtRQUNwRCxPQUFPLElBQUEsc0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsR0FBRyxFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQUksS0FBMkIsRUFBRSxPQUF3QixFQUFFLFVBQWM7UUFDckcsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLCtCQUF1QixDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsRUFBRTtZQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEVBQUU7Z0JBQ3pELE9BQU8sa0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNqRDtpQkFDSTtnQkFDRCxPQUFPLGtCQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDbEQ7U0FDSjthQUNJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsRUFBRTtZQUM5RCxPQUFPLGtCQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRVMsTUFBTSxDQUFDLGVBQWUsQ0FBSSxFQUFLLEVBQUUsRUFBSztRQUM1QyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDVCxPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUNJLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNkLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxDQUFJO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQUU7WUFDckUsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUNyRSxPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxRQUFRLENBQUMsQ0FBSTtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxjQUFjLENBQUMsQ0FBSTtRQUN0QixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkIsS0FBSyxNQUFNO2dCQUNQLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNwQixLQUFLLFVBQVU7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVNLHFCQUFxQixDQUFDLE1BQXNDO1FBQy9ELE9BQU87WUFDSCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzVELEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDL0QsQ0FBQztJQUNOLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBc0MsRUFBRSxPQUF3QjtRQUMxRSxPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVTLFFBQVEsQ0FBQyxFQUFLLEVBQUUsRUFBSztRQUMzQixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQWpGRCwwQkFpRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mUHJvcGVydGllczxUPiB7XG4gICAgcmVhZG9ubHkgbWluPzogVDtcbiAgICByZWFkb25seSBtYXg/OiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZGb3JtYXRzIHtcbiAgICBtaW5Pbmx5OiBzdHJpbmc7XG4gICAgbWF4T25seTogc3RyaW5nO1xuICAgIG1pbk1heDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFMgPSB7XG4gICAgbWluT25seTogJ3t7bWlufX0tJyxcbiAgICBtYXhPbmx5OiAnLXt7bWF4fX0nLFxuICAgIG1pbk1heDogJ3t7bWlufX0te3ttYXh9fScsXG59O1xuXG5leHBvcnQgY2xhc3MgUmFuZ2VPZjxUPiBpbXBsZW1lbnRzIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF4PzogVDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJhbmdlPFQ+KGluaXQ/OiBSYW5nZU9mUHJvcGVydGllczxUPik6IFJlc3VsdDxSYW5nZU9mPFQ+PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBSYW5nZU9mPFQ+KGluaXQ/Lm1pbiwgaW5pdD8ubWF4KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwcm9wZXJ0aWVzVG9TdHJpbmc8VD4ocmFuZ2U6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+LCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMsIGVtcHR5VmFsdWU/OiBUKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgICAgIGZvcm1hdHMgPSBmb3JtYXRzID8/IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTO1xuICAgICAgICBpZiAoKHJhbmdlLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWluICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluTWF4LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluT25seSwgcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5tYXhPbmx5LCByYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9kZWZhdWx0Q29tcGFyZTxUPih0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICBpZiAodDEgPCB0Mikge1xuICAgICAgICAgICAgcmV0dXJuICdsZXNzJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0MSA+IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2dyZWF0ZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZXF1YWwnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRUcmFuc2l0aW9uKHQ6IFQpOiBUfHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jaGVjayh0KSkge1xuICAgICAgICAgICAgY2FzZSAnbGVzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluO1xuICAgICAgICAgICAgY2FzZSAnaW5jbHVkZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUF1QmhDOzs7O0dBSUc7QUFDVSxRQUFBLHVCQUF1QixHQUFHO0lBQ25DLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE1BQU0sRUFBRSxpQkFBaUI7Q0FDNUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFVaEI7Ozs7T0FJRztJQUNILFlBQW1CLEdBQU8sRUFBRSxHQUFPO1FBQy9CLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqRztRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFJLElBQTJCO1FBQ3BELE9BQU8sSUFBQSxzQkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLEVBQUUsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7OztP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QUMsQ0FBQyxTQUFTO1NBQy9ELENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE1BQXNDLEVBQUUsT0FBd0I7UUFDMUUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sUUFBUSxDQUFDLEVBQUssRUFBRSxFQUFLO1FBQzNCLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNKO0FBNUpELDBCQTRKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZSB0eXBlIGA8VD5gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICByZWFkb25seSBtaW4/OiBUO1xuICAgIHJlYWRvbmx5IG1heD86IFQ7XG59XG5cbi8qKlxuICogRm9ybWF0IHN0cmluZ3MgKGluIG11c3RhY2hlIGZvcm1hdCkgdG9cbiAqIHVzZSBmb3IgYm90aCBvcGVuLWVuZGVkIGFuZCBjb21wbGV0ZVxuICoge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mRm9ybWF0cyB7XG4gICAgbWluT25seTogc3RyaW5nO1xuICAgIG1heE9ubHk6IHN0cmluZztcbiAgICBtaW5NYXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBSYW5nZU9mRm9ybWF0cyB8IGZvcm1hdHN9IHRvIHVzZSBmb3IgYm90aFxuICogb3Blbi1lbmRlZCBhbmQgY29tcGxldGUge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTID0ge1xuICAgIG1pbk9ubHk6ICd7e21pbn19LScsXG4gICAgbWF4T25seTogJy17e21heH19JyxcbiAgICBtaW5NYXg6ICd7e21pbn19LXt7bWF4fX0nLFxufTtcblxuLyoqXG4gKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBwb3NzaWJseSBvcGVuLWVuZGVkIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZVxuICogdHlwZSBgPFQ+YCB3aXRoIHRlc3QgYW5kIGZvcm1hdHRpbmcuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZU9mPFQ+IGltcGxlbWVudHMgUmFuZ2VPZlByb3BlcnRpZXM8VD4ge1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1heD86IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn0uXG4gICAgICogQHBhcmFtIG1pbiAtIE9wdGlvbmFsIG1pbmludW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gbWF4IC0gT3B0aW9uYWwgbWF4aW11bSBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgY29uc3RydWN0b3IgZm9yIGEge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAgICAgKiBAcGFyYW0gaW5pdCAtIHtAbGluayBSYW5nZU9mUHJvcGVydGllcyB8IFJhbmdlIGluaXRpYWxpemVyfS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgUmFuZ2VPZiB8IFJhbmdlT2Y8VD59LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmFuZ2U8VD4oaW5pdD86IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KTogUmVzdWx0PFJhbmdlT2Y8VD4+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFJhbmdlT2Y8VD4oaW5pdD8ubWluLCBpbml0Py5tYXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIG9mIGEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8VD59IGdpdmVuIGFuXG4gICAgICogb3B0aW9uYWwgc2V0IG9mIGZvcm1hdHMgYW5kICdlbXB0eScgdmFsdWUgdG8gdXNlLlxuICAgICAqIEBwYXJhbSByYW5nZSAtIFRoZSB7QGxpbmsgUmFuZ2VPZlByb3BlcnRpZXMgfCBSYW5nZU9mUHJvcGVydGllczxUPn0gdG8gYmUgZm9ybWF0dGVkLlxuICAgICAqIEBwYXJhbSBmb3JtYXRzIC0gT3B0aW9uYXMge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0c30gdG8gdXNlLiBEZWZhdWx0IGlzXG4gICAgICoge0BsaW5rIERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTIHwgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFN9LlxuICAgICAqIEBwYXJhbSBlbXB0eVZhbHVlIC0gVmFsdWUgd2hpY2ggcmVwcmVzZW50cyB1bmJvdW5kZWQgbWluaW11bSBvciBtYXhpbXVtIGZvciB0aGlzIHJhbmdlLiBEZWZhdWx0IGlzIGB1bmRlZmluZWRgLlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByb3BlcnRpZXNUb1N0cmluZzxUPihyYW5nZTogUmFuZ2VPZlByb3BlcnRpZXM8VD4sIGZvcm1hdHM/OiBSYW5nZU9mRm9ybWF0cywgZW1wdHlWYWx1ZT86IFQpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHMgPz8gREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFM7XG4gICAgICAgIGlmICgocmFuZ2UubWluICE9PSB1bmRlZmluZWQpICYmIChyYW5nZS5taW4gIT09IGVtcHR5VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5NYXgsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5Pbmx5LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihmb3JtYXRzLm1heE9ubHksIHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgY29tcGFyaXNvbiB1c2VzIGphdmFzY3JpcHQgYnVpbHQtaW4gY29tcGFyaXNvbi5cbiAgICAgKiBAcGFyYW0gdDEgLSBGaXJzdCB2YWx1ZSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gdDIgLSBTZWNvbmQgdmFsdWUgdG8gYmUgY29tcGFyZWQuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2RlZmF1bHRDb21wYXJlPFQ+KHQxOiBULCB0MjogVCk6ICdsZXNzJ3wnZXF1YWwnfCdncmVhdGVyJyB7XG4gICAgICAgIGlmICh0MSA8IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xlc3MnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHQxID4gdDIpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdlcXVhbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3VwcGxpZWQgdmFsdWUgaXMgd2l0aGluIHRoaXMgcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIGAnaW5jbHVkZWQnYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYCdsZXNzJ2AgaWYgYHRgIGZhbGxzXG4gICAgICogYmVsb3cgdGhlIG1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZSBhbmQgYCdncmVhdGVyJ2AgaWYgYHRgIGlzIGFib3ZlIHRoZVxuICAgICAqIG1heGltdW0gZXh0ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN1cHBsaWVkIHZhbHVlIGlzIHdpdGhpbiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSB0IC0gVGhlIHZhbHVlIHRvIGJlIHRlc3RlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHRyYW5zaXRpb24gdmFsdWUgdGhhdCB3b3VsZCBicmluZyBhIHN1cHBsaWVkIHZhbHVlIGB0YCBpbnRvXG4gICAgICogcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBtaW5pbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGJlbG93IHRoZSByYW5nZSBvclxuICAgICAqIHRoZSBtYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGFib3ZlIHRoZSByYW5nZS4gIFJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCBpZiBgdGAgYWxyZWFkeSBmYWxscyB3aXRoaW4gdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVHJhbnNpdGlvbih0OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hlY2sodCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xlc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbjtcbiAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSBmb3JtYXQgLSBBIGZvcm1hdCBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8c3RyaW5nPn0gY29udGFuaW5nIHRoZVxuICAgICAqIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJhbmdlT2YubWluIHwgbWluaW11bX0gYW5kIHtAbGluayBSYW5nZU9mLm1heCB8IG1heGltdW19XG4gICAgICogZXh0ZW50IG9mIHRoZSByYW5nZSwgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIGV4dGVudCB0aGF0IGlzIG5vdCBwcmVzZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoaXMgcmFuZ2UgdXNpbmcgdGhlIHN1cHBsaWVkIGZvcm1hdCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gZm9ybWF0IC0gRm9ybWF0IGZ1bmN0aW9uIHVzZWQgdG8gZm9ybWF0IG1pbmltdW0gYW5kIG1heGl1bXVtIGV4dGVudCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGZvcm1hdHMgLSBUaGUge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0IHN0cmluZ3N9IHVzZWQgdG8gZm9ybWF0IHRoZSByYW5nZVxuICAgICAqIChkZWZhdWx0IHtAbGluayBERUZBVUxUX1JBTkdFT0ZfRk9STUFUU30pLlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElubmVyIGNvbXBhcmUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgYSBkZXJpdmVkIGNsYXNzLlxuICAgICAqIEBwYXJhbSB0MSAtIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHQyIC0gU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=