@kepler.gl/utils 3.0.0-alpha.0 → 3.0.0-alpha.1

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 (55) hide show
  1. package/dist/aggregate-utils.js +2 -2
  2. package/dist/color-utils.d.ts +4 -0
  3. package/dist/color-utils.js +28 -3
  4. package/dist/data-container-interface.js +1 -1
  5. package/dist/data-container-utils.js +2 -2
  6. package/dist/data-row.js +2 -2
  7. package/dist/data-scale-utils.js +4 -4
  8. package/dist/data-utils.d.ts +10 -12
  9. package/dist/data-utils.js +120 -44
  10. package/dist/dataset-utils.d.ts +12 -1
  11. package/dist/dataset-utils.js +74 -9
  12. package/dist/dom-to-image.d.ts +14 -14
  13. package/dist/dom-to-image.js +23 -69
  14. package/dist/dom-utils.d.ts +3 -0
  15. package/dist/dom-utils.js +29 -3
  16. package/dist/effect-utils.d.ts +13 -0
  17. package/dist/effect-utils.js +129 -0
  18. package/dist/export-map-html.js +2 -2
  19. package/dist/export-utils.js +13 -4
  20. package/dist/filter-utils.d.ts +11 -9
  21. package/dist/filter-utils.js +66 -36
  22. package/dist/format.d.ts +1 -0
  23. package/dist/format.js +33 -0
  24. package/dist/gl-utils.js +2 -2
  25. package/dist/h3-utils.d.ts +2 -1
  26. package/dist/h3-utils.js +5 -4
  27. package/dist/index.d.ts +14 -9
  28. package/dist/index.js +230 -555
  29. package/dist/indexed-data-container.js +2 -2
  30. package/dist/locale-utils.js +2 -2
  31. package/dist/map-info-utils.js +2 -2
  32. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +2 -1
  33. package/dist/map-style-utils/mapbox-gl-style-editor.js +9 -3
  34. package/dist/map-style-utils/mapbox-utils.js +2 -2
  35. package/dist/map-utils.d.ts +8 -2
  36. package/dist/map-utils.js +24 -7
  37. package/dist/mapbox-utils.js +2 -2
  38. package/dist/noop.d.ts +1 -0
  39. package/dist/noop.js +29 -0
  40. package/dist/notifications-utils.d.ts +14 -26
  41. package/dist/notifications-utils.js +9 -11
  42. package/dist/observe-dimensions.js +10 -6
  43. package/dist/plot.d.ts +6 -0
  44. package/dist/plot.js +46 -0
  45. package/dist/projection-utils.d.ts +9 -0
  46. package/dist/projection-utils.js +36 -2
  47. package/dist/row-data-container.js +2 -2
  48. package/dist/searcher-utils.js +2 -2
  49. package/dist/split-map-utils.d.ts +4 -1
  50. package/dist/split-map-utils.js +10 -4
  51. package/dist/time.d.ts +16 -0
  52. package/dist/time.js +105 -0
  53. package/dist/utils.d.ts +36 -10
  54. package/dist/utils.js +38 -6
  55. package/package.json +11 -11
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
1
+ // Copyright (c) 2023 Uber Technologies, Inc.
2
2
  //
3
3
  // Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  // of this software and associated documentation files (the "Software"), to deal
@@ -32,21 +32,25 @@ exports.getSampleData = getSampleData;
32
32
  exports.timeToUnixMilli = timeToUnixMilli;
33
33
  exports.notNullorUndefined = notNullorUndefined;
34
34
  exports.isNumber = isNumber;
35
- exports.isPlainObject = isPlainObject;
36
35
  exports.hasOwnProperty = hasOwnProperty;
37
36
  exports.numberSort = numberSort;
38
37
  exports.getSortingFunction = getSortingFunction;
39
38
  exports.preciseRound = preciseRound;
39
+ exports.roundToFour = roundToFour;
40
40
  exports.getRoundingDecimalFromStep = getRoundingDecimalFromStep;
41
- exports.snapToMarks = snapToMarks;
42
41
  exports.normalizeSliderValue = normalizeSliderValue;
43
42
  exports.roundValToStep = roundValToStep;
44
43
  exports.getFormatter = getFormatter;
44
+ exports.getColumnFormatter = getColumnFormatter;
45
+ exports.applyValueMap = applyValueMap;
45
46
  exports.applyDefaultFormat = applyDefaultFormat;
46
47
  exports.getBooleanFormatter = getBooleanFormatter;
47
48
  exports.applyCustomFormat = applyCustomFormat;
49
+ exports.formatNumber = formatNumber;
48
50
  exports.datetimeFormatter = datetimeFormatter;
49
- exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.defaultFormatter = void 0;
51
+ exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.floatFormatter = exports.defaultFormatter = void 0;
52
+
53
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
50
54
 
51
55
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
52
56
 
@@ -54,14 +58,16 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
54
58
 
55
59
  var _assert = _interopRequireDefault(require("assert"));
56
60
 
57
- var _constants = require("@kepler.gl/constants");
58
-
59
61
  var _d3Format = require("d3-format");
60
62
 
61
- var _d3Array = require("d3-array");
62
-
63
63
  var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
64
64
 
65
+ var _constants = require("@kepler.gl/constants");
66
+
67
+ var _plot = require("./plot");
68
+
69
+ var _utils = require("./utils");
70
+
65
71
  var _FIELD_DISPLAY_FORMAT;
66
72
 
67
73
  /**
@@ -155,15 +161,6 @@ function notNullorUndefined(d) {
155
161
  function isNumber(d) {
156
162
  return Number.isFinite(d);
157
163
  }
158
- /**
159
- * whether is an object
160
- * @returns {boolean} - yes or no
161
- */
162
-
163
-
164
- function isPlainObject(obj) {
165
- return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
166
- }
167
164
  /**
168
165
  * whether object has property
169
166
  * @param {string} prop
@@ -200,6 +197,16 @@ function preciseRound(num, decimals) {
200
197
  var t = Math.pow(10, decimals);
201
198
  return (Math.round(num * t + (decimals > 0 ? 1 : 0) * (Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
202
199
  }
200
+ /**
201
+ * round a giving number at most 4 decimal places
202
+ * e.g. 10 -> 10, 1.12345 -> 1.2345, 2.0 -> 2
203
+ */
204
+
205
+
206
+ function roundToFour(num) {
207
+ // @ts-expect-error
208
+ return Number("".concat(Math.round("".concat(num, "e+4")), "e-4"));
209
+ }
203
210
  /**
204
211
  * get number of decimals to round to for slider from step
205
212
  * @param step
@@ -213,33 +220,23 @@ function getRoundingDecimalFromStep(step) {
213
220
  (0, _assert["default"])(step);
214
221
  }
215
222
 
216
- var splitZero = step.toString().split('.');
223
+ var stepStr = step.toString(); // in case the step is a very small number e.g. 1e-7, return decimal e.g. 7 directly
217
224
 
218
- if (splitZero.length === 1) {
219
- return 0;
220
- }
221
-
222
- return splitZero[1].length;
223
- }
224
- /**
225
- * Use in slider, given a number and an array of numbers, return the nears number from the array
226
- * @param value
227
- * @param marks
228
- */
225
+ var splitExponential = stepStr.split('e-');
229
226
 
227
+ if (splitExponential.length === 2) {
228
+ var coeffZero = splitExponential[0].split('.');
229
+ var coeffDecimal = coeffZero.length === 1 ? 0 : coeffZero[1].length;
230
+ return parseInt(splitExponential[1], 10) + coeffDecimal;
231
+ }
230
232
 
231
- function snapToMarks(value, marks) {
232
- // always use bin x0
233
- var i = (0, _d3Array.bisectLeft)(marks, value);
233
+ var splitZero = stepStr.split('.');
234
234
 
235
- if (i === 0) {
236
- return marks[i];
237
- } else if (i === marks.length) {
238
- return marks[i - 1];
235
+ if (splitZero.length === 1) {
236
+ return 0;
239
237
  }
240
238
 
241
- var idx = marks[i] - value < value - marks[i - 1] ? i : i - 1;
242
- return marks[idx];
239
+ return splitZero[1].length;
243
240
  }
244
241
  /**
245
242
  * If marks is provided, snap to marks, if not normalize to step
@@ -252,7 +249,8 @@ function snapToMarks(value, marks) {
252
249
 
253
250
  function normalizeSliderValue(val, minValue, step, marks) {
254
251
  if (marks && marks.length) {
255
- return snapToMarks(val, marks);
252
+ // Use in slider, given a number and an array of numbers, return the nears number from the array
253
+ return (0, _plot.snapToMarks)(val, marks);
256
254
  }
257
255
 
258
256
  return roundValToStep(minValue, step, val);
@@ -301,9 +299,15 @@ var defaultFormatter = function defaultFormatter(v) {
301
299
  };
302
300
 
303
301
  exports.defaultFormatter = defaultFormatter;
302
+
303
+ var floatFormatter = function floatFormatter(v) {
304
+ return isNumber(v) ? String(roundToFour(v)) : '';
305
+ };
306
+
307
+ exports.floatFormatter = floatFormatter;
304
308
  var FIELD_DISPLAY_FORMAT = (_FIELD_DISPLAY_FORMAT = {}, (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.string, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.timestamp, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.integer, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.real, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES["boolean"], defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.date, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.geojson, function (d) {
305
- return typeof d === 'string' ? d : isPlainObject(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
306
- }), _FIELD_DISPLAY_FORMAT);
309
+ return typeof d === 'string' ? d : (0, _utils.isPlainObject)(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
310
+ }), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.object, JSON.stringify), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.array, JSON.stringify), _FIELD_DISPLAY_FORMAT);
307
311
  /**
308
312
  * Parse field value and type and return a string representation
309
313
  */
@@ -364,6 +368,35 @@ function getFormatter(format, field) {
364
368
  return defaultFormatter;
365
369
  }
366
370
 
371
+ function getColumnFormatter(colMeta) {
372
+ var format = colMeta.format,
373
+ displayFormat = colMeta.displayFormat;
374
+
375
+ if (!format && !displayFormat) {
376
+ return FIELD_DISPLAY_FORMAT[colMeta.type];
377
+ }
378
+
379
+ var tooltipFormat = Object.values(_constants.TOOLTIP_FORMATS).find(function (f) {
380
+ return f[_constants.TOOLTIP_KEY] === displayFormat;
381
+ });
382
+
383
+ if (tooltipFormat) {
384
+ return applyDefaultFormat(tooltipFormat);
385
+ } else if (typeof displayFormat === 'string' && colMeta) {
386
+ return applyCustomFormat(displayFormat, colMeta);
387
+ } else if ((0, _typeof2["default"])(displayFormat) === 'object') {
388
+ return applyValueMap(displayFormat);
389
+ }
390
+
391
+ return defaultFormatter;
392
+ }
393
+
394
+ function applyValueMap(format) {
395
+ return function (v) {
396
+ return format[v];
397
+ };
398
+ }
399
+
367
400
  function applyDefaultFormat(tooltipFormat) {
368
401
  if (!tooltipFormat || !tooltipFormat.format) {
369
402
  return defaultFormatter;
@@ -424,6 +457,48 @@ function applyCustomFormat(format, field) {
424
457
  };
425
458
  }
426
459
  }
460
+
461
+ function formatLargeNumber(n) {
462
+ // SI-prefix with 4 significant digits
463
+ return (0, _d3Format.format)('.4~s')(n);
464
+ }
465
+
466
+ function formatNumber(n, type) {
467
+ switch (type) {
468
+ case _constants.ALL_FIELD_TYPES.integer:
469
+ if (n < 0) {
470
+ return "-".concat(formatNumber(-n, 'integer'));
471
+ }
472
+
473
+ if (n < 1000) {
474
+ return "".concat(Math.round(n));
475
+ }
476
+
477
+ if (n < 10 * 1000) {
478
+ return (0, _d3Format.format)(',')(Math.round(n));
479
+ }
480
+
481
+ return formatLargeNumber(n);
482
+
483
+ case _constants.ALL_FIELD_TYPES.real:
484
+ if (n < 0) {
485
+ return "-".concat(formatNumber(-n, 'number'));
486
+ }
487
+
488
+ if (n < 1000) {
489
+ return (0, _d3Format.format)('.4~r')(n);
490
+ }
491
+
492
+ if (n < 10 * 1000) {
493
+ return (0, _d3Format.format)(',.2~f')(n);
494
+ }
495
+
496
+ return formatLargeNumber(n);
497
+
498
+ default:
499
+ return formatNumber(n, 'real');
500
+ }
501
+ }
427
502
  /**
428
503
  * Format epoch milliseconds with a format string
429
504
  * @type timezone
@@ -435,10 +510,11 @@ function datetimeFormatter(timezone) {
435
510
  return function (ts) {
436
511
  return _momentTimezone["default"].utc(ts).tz(timezone).format(format);
437
512
  };
438
- } : function (format) {
513
+ } : // return empty string instead of 'Invalid date' if ts is undefined/null
514
+ function (format) {
439
515
  return function (ts) {
440
- return _momentTimezone["default"].utc(ts).format(format);
516
+ return ts ? _momentTimezone["default"].utc(ts).format(format) : '';
441
517
  };
442
518
  };
443
519
  }
444
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImlzUGxhaW5PYmplY3QiLCJvYmoiLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3AiLCJhIiwiYiIsImdldFNvcnRpbmdGdW5jdGlvbiIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInJlYWwiLCJpbnRlZ2VyIiwidGltZXN0YW1wIiwicHJlY2lzZVJvdW5kIiwibnVtIiwiZGVjaW1hbHMiLCJ0IiwicG93Iiwicm91bmQiLCJzaWduIiwidG9GaXhlZCIsImdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwIiwic3RlcCIsImlzTmFOIiwic3BsaXRaZXJvIiwidG9TdHJpbmciLCJzcGxpdCIsInNuYXBUb01hcmtzIiwibWFya3MiLCJub3JtYWxpemVTbGlkZXJWYWx1ZSIsIm1pblZhbHVlIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJGSUVMRF9ESVNQTEFZX0ZPUk1BVCIsInN0cmluZyIsImRhdGUiLCJnZW9qc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlRmllbGRWYWx1ZSIsInR5cGUiLCJhcnJheU1vdmVNdXRhdGUiLCJhcnJheSIsImZyb20iLCJ0byIsInNwbGljZSIsImFycmF5TW92ZSIsInNsaWNlIiwiZ2V0Rm9ybWF0dGVyIiwiZmllbGQiLCJ0b29sdGlwRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRTIiwiZmluZCIsImYiLCJUT09MVElQX0tFWSIsImFwcGx5RGVmYXVsdEZvcm1hdCIsImFwcGx5Q3VzdG9tRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRfVFlQRVMiLCJERUNJTUFMIiwiREFURSIsIkRBVEVfVElNRSIsImRhdGV0aW1lRm9ybWF0dGVyIiwiUEVSQ0VOVEFHRSIsIkRFQ0lNQUxfREVDSU1BTF9GSVhFRF8yIiwiQk9PTEVBTiIsImdldEJvb2xlYW5Gb3JtYXR0ZXIiLCJ0aW1lem9uZSIsInRzIiwidHoiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBT0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQW1CQyxNQUFuQixFQUFnQztBQUNyQyxNQUFNQyxPQUFZLEdBQUcsRUFBckI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxNQUFSLENBQWxCO0FBQ0FFLEVBQUFBLFNBQVMsQ0FBQ0UsT0FBVixDQUFrQixVQUFBQyxDQUFDLEVBQUk7QUFDckIsUUFBSUMsa0JBQWtCLENBQUNELENBQUQsQ0FBdEIsRUFBMkI7QUFDekJKLE1BQUFBLE9BQU8sQ0FBQ00sSUFBUixDQUFhRixDQUFiO0FBQ0Q7QUFDRixHQUpEO0FBS0EsU0FBT0osT0FBUDtBQUNEOztBQUVNLFNBQVNPLGVBQVQsQ0FDTEMsTUFESyxFQUVMQyxHQUZLLEVBR0xDLEtB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TUFBZixDQUFzQkEsTUFBdEIsQ0FBSjtBQUFBLEtBQU47QUFBQSxHQU5WO0FBT0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVMsXG4gIFRPT0xUSVBfS0VZLFxuICBUb29sdGlwRm9ybWF0XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Zm9ybWF0IGFzIGQzRm9ybWF0fSBmcm9tICdkMy1mb3JtYXQnO1xuaW1wb3J0IHtiaXNlY3RMZWZ0fSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5cbmltcG9ydCB7TWlsbGlzZWNvbmQsIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXR0ZXIgPSAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIHNpbXBsZSBnZXR0aW5nIHVuaXF1ZSB2YWx1ZXMgb2YgYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4odmFsdWVzOiBUW10pIHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGNvbnN0IHVuaXF1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgdW5pcXVlU2V0LmZvckVhY2godiA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2KSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0TG5nQm91bmRzKFxuICBwb2ludHM6IG51bWJlcltdW10sXG4gIGlkeDogbnVtYmVyLFxuICBsaW1pdDogW251bWJlciwgbnVtYmVyXVxuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICBjb25zdCBsYXRzID0gcG9pbnRzXG4gICAgLm1hcChkID0+IE51bWJlcihBcnJheS5pc0FycmF5KGQpKSAmJiBkW2lkeF0pXG4gICAgLmZpbHRlcihOdW1iZXIuaXNGaW5pdGUpXG4gICAgLnNvcnQobnVtYmVyU29ydCk7XG5cbiAgaWYgKCFsYXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2xhbXAgdG8gbGltaXRcbiAgcmV0dXJuIFtNYXRoLm1heChsYXRzWzBdLCBsaW1pdFswXSksIE1hdGgubWluKGxhdHNbbGF0cy5sZW5ndGggLSAxXSwgbGltaXRbMV0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKFttaW4sIG1heF06IFtudW1iZXIsIG51bWJlcl0sIHZhbDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiB2YWwgPD0gbWluID8gbWluIDogdmFsID49IG1heCA/IG1heCA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbXBsZURhdGEoZGF0YSwgc2FtcGxlU2l6ZSA9IDUwMCwgZ2V0VmFsdWUgPSBkID0+IGQpIHtcbiAgY29uc3Qgc2FtcGxlU3RlcCA9IE1hdGgubWF4KE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyBzYW1wbGVTaXplKSwgMSk7XG4gIGNvbnN0IG91dHB1dDogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzYW1wbGVTdGVwKSB7XG4gICAgb3V0cHV0LnB1c2goZ2V0VmFsdWUoZGF0YVtpXSkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRpZmZlcmVudCB0aW1lIGZvcm1hdCB0byB1bml4IG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRvVW5peE1pbGxpKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IE1pbGxpc2Vjb25kIHwgbnVsbCB7XG4gIGlmIChub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQudXRjKHZhbHVlLCBmb3JtYXQpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPT09ICd4JyA/IHZhbHVlICogMTAwMCA6IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPGFueT4+KGQ6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgIT09IHVuZGVmaW5lZCAmJiBkICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZCBpcyBhIG51bWJlciwgdGhpcyBmaWx0ZXJlZCBvdXQgTmFOIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGQpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgb2JqZWN0IGhhcyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIHt9LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclNvcnQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGRUeXBlOiBzdHJpbmcpOiB0eXBlb2YgbnVtYmVyU29ydCB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBudW1iZXJTb3J0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIHdpdGggZXhhY3QgbnVtYmVyIG9mIGRlY2ltYWxzXG4gKiByZXR1cm4gYXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2VSb3VuZChudW06IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICByZXR1cm4gKFxuICAgIE1hdGgucm91bmQoXG4gICAgICBudW0gKiB0ICsgKGRlY2ltYWxzID4gMCA/IDEgOiAwKSAqIChNYXRoLnNpZ24obnVtKSAqICgxMCAvIE1hdGgucG93KDEwMCwgZGVjaW1hbHMpKSlcbiAgICApIC8gdFxuICApLnRvRml4ZWQoZGVjaW1hbHMpO1xufVxuXG4vKipcbiAqIGdldCBudW1iZXIgb2YgZGVjaW1hbHMgdG8gcm91bmQgdG8gZm9yIHNsaWRlciBmcm9tIHN0ZXBcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcmV0dXJucy0gbnVtYmVyIG9mIGRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihzdGVwKSkge1xuICAgIGFzc2VydCgnc3RlcCBpcyBub3QgYSBudW1iZXInKTtcbiAgICBhc3NlcnQoc3RlcCk7XG4gIH1cblxuICBjb25zdCBzcGxpdFplcm8gPSBzdGVwLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgaWYgKHNwbGl0WmVyby5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3BsaXRaZXJvWzFdLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBVc2UgaW4gc2xpZGVyLCBnaXZlbiBhIG51bWJlciBhbmQgYW4gYXJyYXkgb2YgbnVtYmVycywgcmV0dXJuIHRoZSBuZWFycyBudW1iZXIgZnJvbSB0aGUgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmFwVG9NYXJrcyh2YWx1ZTogbnVtYmVyLCBtYXJrczogbnVtYmVyW10pOiBudW1iZXIge1xuICAvLyBhbHdheXMgdXNlIGJpbiB4MFxuICBjb25zdCBpID0gYmlzZWN0TGVmdChtYXJrcywgdmFsdWUpO1xuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBtYXJrc1tpXTtcbiAgfSBlbHNlIGlmIChpID09PSBtYXJrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbWFya3NbaSAtIDFdO1xuICB9XG4gIGNvbnN0IGlkeCA9IG1hcmtzW2ldIC0gdmFsdWUgPCB2YWx1ZSAtIG1hcmtzW2kgLSAxXSA/IGkgOiBpIC0gMTtcbiAgcmV0dXJuIG1hcmtzW2lkeF07XG59XG5cbi8qKlxuICogSWYgbWFya3MgaXMgcHJvdmlkZWQsIHNuYXAgdG8gbWFya3MsIGlmIG5vdCBub3JtYWxpemUgdG8gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTbGlkZXJWYWx1ZShcbiAgdmFsOiBudW1iZXIsXG4gIG1pblZhbHVlOiBudW1iZXIsXG4gIHN0ZXA6IG51bWJlcixcbiAgbWFya3M/OiBudW1iZXJbXVxuKTogbnVtYmVyIHtcbiAgaWYgKG1hcmtzICYmIG1hcmtzLmxlbmd0aCkge1xuICAgIHJldHVybiBzbmFwVG9NYXJrcyh2YWwsIG1hcmtzKTtcbiAgfVxuXG4gIHJldHVybiByb3VuZFZhbFRvU3RlcChtaW5WYWx1ZSwgc3RlcCwgdmFsKTtcbn1cblxuLyoqXG4gKiByb3VuZCB0aGUgdmFsdWUgdG8gc3RlcCBmb3IgdGhlIHNsaWRlclxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMgLSByb3VuZGVkIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRWYWxUb1N0ZXAobWluVmFsdWU6IG51bWJlciwgc3RlcDogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghaXNOdW1iZXIoc3RlcCkgfHwgIWlzTnVtYmVyKG1pblZhbHVlKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBjb25zdCBkZWNpbWFsID0gZ2V0Um91bmRpbmdEZWNpbWFsRnJvbVN0ZXAoc3RlcCk7XG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5mbG9vcigodmFsIC0gbWluVmFsdWUpIC8gc3RlcCk7XG4gIGxldCByZW1haW4gPSB2YWwgLSAoc3RlcHMgKiBzdGVwICsgbWluVmFsdWUpO1xuXG4gIC8vIGhhcyB0byByb3VuZCBiZWNhdXNlIGphdmFzY3JpcHQgdHVybnMgMC4xIGludG8gMC45OTk5OTk5OTk5OTk5OTg3XG4gIHJlbWFpbiA9IE51bWJlcihwcmVjaXNlUm91bmQocmVtYWluLCA4KSk7XG5cbiAgbGV0IGNsb3Nlc3Q6IG51bWJlcjtcbiAgaWYgKHJlbWFpbiA9PT0gMCkge1xuICAgIGNsb3Nlc3QgPSB2YWw7XG4gIH0gZWxzZSBpZiAocmVtYWluIDwgc3RlcCAvIDIpIHtcbiAgICBjbG9zZXN0ID0gc3RlcHMgKiBzdGVwICsgbWluVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2xvc2VzdCA9IChzdGVwcyArIDEpICogc3RlcCArIG1pblZhbHVlO1xuICB9XG5cbiAgLy8gcHJlY2lzZSByb3VuZCByZXR1cm4gYSBzdHJpbmcgcm91bmRlZCB0byB0aGUgZGVmaW5lZCBkZWNpbWFsXG4gIGNvbnN0IHJvdW5kZWQgPSBwcmVjaXNlUm91bmQoY2xvc2VzdCwgZGVjaW1hbCk7XG5cbiAgcmV0dXJuIE51bWJlcihyb3VuZGVkKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvcm1hdCBiYXNlZCBvbiBmaWVsZCBhbmQgZm9ybWF0IG9wdGlvbnNcbiAqIFVzZWQgaW4gcmVuZGVyIHRvb2x0aXAgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGb3JtYXR0ZXI6IEZpZWxkRm9ybWF0dGVyID0gdiA9PiAobm90TnVsbG9yVW5kZWZpbmVkKHYpID8gU3RyaW5nKHYpIDogJycpO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQ6IHtcbiAgW2tleTogc3RyaW5nXTogRmllbGRGb3JtYXR0ZXI7XG59ID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ106IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZCA9PlxuICAgIHR5cGVvZiBkID09PSAnc3RyaW5nJ1xuICAgICAgPyBkXG4gICAgICA6IGlzUGxhaW5PYmplY3QoZClcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShkKVxuICAgICAgPyBgWyR7U3RyaW5nKGQpfV1gXG4gICAgICA6ICcnXG59O1xuXG4vKipcbiAqIFBhcnNlIGZpZWxkIHZhbHVlIGFuZCB0eXBlIGFuZCByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRmllbGRWYWx1ZSA9ICh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0gPyBGSUVMRF9ESVNQTEFZX0ZPUk1BVFt0eXBlXSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSB0b1xuICovXG5leHBvcnQgY29uc3QgYXJyYXlNb3ZlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIGFycmF5TW92ZU11dGF0ZShhcnJheSwgZnJvbSwgdG8pO1xuICByZXR1cm4gYXJyYXk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9ybWF0IGJhc2VkIG9uIGZpZWxkIGFuZCBmb3JtYXQgb3B0aW9uc1xuICogVXNlZCBpbiByZW5kZXIgdG9vbHRpcCB2YWx1ZVxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoXG4gIGZvcm1hdDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZmllbGQ/OiBGaWVsZFxuKTogRmllbGRGb3JtYXR0ZXIge1xuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBmb3JtYXQpO1xuXG4gIGlmICh0b29sdGlwRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0IGFzIFRvb2x0aXBGb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmIGZpZWxkKSB7XG4gICAgcmV0dXJuIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdDogVG9vbHRpcEZvcm1hdCk6ICh2OiBhbnkpID0+IHN0cmluZyB7XG4gIGlmICghdG9vbHRpcEZvcm1hdCB8fCAhdG9vbHRpcEZvcm1hdC5mb3JtYXQpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxuXG4gIHN3aXRjaCAodG9vbHRpcEZvcm1hdC50eXBlKSB7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5ERUNJTUFMOlxuICAgICAgcmV0dXJuIGQzRm9ybWF0KHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEU6XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5EQVRFX1RJTUU6XG4gICAgICByZXR1cm4gZGF0ZXRpbWVGb3JtYXR0ZXIobnVsbCkodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuUEVSQ0VOVEFHRTpcbiAgICAgIHJldHVybiB2ID0+IGAke2QzRm9ybWF0KFRPT0xUSVBfRk9STUFUUy5ERUNJTUFMX0RFQ0lNQUxfRklYRURfMi5mb3JtYXQpKHYpfSVgO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuQk9PTEVBTjpcbiAgICAgIHJldHVybiBnZXRCb29sZWFuRm9ybWF0dGVyKHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5Gb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnMDEnOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICcxJyA6ICcwJyk7XG4gICAgY2FzZSAneW4nOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICd5ZXMnIDogJ25vJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG59XG4vLyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgY3VzdG9tIHRvb2x0aXAgZm9ybWF0IHZpYSBjb25maWdcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUN1c3RvbUZvcm1hdChmb3JtYXQsIGZpZWxkKTogRmllbGRGb3JtYXR0ZXIge1xuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICByZXR1cm4gZDNGb3JtYXQoZm9ybWF0KTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKShmb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdiA9PiB2O1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGVwb2NoIG1pbGxpc2Vjb25kcyB3aXRoIGEgZm9ybWF0IHN0cmluZ1xuICogQHR5cGUgdGltZXpvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lRm9ybWF0dGVyKFxuICB0aW1lem9uZT86IHN0cmluZyB8IG51bGxcbik6IChmb3JtYXQ/OiBzdHJpbmcpID0+ICh0czogbnVtYmVyKSA9PiBzdHJpbmcge1xuICByZXR1cm4gdGltZXpvbmVcbiAgICA/IGZvcm1hdCA9PiB0cyA9PlxuICAgICAgICBtb21lbnRcbiAgICAgICAgICAudXRjKHRzKVxuICAgICAgICAgIC50eih0aW1lem9uZSlcbiAgICAgICAgICAuZm9ybWF0KGZvcm1hdClcbiAgICA6IGZvcm1hdCA9PiB0cyA9PiBtb21lbnQudXRjKHRzKS5mb3JtYXQoZm9ybWF0KTtcbn1cbiJdfQ==
520
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImhhc093blByb3BlcnR5Iiwib2JqIiwicHJvcCIsImEiLCJiIiwiZ2V0U29ydGluZ0Z1bmN0aW9uIiwiZmllbGRUeXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsImludGVnZXIiLCJ0aW1lc3RhbXAiLCJwcmVjaXNlUm91bmQiLCJudW0iLCJkZWNpbWFscyIsInQiLCJwb3ciLCJyb3VuZCIsInNpZ24iLCJ0b0ZpeGVkIiwicm91bmRUb0ZvdXIiLCJnZXRSb3VuZGluZ0RlY2ltYWxGcm9tU3RlcCIsInN0ZXAiLCJpc05hTiIsInN0ZXBTdHIiLCJ0b1N0cmluZyIsInNwbGl0RXhwb25lbnRpYWwiLCJzcGxpdCIsImNvZWZmWmVybyIsImNvZWZmRGVjaW1hbCIsInBhcnNlSW50Iiwic3BsaXRaZXJvIiwibm9ybWFsaXplU2xpZGVyVmFsdWUiLCJtaW5WYWx1ZSIsIm1hcmtzIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJmbG9hdEZvcm1hdHRlciIsIkZJRUxEX0RJU1BMQVlfRk9STUFUIiwic3RyaW5nIiwiZGF0ZSIsImdlb2pzb24iLCJKU09OIiwic3RyaW5naWZ5Iiwib2JqZWN0IiwiYXJyYXkiLCJwYXJzZUZpZWxkVmFsdWUiLCJ0eXBlIiwiYXJyYXlNb3ZlTXV0YXRlIiwiZnJvbSIsInRvIiwic3BsaWNlIiwiYXJyYXlNb3ZlIiwic2xpY2UiLCJnZXRGb3JtYXR0ZXIiLCJmaWVsZCIsInRvb2x0aXBGb3JtYXQiLCJPYmplY3QiLCJUT09MVElQX0ZPUk1BVFMiLCJmaW5kIiwiZiIsIlRPT0xUSVBfS0VZIiwiYXBwbHlEZWZhdWx0Rm9ybWF0IiwiYXBwbHlDdXN0b21Gb3JtYXQiLCJnZXRDb2x1bW5Gb3JtYXR0ZXIiLCJjb2xNZXRhIiwiZGlzcGxheUZvcm1hdCIsImFwcGx5VmFsdWVNYXAiLCJUT09MVElQX0ZPUk1BVF9UWVBFUyIsIkRFQ0lNQUwiLCJEQVRFIiwiREFURV9USU1FIiwiZGF0ZXRpbWVGb3JtYXR0ZXIiLCJQRVJDRU5UQUdFIiwiREVDSU1BTF9ERUNJTUFMX0ZJWEVEXzIiLCJCT09MRUFOIiwiZ2V0Qm9vbGVhbkZvcm1hdHRlciIsImZvcm1hdExhcmdlTnVtYmVyIiwibiIsImZvcm1hdE51bWJlciIsInRpbWV6b25lIiwidHMiLCJ0eiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBU0E7O0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQW1CQyxNQUFuQixFQUFnQztBQUNyQyxNQUFNQyxPQUFZLEdBQUcsRUFBckI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxNQUFSLENBQWxCO0FBQ0FFLEVBQUFBLFNBQVMsQ0FBQ0UsT0FB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QUZOLEVBR0c1RixNQUhILENBR1VBLE1BSFYsQ0FEVTtBQUFBLEtBQU47QUFBQSxHQURLLEdBTVg7QUFDQSxZQUFBQSxNQUFNO0FBQUEsV0FBSSxVQUFBNkYsRUFBRTtBQUFBLGFBQUtBLEVBQUUsR0FBRzVGLDJCQUFPQyxHQUFQLENBQVcyRixFQUFYLEVBQWU3RixNQUFmLENBQXNCQSxNQUF0QixDQUFILEdBQW1DLEVBQTFDO0FBQUEsS0FBTjtBQUFBLEdBUFY7QUFRRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7Zm9ybWF0IGFzIGQzRm9ybWF0fSBmcm9tICdkMy1mb3JtYXQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVMsXG4gIFRPT0xUSVBfS0VZLFxuICBUb29sdGlwRm9ybWF0XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TWlsbGlzZWNvbmQsIEZpZWxkLCBDb2xNZXRhUHJvcHN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge3NuYXBUb01hcmtzfSBmcm9tICcuL3Bsb3QnO1xuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXR0ZXIgPSAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIHNpbXBsZSBnZXR0aW5nIHVuaXF1ZSB2YWx1ZXMgb2YgYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4odmFsdWVzOiBUW10pIHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGNvbnN0IHVuaXF1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgdW5pcXVlU2V0LmZvckVhY2godiA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2KSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0TG5nQm91bmRzKFxuICBwb2ludHM6IG51bWJlcltdW10sXG4gIGlkeDogbnVtYmVyLFxuICBsaW1pdDogW251bWJlciwgbnVtYmVyXVxuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICBjb25zdCBsYXRzID0gcG9pbnRzXG4gICAgLm1hcChkID0+IE51bWJlcihBcnJheS5pc0FycmF5KGQpKSAmJiBkW2lkeF0pXG4gICAgLmZpbHRlcihOdW1iZXIuaXNGaW5pdGUpXG4gICAgLnNvcnQobnVtYmVyU29ydCk7XG5cbiAgaWYgKCFsYXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2xhbXAgdG8gbGltaXRcbiAgcmV0dXJuIFtNYXRoLm1heChsYXRzWzBdLCBsaW1pdFswXSksIE1hdGgubWluKGxhdHNbbGF0cy5sZW5ndGggLSAxXSwgbGltaXRbMV0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKFttaW4sIG1heF06IFtudW1iZXIsIG51bWJlcl0sIHZhbDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiB2YWwgPD0gbWluID8gbWluIDogdmFsID49IG1heCA/IG1heCA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbXBsZURhdGEoZGF0YSwgc2FtcGxlU2l6ZSA9IDUwMCwgZ2V0VmFsdWUgPSBkID0+IGQpIHtcbiAgY29uc3Qgc2FtcGxlU3RlcCA9IE1hdGgubWF4KE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyBzYW1wbGVTaXplKSwgMSk7XG4gIGNvbnN0IG91dHB1dDogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzYW1wbGVTdGVwKSB7XG4gICAgb3V0cHV0LnB1c2goZ2V0VmFsdWUoZGF0YVtpXSkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRpZmZlcmVudCB0aW1lIGZvcm1hdCB0byB1bml4IG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRvVW5peE1pbGxpKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IE1pbGxpc2Vjb25kIHwgbnVsbCB7XG4gIGlmIChub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQudXRjKHZhbHVlLCBmb3JtYXQpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPT09ICd4JyA/IHZhbHVlICogMTAwMCA6IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPGFueT4+KGQ6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgIT09IHVuZGVmaW5lZCAmJiBkICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZCBpcyBhIG51bWJlciwgdGhpcyBmaWx0ZXJlZCBvdXQgTmFOIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGQpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgb2JqZWN0IGhhcyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIHt9LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclNvcnQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGRUeXBlOiBzdHJpbmcpOiB0eXBlb2YgbnVtYmVyU29ydCB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBudW1iZXJTb3J0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIHdpdGggZXhhY3QgbnVtYmVyIG9mIGRlY2ltYWxzXG4gKiByZXR1cm4gYXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2VSb3VuZChudW06IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICByZXR1cm4gKFxuICAgIE1hdGgucm91bmQoXG4gICAgICBudW0gKiB0ICsgKGRlY2ltYWxzID4gMCA/IDEgOiAwKSAqIChNYXRoLnNpZ24obnVtKSAqICgxMCAvIE1hdGgucG93KDEwMCwgZGVjaW1hbHMpKSlcbiAgICApIC8gdFxuICApLnRvRml4ZWQoZGVjaW1hbHMpO1xufVxuXG4vKipcbiAqIHJvdW5kIGEgZ2l2aW5nIG51bWJlciBhdCBtb3N0IDQgZGVjaW1hbCBwbGFjZXNcbiAqIGUuZy4gMTAgLT4gMTAsIDEuMTIzNDUgLT4gMS4yMzQ1LCAyLjAgLT4gMlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRUb0ZvdXIobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBOdW1iZXIoYCR7TWF0aC5yb3VuZChgJHtudW19ZSs0YCl9ZS00YCk7XG59XG4vKipcbiAqIGdldCBudW1iZXIgb2YgZGVjaW1hbHMgdG8gcm91bmQgdG8gZm9yIHNsaWRlciBmcm9tIHN0ZXBcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcmV0dXJucy0gbnVtYmVyIG9mIGRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihzdGVwKSkge1xuICAgIGFzc2VydCgnc3RlcCBpcyBub3QgYSBudW1iZXInKTtcbiAgICBhc3NlcnQoc3RlcCk7XG4gIH1cblxuICBjb25zdCBzdGVwU3RyID0gc3RlcC50b1N0cmluZygpO1xuXG4gIC8vIGluIGNhc2UgdGhlIHN0ZXAgaXMgYSB2ZXJ5IHNtYWxsIG51bWJlciBlLmcuIDFlLTcsIHJldHVybiBkZWNpbWFsIGUuZy4gNyBkaXJlY3RseVxuICBjb25zdCBzcGxpdEV4cG9uZW50aWFsID0gc3RlcFN0ci5zcGxpdCgnZS0nKTtcbiAgaWYgKHNwbGl0RXhwb25lbnRpYWwubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgY29lZmZaZXJvID0gc3BsaXRFeHBvbmVudGlhbFswXS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGNvZWZmRGVjaW1hbCA9IGNvZWZmWmVyby5sZW5ndGggPT09IDEgPyAwIDogY29lZmZaZXJvWzFdLmxlbmd0aDtcbiAgICByZXR1cm4gcGFyc2VJbnQoc3BsaXRFeHBvbmVudGlhbFsxXSwgMTApICsgY29lZmZEZWNpbWFsO1xuICB9XG5cbiAgY29uc3Qgc3BsaXRaZXJvID0gc3RlcFN0ci5zcGxpdCgnLicpO1xuICBpZiAoc3BsaXRaZXJvLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzcGxpdFplcm9bMV0ubGVuZ3RoO1xufVxuXG4vKipcbiAqIElmIG1hcmtzIGlzIHByb3ZpZGVkLCBzbmFwIHRvIG1hcmtzLCBpZiBub3Qgbm9ybWFsaXplIHRvIHN0ZXBcbiAqIEBwYXJhbSB2YWxcbiAqIEBwYXJhbSBtaW5WYWx1ZVxuICogQHBhcmFtIHN0ZXBcbiAqIEBwYXJhbSBtYXJrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2xpZGVyVmFsdWUoXG4gIHZhbDogbnVtYmVyLFxuICBtaW5WYWx1ZTogbnVtYmVyLFxuICBzdGVwOiBudW1iZXIsXG4gIG1hcmtzPzogbnVtYmVyW11cbik6IG51bWJlciB7XG4gIGlmIChtYXJrcyAmJiBtYXJrcy5sZW5ndGgpIHtcbiAgICAvLyBVc2UgaW4gc2xpZGVyLCBnaXZlbiBhIG51bWJlciBhbmQgYW4gYXJyYXkgb2YgbnVtYmVycywgcmV0dXJuIHRoZSBuZWFycyBudW1iZXIgZnJvbSB0aGUgYXJyYXlcbiAgICByZXR1cm4gc25hcFRvTWFya3ModmFsLCBtYXJrcyk7XG4gIH1cblxuICByZXR1cm4gcm91bmRWYWxUb1N0ZXAobWluVmFsdWUsIHN0ZXAsIHZhbCk7XG59XG5cbi8qKlxuICogcm91bmQgdGhlIHZhbHVlIHRvIHN0ZXAgZm9yIHRoZSBzbGlkZXJcbiAqIEBwYXJhbSBtaW5WYWx1ZVxuICogQHBhcmFtIHN0ZXBcbiAqIEBwYXJhbSB2YWxcbiAqIEByZXR1cm5zIC0gcm91bmRlZCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kVmFsVG9TdGVwKG1pblZhbHVlOiBudW1iZXIsIHN0ZXA6IG51bWJlciwgdmFsOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIWlzTnVtYmVyKHN0ZXApIHx8ICFpc051bWJlcihtaW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgY29uc3QgZGVjaW1hbCA9IGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXApO1xuICBjb25zdCBzdGVwcyA9IE1hdGguZmxvb3IoKHZhbCAtIG1pblZhbHVlKSAvIHN0ZXApO1xuICBsZXQgcmVtYWluID0gdmFsIC0gKHN0ZXBzICogc3RlcCArIG1pblZhbHVlKTtcblxuICAvLyBoYXMgdG8gcm91bmQgYmVjYXVzZSBqYXZhc2NyaXB0IHR1cm5zIDAuMSBpbnRvIDAuOTk5OTk5OTk5OTk5OTk4N1xuICByZW1haW4gPSBOdW1iZXIocHJlY2lzZVJvdW5kKHJlbWFpbiwgOCkpO1xuXG4gIGxldCBjbG9zZXN0OiBudW1iZXI7XG4gIGlmIChyZW1haW4gPT09IDApIHtcbiAgICBjbG9zZXN0ID0gdmFsO1xuICB9IGVsc2UgaWYgKHJlbWFpbiA8IHN0ZXAgLyAyKSB7XG4gICAgY2xvc2VzdCA9IHN0ZXBzICogc3RlcCArIG1pblZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNsb3Nlc3QgPSAoc3RlcHMgKyAxKSAqIHN0ZXAgKyBtaW5WYWx1ZTtcbiAgfVxuXG4gIC8vIHByZWNpc2Ugcm91bmQgcmV0dXJuIGEgc3RyaW5nIHJvdW5kZWQgdG8gdGhlIGRlZmluZWQgZGVjaW1hbFxuICBjb25zdCByb3VuZGVkID0gcHJlY2lzZVJvdW5kKGNsb3Nlc3QsIGRlY2ltYWwpO1xuXG4gIHJldHVybiBOdW1iZXIocm91bmRlZCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3JtYXQgYmFzZWQgb24gZmllbGQgYW5kIGZvcm1hdCBvcHRpb25zXG4gKiBVc2VkIGluIHJlbmRlciB0b29sdGlwIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Rm9ybWF0dGVyOiBGaWVsZEZvcm1hdHRlciA9IHYgPT4gKG5vdE51bGxvclVuZGVmaW5lZCh2KSA/IFN0cmluZyh2KSA6ICcnKTtcblxuZXhwb3J0IGNvbnN0IGZsb2F0Rm9ybWF0dGVyID0gdiA9PiAoaXNOdW1iZXIodikgPyBTdHJpbmcocm91bmRUb0ZvdXIodikpIDogJycpO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQ6IHtcbiAgW2tleTogc3RyaW5nXTogRmllbGRGb3JtYXR0ZXI7XG59ID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ106IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZCA9PlxuICAgIHR5cGVvZiBkID09PSAnc3RyaW5nJ1xuICAgICAgPyBkXG4gICAgICA6IGlzUGxhaW5PYmplY3QoZClcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShkKVxuICAgICAgPyBgWyR7U3RyaW5nKGQpfV1gXG4gICAgICA6ICcnLFxuICBbQUxMX0ZJRUxEX1RZUEVTLm9iamVjdF06IEpTT04uc3RyaW5naWZ5LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmFycmF5XTogSlNPTi5zdHJpbmdpZnlcbn07XG5cbi8qKlxuICogUGFyc2UgZmllbGQgdmFsdWUgYW5kIHR5cGUgYW5kIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICovXG5leHBvcnQgY29uc3QgcGFyc2VGaWVsZFZhbHVlID0gKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0gPyBGSUVMRF9ESVNQTEFZX0ZPUk1BVFt0eXBlXSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSB0b1xuICovXG5leHBvcnQgY29uc3QgYXJyYXlNb3ZlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFRbXSA9PiB7XG4gIGFycmF5ID0gYXJyYXkuc2xpY2UoKTtcbiAgYXJyYXlNb3ZlTXV0YXRlKGFycmF5LCBmcm9tLCB0byk7XG4gIHJldHVybiBhcnJheTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3JtYXQgYmFzZWQgb24gZmllbGQgYW5kIGZvcm1hdCBvcHRpb25zXG4gKiBVc2VkIGluIHJlbmRlciB0b29sdGlwIHZhbHVlXG4gKiBAcGFyYW0gZm9ybWF0XG4gKiBAcGFyYW0gZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlcihcbiAgZm9ybWF0OiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBmaWVsZD86IEZpZWxkXG4pOiBGaWVsZEZvcm1hdHRlciB7XG4gIGlmICghZm9ybWF0KSB7XG4gICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbiAgY29uc3QgdG9vbHRpcEZvcm1hdCA9IE9iamVjdC52YWx1ZXMoVE9PTFRJUF9GT1JNQVRTKS5maW5kKGYgPT4gZltUT09MVElQX0tFWV0gPT09IGZvcm1hdCk7XG5cbiAgaWYgKHRvb2x0aXBGb3JtYXQpIHtcbiAgICByZXR1cm4gYXBwbHlEZWZhdWx0Rm9ybWF0KHRvb2x0aXBGb3JtYXQgYXMgVG9vbHRpcEZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiYgZmllbGQpIHtcbiAgICByZXR1cm4gYXBwbHlDdXN0b21Gb3JtYXQoZm9ybWF0LCBmaWVsZCk7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbkZvcm1hdHRlcihjb2xNZXRhOiBDb2xNZXRhUHJvcHMpOiBGaWVsZEZvcm1hdHRlciB7XG4gIGNvbnN0IHtmb3JtYXQsIGRpc3BsYXlGb3JtYXR9ID0gY29sTWV0YTtcblxuICBpZiAoIWZvcm1hdCAmJiAhZGlzcGxheUZvcm1hdCkge1xuICAgIHJldHVybiBGSUVMRF9ESVNQTEFZX0ZPUk1BVFtjb2xNZXRhLnR5cGVdO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBkaXNwbGF5Rm9ybWF0KTtcblxuICBpZiAodG9vbHRpcEZvcm1hdCkge1xuICAgIHJldHVybiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRpc3BsYXlGb3JtYXQgPT09ICdzdHJpbmcnICYmIGNvbE1ldGEpIHtcbiAgICByZXR1cm4gYXBwbHlDdXN0b21Gb3JtYXQoZGlzcGxheUZvcm1hdCwgY29sTWV0YSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRpc3BsYXlGb3JtYXQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGFwcGx5VmFsdWVNYXAoZGlzcGxheUZvcm1hdCk7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmFsdWVNYXAoZm9ybWF0KSB7XG4gIHJldHVybiB2ID0+IGZvcm1hdFt2XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0OiBUb29sdGlwRm9ybWF0KTogKHY6IGFueSkgPT4gc3RyaW5nIHtcbiAgaWYgKCF0b29sdGlwRm9ybWF0IHx8ICF0b29sdGlwRm9ybWF0LmZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG5cbiAgc3dpdGNoICh0b29sdGlwRm9ybWF0LnR5cGUpIHtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRFQ0lNQUw6XG4gICAgICByZXR1cm4gZDNGb3JtYXQodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuREFURTpcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVfVElNRTpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKSh0b29sdGlwRm9ybWF0LmZvcm1hdCk7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5QRVJDRU5UQUdFOlxuICAgICAgcmV0dXJuIHYgPT4gYCR7ZDNGb3JtYXQoVE9PTFRJUF9GT1JNQVRTLkRFQ0lNQUxfREVDSU1BTF9GSVhFRF8yLmZvcm1hdCkodil9JWA7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5CT09MRUFOOlxuICAgICAgcmV0dXJuIGdldEJvb2xlYW5Gb3JtYXR0ZXIodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbGVhbkZvcm1hdHRlcihmb3JtYXQ6IHN0cmluZyk6IEZpZWxkRm9ybWF0dGVyIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICcwMSc6XG4gICAgICByZXR1cm4gKHY6IEJvb2xlYW4pID0+ICh2ID8gJzEnIDogJzAnKTtcbiAgICBjYXNlICd5bic6XG4gICAgICByZXR1cm4gKHY6IEJvb2xlYW4pID0+ICh2ID8gJ3llcycgOiAnbm8nKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cbi8vIEFsbG93IHVzZXIgdG8gc3BlY2lmeSBjdXN0b20gdG9vbHRpcCBmb3JtYXQgdmlhIGNvbmZpZ1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICAgIHJldHVybiBkM0Zvcm1hdChmb3JtYXQpO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmRhdGU6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wOlxuICAgICAgcmV0dXJuIGRhdGV0aW1lRm9ybWF0dGVyKG51bGwpKGZvcm1hdCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2ID0+IHY7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0TGFyZ2VOdW1iZXIobikge1xuICAvLyBTSS1wcmVmaXggd2l0aCA0IHNpZ25pZmljYW50IGRpZ2l0c1xuICByZXR1cm4gZDNGb3JtYXQoJy40fnMnKShuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihuOiBudW1iZXIsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgIHJldHVybiBgLSR7Zm9ybWF0TnVtYmVyKC1uLCAnaW50ZWdlcicpfWA7XG4gICAgICB9XG4gICAgICBpZiAobiA8IDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMTAgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiBkM0Zvcm1hdCgnLCcpKE1hdGgucm91bmQobikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG4pO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgcmV0dXJuIGAtJHtmb3JtYXROdW1iZXIoLW4sICdudW1iZXInKX1gO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAxMDAwKSB7XG4gICAgICAgIHJldHVybiBkM0Zvcm1hdCgnLjR+cicpKG4pO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAxMCAqIDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGQzRm9ybWF0KCcsLjJ+ZicpKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG4pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXROdW1iZXIobiwgJ3JlYWwnKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCBlcG9jaCBtaWxsaXNlY29uZHMgd2l0aCBhIGZvcm1hdCBzdHJpbmdcbiAqIEB0eXBlIHRpbWV6b25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZUZvcm1hdHRlcihcbiAgdGltZXpvbmU/OiBzdHJpbmcgfCBudWxsXG4pOiAoZm9ybWF0Pzogc3RyaW5nKSA9PiAodHM6IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgcmV0dXJuIHRpbWV6b25lXG4gICAgPyBmb3JtYXQgPT4gdHMgPT5cbiAgICAgICAgbW9tZW50XG4gICAgICAgICAgLnV0Yyh0cylcbiAgICAgICAgICAudHoodGltZXpvbmUpXG4gICAgICAgICAgLmZvcm1hdChmb3JtYXQpXG4gICAgOiAvLyByZXR1cm4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgJ0ludmFsaWQgZGF0ZScgaWYgdHMgaXMgdW5kZWZpbmVkL251bGxcbiAgICAgIGZvcm1hdCA9PiB0cyA9PiAodHMgPyBtb21lbnQudXRjKHRzKS5mb3JtYXQoZm9ybWF0KSA6ICcnKTtcbn1cbiJdfQ==
@@ -1,4 +1,5 @@
1
- import { ProcessorResult, RGBColor, RowData, Field, FieldPair } from '@kepler.gl/types';
1
+ import { ProcessorResult, RGBColor, RowData, Field, FieldPair, TooltipFields } from '@kepler.gl/types';
2
+ import { TooltipFormat } from '@kepler.gl/constants';
2
3
  export declare const datasetColorMaker: Generator<RGBColor, any, unknown>;
3
4
  /**
4
5
  * Choose a field to use as the default color field of a layer.
@@ -43,6 +44,14 @@ export declare function getSampleForTypeAnalyze({ fields, rows, sampleCount }: {
43
44
  rows: unknown[][];
44
45
  sampleCount?: number;
45
46
  }): RowData;
47
+ /**
48
+ * Check if string is a valid Well-known binary (WKB) in HEX format
49
+ * https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
50
+ *
51
+ * @param str input string
52
+ * @returns true if string is a valid WKB in HEX format
53
+ */
54
+ export declare function isHexWkb(str: string | null): boolean;
46
55
  /**
47
56
  * Analyze field types from data in `string` format, e.g. uploaded csv.
48
57
  * Assign `type`, `fieldIdx` and `format` (timestamp only) to each field
@@ -103,3 +112,5 @@ export declare function renameDuplicateFields(fieldOrder: string[]): {
103
112
  * @returns corresponding type in `ALL_FIELD_TYPES`
104
113
  */
105
114
  export declare function analyzerTypeToFieldType(aType: string): string;
115
+ export declare function getFieldFormatLabels(fieldType?: string): TooltipFormat[];
116
+ export declare function getFormatLabels(fields: TooltipFields[], fieldName: string): TooltipFormat[];