@kepler.gl/utils 3.1.0-alpha.3 → 3.1.0-alpha.5

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.
@@ -4,9 +4,15 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.addCategoricalValuesToColorMap = addCategoricalValuesToColorMap;
8
+ exports.colorBreaksToCategoricalColorMap = colorBreaksToCategoricalColorMap;
7
9
  exports.colorBreaksToColorMap = colorBreaksToColorMap;
10
+ exports.colorMapToCategoricalColorBreaks = colorMapToCategoricalColorBreaks;
8
11
  exports.colorMapToColorBreaks = colorMapToColorBreaks;
12
+ exports.getCategoricalColorMap = getCategoricalColorMap;
13
+ exports.getCategoricalColorScale = getCategoricalColorScale;
9
14
  exports.getDomainStepsbyZoom = getDomainStepsbyZoom;
15
+ exports.getHistogramDomain = getHistogramDomain;
10
16
  exports.getLayerColorScale = getLayerColorScale;
11
17
  exports.getLegendOfScale = getLegendOfScale;
12
18
  exports.getLinearDomain = getLinearDomain;
@@ -19,13 +25,19 @@ exports.getQuantileDomain = getQuantileDomain;
19
25
  exports.getScaleFunction = getScaleFunction;
20
26
  exports.getThresholdsFromQuantiles = getThresholdsFromQuantiles;
21
27
  exports.getVisualChannelScaleByZoom = getVisualChannelScaleByZoom;
28
+ exports.initCustomPaletteByCustomScale = initCustomPaletteByCustomScale;
22
29
  exports.initializeLayerColorMap = initializeLayerColorMap;
23
30
  exports.isDomainQuantile = isDomainQuantile;
24
31
  exports.isDomainStops = isDomainStops;
25
32
  exports.isNumericColorBreaks = isNumericColorBreaks;
33
+ exports.removeCategoricalValueFromColorMap = removeCategoricalValueFromColorMap;
34
+ exports.resetCategoricalColorMapByIndex = resetCategoricalColorMapByIndex;
35
+ exports.selectRestCategoricalColorMapByIndex = selectRestCategoricalColorMapByIndex;
36
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
26
37
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
27
38
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
28
39
  var _d3Array = require("d3-array");
40
+ var _lodash = _interopRequireDefault(require("lodash.uniq"));
29
41
  var _moment = _interopRequireDefault(require("moment"));
30
42
  var _commonUtils = require("@kepler.gl/common-utils");
31
43
  var _constants = require("@kepler.gl/constants");
@@ -36,7 +48,7 @@ var _utils = require("./utils");
36
48
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
37
49
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
38
50
  // Copyright contributors to the kepler.gl project
39
- // import {Layer, VisualChannel, VisualChannelDomain} from '@kepler.gl/layers';
51
+ // import {FilterProps, KeplerTable} from '@kepler.gl/layers';
40
52
  // TODO isolate types - depends on @kepler.gl/layers
41
53
 
42
54
  /**
@@ -172,9 +184,10 @@ function getQuantLegends(scale, labelFormat) {
172
184
  if (typeof scale.invertExtent !== 'function') {
173
185
  return [];
174
186
  }
175
- var labels = scale.scaleType === 'threshold' || scale.scaleType === 'custom' ? getThresholdLabels(scale, scale.scaleType === 'custom' ? customScaleLabelFormat : function (n) {
176
- return n ? (0, _dataUtils.formatNumber)(n) : 'no value';
177
- }) : getScaleLabels(scale, labelFormat);
187
+ var thresholdLabelFormat = function thresholdLabelFormat(n, type) {
188
+ return n && labelFormat ? labelFormat(n) : n ? (0, _dataUtils.formatNumber)(n, type) : 'no value';
189
+ };
190
+ var labels = scale.scaleType === 'threshold' ? getThresholdLabels(scale, thresholdLabelFormat) : scale.scaleType === 'custom' ? getThresholdLabels(scale, customScaleLabelFormat) : getScaleLabels(scale, labelFormat);
178
191
  var data = scale.range();
179
192
  return labels.map(function (label, index) {
180
193
  return _objectSpread({
@@ -224,7 +237,7 @@ function getLegendOfScale(_ref) {
224
237
  if (!scale || scale.byZoom) {
225
238
  return [];
226
239
  }
227
- if (scaleType === _constants.SCALE_TYPES.ordinal) {
240
+ if (scaleType === _constants.SCALE_TYPES.ordinal || scaleType === _constants.SCALE_TYPES.customOrdinal || fieldType === _constants.ALL_FIELD_TYPES.string) {
228
241
  return getOrdinalLegends(scale);
229
242
  }
230
243
  var formatLabel = labelFormat || getQuantLabelFormat(scale.domain(), fieldType);
@@ -283,6 +296,64 @@ function getVisualChannelScaleByZoom(_ref3) {
283
296
  return scale;
284
297
  }
285
298
 
299
+ /**
300
+ * Get categorical colorMap from colors and domain (unique values)
301
+ */
302
+ function getCategoricalColorMap(colors, domain) {
303
+ // colorMap: [string | string[], hexstring]
304
+ var colorToUniqueValues = {};
305
+ var uniqueValues = (0, _dataUtils.unique)(domain).filter(_commonUtils.notNullorUndefined).sort();
306
+ // each unique value assign to a color, the rest unique values assign to last color
307
+ var lastColor = colors[colors.length - 1];
308
+ for (var i = 0; i < uniqueValues.length; ++i) {
309
+ if (i < colors.length) {
310
+ colorToUniqueValues[colors[i]] = uniqueValues[i];
311
+ } else {
312
+ colorToUniqueValues[lastColor] = [].concat((0, _toConsumableArray2["default"])(Array.isArray(colorToUniqueValues[lastColor]) ? colorToUniqueValues[lastColor] : [colorToUniqueValues[lastColor]]), [uniqueValues[i]]);
313
+ }
314
+ }
315
+ var colorMap = colors.map(function (color) {
316
+ if (color in colorToUniqueValues) {
317
+ return [colorToUniqueValues[color], color];
318
+ }
319
+ return [null, color];
320
+ });
321
+ return colorMap;
322
+ }
323
+
324
+ /**
325
+ * Get categorical colorBreaks from colorMap
326
+ */
327
+ function colorMapToCategoricalColorBreaks(colorMap) {
328
+ if (!colorMap) {
329
+ return null;
330
+ }
331
+ var colorBreaks = colorMap.map(function (_ref4, i) {
332
+ var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
333
+ value = _ref5[0],
334
+ color = _ref5[1];
335
+ return {
336
+ data: color,
337
+ label: value
338
+ };
339
+ });
340
+ return colorBreaks;
341
+ }
342
+
343
+ /**
344
+ * create categorical colorMap from colorBreaks
345
+ */
346
+ function colorBreaksToCategoricalColorMap(colorBreaks) {
347
+ // colorMap: [string | string[], hexstring]
348
+ var colors = (0, _lodash["default"])(colorBreaks.map(function (cb) {
349
+ return cb.data;
350
+ }));
351
+ var values = (0, _lodash["default"])(colorBreaks.map(function (cb) {
352
+ return cb.label;
353
+ }));
354
+ return getCategoricalColorMap(colors, values);
355
+ }
356
+
286
357
  /**
287
358
  * Convert color breaks UI input into colorRange.colorMap
288
359
  */
@@ -304,10 +375,10 @@ function colorMapToColorBreaks(colorMap) {
304
375
  if (!colorMap) {
305
376
  return null;
306
377
  }
307
- var colorBreaks = colorMap.map(function (_ref4, i) {
308
- var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
309
- value = _ref5[0],
310
- color = _ref5[1];
378
+ var colorBreaks = colorMap.map(function (_ref6, i) {
379
+ var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
380
+ value = _ref7[0],
381
+ color = _ref7[1];
311
382
  var range = i === 0 ?
312
383
  // first
313
384
  [-Infinity, value] :
@@ -335,6 +406,196 @@ function colorMapToColorBreaks(colorMap) {
335
406
  * Whether color breaks is for numeric field
336
407
  */
337
408
  function isNumericColorBreaks(colorBreaks) {
338
- return Array.isArray(colorBreaks) && colorBreaks.length && colorBreaks[0].inputs;
409
+ return Boolean(Array.isArray(colorBreaks) && colorBreaks.length && colorBreaks[0].inputs);
410
+ }
411
+
412
+ // return domainMin, domainMax, histogramMean
413
+ function getHistogramDomain(_ref8) {
414
+ var aggregatedBins = _ref8.aggregatedBins,
415
+ columnStats = _ref8.columnStats,
416
+ dataset = _ref8.dataset,
417
+ fieldValueAccessor = _ref8.fieldValueAccessor;
418
+ var domainMin = Number.POSITIVE_INFINITY;
419
+ var domainMax = Number.NEGATIVE_INFINITY;
420
+ var nValid = 0;
421
+ var domainSum = 0;
422
+ if (aggregatedBins) {
423
+ Object.values(aggregatedBins).forEach(function (bin) {
424
+ var val = bin.value;
425
+ if ((0, _dataUtils.isNumber)(val)) {
426
+ if (val < domainMin) domainMin = val;
427
+ if (val > domainMax) domainMax = val;
428
+ domainSum += val;
429
+ nValid += 1;
430
+ }
431
+ });
432
+ } else {
433
+ if (columnStats && columnStats.quantiles && columnStats.mean) {
434
+ // no need to recalcuate min/max/mean if its already in columnStats
435
+ return [columnStats.quantiles[0].value, columnStats.quantiles[columnStats.quantiles.length - 1].value, columnStats.mean];
436
+ }
437
+ if (dataset && fieldValueAccessor) {
438
+ dataset.allIndexes.forEach(function (x, i) {
439
+ var val = fieldValueAccessor(x);
440
+ if ((0, _dataUtils.isNumber)(val)) {
441
+ if (val < domainMin) domainMin = val;
442
+ if (val > domainMax) domainMax = val;
443
+ domainSum += val;
444
+ nValid += 1;
445
+ }
446
+ });
447
+ }
448
+ }
449
+ var histogramMean = nValid > 0 ? domainSum / nValid : 0;
450
+ return [nValid > 0 ? domainMin : 0, nValid > 0 ? domainMax : 0, histogramMean];
451
+ }
452
+ function resetCategoricalColorMapByIndex(colorMap, index) {
453
+ if (!colorMap) {
454
+ return colorMap;
455
+ }
456
+ var newColorMap = colorMap.map(function (cm, i) {
457
+ if (i === index) {
458
+ return [null, cm[1]];
459
+ }
460
+ return cm;
461
+ });
462
+ return newColorMap;
463
+ }
464
+
465
+ /**
466
+ * select rest categorical values for a colorMap by its index
467
+ */
468
+ function selectRestCategoricalColorMapByIndex(colorMap, index, uniqueValues) {
469
+ if (!colorMap || !uniqueValues) {
470
+ return colorMap;
471
+ }
472
+
473
+ // find unique values that has not been used in current colorMap
474
+ var uniqValueDict = Object.fromEntries(uniqueValues.map(function (val) {
475
+ return [val, false];
476
+ }));
477
+ colorMap.forEach(function (cm) {
478
+ (0, _commonUtils.toArray)(cm[0]).forEach(function (v) {
479
+ if (v) uniqValueDict[v] = true;
480
+ });
481
+ });
482
+ var rest = Object.keys(uniqValueDict).filter(function (v) {
483
+ return !uniqValueDict[v];
484
+ });
485
+
486
+ // use the not used unique values in the selected color map
487
+ var newColorMap = colorMap.map(function (cm, i) {
488
+ if (i === index) {
489
+ return [[].concat((0, _toConsumableArray2["default"])(rest), (0, _toConsumableArray2["default"])((0, _commonUtils.toArray)(cm[0]))), cm[1]];
490
+ }
491
+ return cm;
492
+ });
493
+ return newColorMap;
494
+ }
495
+
496
+ /**
497
+ * remove a categorical value from a colorMap by its index
498
+ */
499
+ function removeCategoricalValueFromColorMap(colorMap, item, index) {
500
+ if (!colorMap) {
501
+ return colorMap;
502
+ }
503
+ var newColorMap = colorMap.map(function (cm, i) {
504
+ if (i === index) {
505
+ if (!cm[0]) {
506
+ return [null, cm[1]];
507
+ }
508
+ var currentUniqueValues = (0, _commonUtils.toArray)(cm[0]);
509
+ var updatedUniqueValues = currentUniqueValues.filter(function (v) {
510
+ return v !== item;
511
+ });
512
+ return [updatedUniqueValues, cm[1]];
513
+ }
514
+ return cm;
515
+ });
516
+ return newColorMap;
517
+ }
518
+
519
+ /**
520
+ * add categorical values (from multisel dropdown) to a colorMap by its index
521
+ */
522
+ function addCategoricalValuesToColorMap(colorMap, items, index) {
523
+ if (!colorMap) {
524
+ return colorMap;
525
+ }
526
+ var newColorMap = colorMap.map(function (cm, i) {
527
+ if (i === index) {
528
+ if (!cm[0]) {
529
+ return [items, cm[1]];
530
+ }
531
+ var _currentUniqueValues = (0, _commonUtils.toArray)(cm[0]);
532
+ var updatedUniqueValues = (0, _lodash["default"])(_currentUniqueValues.concat(items));
533
+ return [updatedUniqueValues, cm[1]];
534
+ }
535
+ // remove value from other colorMap
536
+ var currentUniqueValues = cm[0];
537
+ if (Array.isArray(currentUniqueValues)) {
538
+ var _updatedUniqueValues = currentUniqueValues.filter(function (v) {
539
+ return !items.includes(v);
540
+ });
541
+ return [_updatedUniqueValues, cm[1]];
542
+ } else if (currentUniqueValues && items.includes(currentUniqueValues)) {
543
+ return [null, cm[1]];
544
+ }
545
+ return cm;
546
+ });
547
+ return newColorMap;
548
+ }
549
+
550
+ /**
551
+ * get a color scale func for categorical (custom ordinal) scale
552
+ */
553
+ function getCategoricalColorScale(colorDomain, colorRange) {
554
+ var useRgb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
555
+ var cMap = colorRange.colorMap ? colorRange.colorMap : getCategoricalColorMap(colorRange.colors, colorDomain);
556
+ var range = [];
557
+ var domain = [];
558
+ cMap.forEach(function (cm) {
559
+ if (Array.isArray(cm[0])) {
560
+ cm[0].forEach(function (val) {
561
+ domain.push(val);
562
+ range.push(useRgb ? (0, _colorUtils.hexToRgb)(cm[1]) : cm[1]);
563
+ });
564
+ } else {
565
+ domain.push(cm[0]);
566
+ range.push(useRgb ? (0, _colorUtils.hexToRgb)(cm[1]) : cm[1]);
567
+ }
568
+ });
569
+ var scale = getScaleFunction(_constants.SCALE_TYPES.customOrdinal, range, domain, false);
570
+ scale.unknown(_constants.NO_VALUE_COLOR);
571
+ return scale;
572
+ }
573
+
574
+ /**
575
+ * initialize customPalette by custom scale or customOrdinal scale
576
+ */
577
+ function initCustomPaletteByCustomScale(_ref9) {
578
+ var scale = _ref9.scale,
579
+ field = _ref9.field,
580
+ ordinalDomain = _ref9.ordinalDomain,
581
+ range = _ref9.range,
582
+ colorBreaks = _ref9.colorBreaks;
583
+ var customPaletteName = "color.customPalette.".concat(scale, ".").concat(field.name);
584
+ // reuse range.colorMap if the field and scale not changed
585
+ var reuseColorMap = range.colorMap && range.name === customPaletteName && range.type === scale;
586
+ var colorMap = reuseColorMap ? range.colorMap : scale === _constants.SCALE_TYPES.customOrdinal && ordinalDomain ? getCategoricalColorMap(range.colors, ordinalDomain) : colorBreaks && isNumericColorBreaks(colorBreaks) ? colorBreaksToColorMap(colorBreaks) : null;
587
+ var colors = reuseColorMap ? range.colors : colorMap ? colorMap.map(function (cm) {
588
+ return cm[1];
589
+ }) : range.colors;
590
+
591
+ // update custom breaks
592
+ var customPalette = {
593
+ category: 'Custom',
594
+ name: customPaletteName,
595
+ type: scale,
596
+ colorMap: colorMap,
597
+ colors: colors || []
598
+ };
599
+ return customPalette;
339
600
  }
340
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZDNBcnJheSIsInJlcXVpcmUiLCJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfY29sb3JVdGlscyIsIl9kYXRhVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfdXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImdldFF1YW50aWxlRG9tYWluIiwiZGF0YSIsInZhbHVlQWNjZXNzb3IiLCJzb3J0RnVuYyIsInZhbHVlcyIsIm1hcCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInNvcnQiLCJnZXRPcmRpbmFsRG9tYWluIiwiZGF0YUNvbnRhaW5lciIsIm1hcEluZGV4IiwidW5pcXVlIiwiZ2V0TGluZWFyRG9tYWluIiwicmFuZ2UiLCJleHRlbnQiLCJkIiwiaSIsInVuZGVmaW5lZCIsImdldExvZ0RvbWFpbiIsIl9nZXRMaW5lYXJEb21haW4iLCJfZ2V0TGluZWFyRG9tYWluMiIsIl9zbGljZWRUb0FycmF5MiIsImQwIiwiZDEiLCJpc0RvbWFpblN0b3BzIiwiZG9tYWluIiwiaXNQbGFpbk9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwieiIsImlzRG9tYWluUXVhbnRpbGUiLCJxdWFudGlsZXMiLCJnZXRUaHJlc2hvbGRzRnJvbVF1YW50aWxlcyIsImJ1Y2tldHMiLCJ0aHJlc2hvbGRzIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwb3NpdGlvbiIsImQzUXVhbnRpbGUiLCJnZXREb21haW5TdGVwc2J5Wm9vbSIsInN0ZXBzIiwiYmlzZWN0TGVmdCIsIk1hdGgiLCJtYXgiLCJnZXRTY2FsZUZ1bmN0aW9uIiwic2NhbGUiLCJmaXhlZCIsInNjYWxlRnVuY3Rpb24iLCJTQ0FMRV9GVU5DIiwic2NhbGVUeXBlIiwiZ2V0VGhyZXNob2xkTGFiZWxzIiwibGFiZWxGb3JtYXQiLCJnZW5MZW5ndGgiLCJpbnZlcnQiLCJpbnZlcnRFeHRlbnQiLCJpbnB1dHMiLCJyZXZlcnNlRm9ybWF0TnVtYmVyIiwibGFiZWwiLCJjb25jYXQiLCJnZXRTY2FsZUxhYmVscyIsImN1c3RvbVNjYWxlTGFiZWxGb3JtYXQiLCJuIiwiZm9ybWF0TnVtYmVyIiwiZ2V0UXVhbnRMZWdlbmRzIiwibGFiZWxzIiwiaW5kZXgiLCJyZ2JUb0hleCIsImdldE9yZGluYWxMZWdlbmRzIiwiZGF0dW0iLCJpc1JnYkNvbG9yIiwiZGVmYXVsdEZvcm1hdCIsImdldFRpbWVMYWJlbEZvcm1hdCIsImZvcm1hdHRlciIsImdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyIiwidmFsIiwibW9tZW50IiwidXRjIiwiZm9ybWF0IiwiZ2V0UXVhbnRMYWJlbEZvcm1hdCIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImlzTnVtYmVyIiwiZ2V0TGVnZW5kT2ZTY2FsZSIsIl9yZWYiLCJieVpvb20iLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJmb3JtYXRMYWJlbCIsImdldExheWVyQ29sb3JTY2FsZSIsIl9yZWYyIiwibGF5ZXIiLCJnZXRDb2xvclNjYWxlIiwiaW5pdGlhbGl6ZUxheWVyQ29sb3JNYXAiLCJ2aXN1YWxDaGFubmVsIiwiY29uZmlnIiwidmlzQ29uZmlnIiwiZmllbGQiLCJjb2xvckJyZWFrcyIsInR5cGUiLCJjb2xvckJyZWFrc1RvQ29sb3JNYXAiLCJnZXRWaXN1YWxDaGFubmVsU2NhbGVCeVpvb20iLCJfcmVmMyIsIl9zY2FsZSIsIm1hcFN0YXRlIiwiX2xheWVyJG1ldGEiLCJtZXRhIiwiZ2V0Wm9vbSIsInpvb20iLCJjb2xvck1hcCIsImNvbG9yQnJlYWsiLCJjb2xvck1hcFRvQ29sb3JCcmVha3MiLCJfcmVmNCIsIl9yZWY1IiwidmFsdWUiLCJjb2xvciIsIkluZmluaXR5IiwiaXNOdW1lcmljQ29sb3JCcmVha3MiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YS1zY2FsZS11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge2Jpc2VjdExlZnQsIHF1YW50aWxlU29ydGVkIGFzIGQzUXVhbnRpbGUsIGV4dGVudH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQge25vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIFNDQUxFX0ZVTkMsIFNDQUxFX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG4vLyBpbXBvcnQge0xheWVyLCBWaXN1YWxDaGFubmVsLCBWaXN1YWxDaGFubmVsRG9tYWlufSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0NvbG9yTWFwLCBDb2xvclJhbmdlLCBIZXhDb2xvciwgTWFwU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2lzUmdiQ29sb3IsIHJnYlRvSGV4fSBmcm9tICcuL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAnLi9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtmb3JtYXROdW1iZXIsIGlzTnVtYmVyLCByZXZlcnNlRm9ybWF0TnVtYmVyLCB1bmlxdWV9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyfSBmcm9tICcuL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBDb2xvckJyZWFrID0ge1xuICBkYXRhOiBIZXhDb2xvcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgcmFuZ2U6IG51bWJlcltdO1xuICBpbnB1dHM6IG51bWJlcltdO1xufTtcbmV4cG9ydCB0eXBlIENvbG9yQnJlYWtPcmRpbmFsID0ge1xuICBkYXRhOiBIZXhDb2xvcjtcbiAgbGFiZWw6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEQzU2NhbGVGdW5jdGlvbiA9IFJlY29yZDxzdHJpbmcsIGFueT4gJiAoKHg6IGFueSkgPT4gYW55KTtcblxuLy8gVE9ETyBpc29sYXRlIHR5cGVzIC0gZGVwZW5kcyBvbiBAa2VwbGVyLmdsL2xheWVyc1xudHlwZSBMYXllciA9IGFueTtcbnR5cGUgVmlzdWFsQ2hhbm5lbCA9IGFueTtcbnR5cGUgVmlzdWFsQ2hhbm5lbERvbWFpbiA9IGFueTtcblxuZXhwb3J0IHR5cGUgTGFiZWxGb3JtYXQgPSAobjogbnVtYmVyKSA9PiBzdHJpbmc7XG50eXBlIGRhdGFWYWx1ZUFjY2Vzc29yID0gPFQ+KHBhcmFtOiBUKSA9PiBUO1xudHlwZSBkYXRhQ29udGFpbmVyVmFsdWVBY2Nlc3NvciA9IChkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiBhbnk7XG50eXBlIHNvcnQgPSAoYTogYW55LCBiOiBhbnkpID0+IGFueTtcbi8qKlxuICogcmV0dXJuIHF1YW50aWxlIGRvbWFpbiBmb3IgYW4gYXJyYXkgb2YgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVhbnRpbGVEb21haW4oXG4gIGRhdGE6IGFueVtdLFxuICB2YWx1ZUFjY2Vzc29yPzogZGF0YVZhbHVlQWNjZXNzb3IsXG4gIHNvcnRGdW5jPzogc29ydFxuKTogbnVtYmVyW10ge1xuICBjb25zdCB2YWx1ZXMgPSB0eXBlb2YgdmFsdWVBY2Nlc3NvciA9PT0gJ2Z1bmN0aW9uJyA/IGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpIDogZGF0YTtcblxuICByZXR1cm4gdmFsdWVzLmZpbHRlcihub3ROdWxsb3JVbmRlZmluZWQpLnNvcnQoc29ydEZ1bmMpO1xufVxuXG4vKipcbiAqIHJldHVybiBvcmRpbmFsIGRvbWFpbiBmb3IgYSBkYXRhIGNvbnRhaW5lclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JkaW5hbERvbWFpbihcbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSxcbiAgdmFsdWVBY2Nlc3NvcjogZGF0YUNvbnRhaW5lclZhbHVlQWNjZXNzb3Jcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzID0gZGF0YUNvbnRhaW5lci5tYXBJbmRleCh2YWx1ZUFjY2Vzc29yKTtcblxuICByZXR1cm4gdW5pcXVlKHZhbHVlcykuZmlsdGVyKG5vdE51bGxvclVuZGVmaW5lZCkuc29ydCgpO1xufVxuXG4vKipcbiAqIHJldHVybiBsaW5lYXIgZG9tYWluIGZvciBhbiBhcnJheSBvZiBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lYXJEb21haW4oXG4gIGRhdGE6IG51bWJlcltdLFxuICB2YWx1ZUFjY2Vzc29yPzogZGF0YVZhbHVlQWNjZXNzb3Jcbik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCByYW5nZSA9IHR5cGVvZiB2YWx1ZUFjY2Vzc29yID09PSAnZnVuY3Rpb24nID8gZXh0ZW50KGRhdGEsIHZhbHVlQWNjZXNzb3IpIDogZXh0ZW50KGRhdGEpO1xuICByZXR1cm4gcmFuZ2UubWFwKChkOiB1bmRlZmluZWQgfCBudW1iZXIsIGk6IG51bWJlcikgPT4gKGQgPT09IHVuZGVmaW5lZCA/IGkgOiBkKSkgYXMgW1xuICAgIG51bWJlcixcbiAgICBudW1iZXJcbiAgXTtcbn1cblxuLyoqXG4gKiByZXR1cm4gbGluZWFyIGRvbWFpbiBmb3IgYW4gYXJyYXkgb2YgZGF0YS4gQSBsb2cgc2NhbGUgZG9tYWluIGNhbm5vdCBjb250YWluIDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ0RvbWFpbihkYXRhOiBhbnlbXSwgdmFsdWVBY2Nlc3NvcjogZGF0YVZhbHVlQWNjZXNzb3IpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgW2QwLCBkMV0gPSBnZXRMaW5lYXJEb21haW4oZGF0YSwgdmFsdWVBY2Nlc3Nvcik7XG4gIHJldHVybiBbZDAgPT09IDAgPyAxZS01IDogZDAsIGQxXTtcbn1cblxuZXhwb3J0IHR5cGUgRG9tYWluU3RvcHMgPSB7XG4gIHN0b3BzOiBudW1iZXJbXTtcbiAgejogbnVtYmVyW107XG59O1xuXG4vKipcbiAqIHdoZXRoZXIgZmllbGQgZG9tYWluIGlzIHN0b3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbWFpblN0b3BzKGRvbWFpbjogdW5rbm93bik6IGRvbWFpbiBpcyBEb21haW5TdG9wcyB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGRvbWFpbikgJiYgQXJyYXkuaXNBcnJheShkb21haW4uc3RvcHMpICYmIEFycmF5LmlzQXJyYXkoZG9tYWluLnopO1xufVxuXG5leHBvcnQgdHlwZSBEb21haW5RdWFudGlsZXMgPSB7XG4gIHF1YW50aWxlczogbnVtYmVyW107XG4gIHo6IG51bWJlcltdO1xufTtcblxuLyoqXG4gKiB3aGV0aGVyIGZpZWxkIGRvbWFpbiBpcyBxdWFudGlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tYWluUXVhbnRpbGUoZG9tYWluOiBhbnkpOiBkb21haW4gaXMgRG9tYWluUXVhbnRpbGVzIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoZG9tYWluKSAmJiBBcnJheS5pc0FycmF5KGRvbWFpbi5xdWFudGlsZXMpICYmIEFycmF5LmlzQXJyYXkoZG9tYWluLnopO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZG9tYWluIGF0IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRocmVzaG9sZHNGcm9tUXVhbnRpbGVzKFxuICBxdWFudGlsZXM6IG51bWJlcltdLFxuICBidWNrZXRzOiBudW1iZXJcbik6IChudW1iZXIgfCB1bmRlZmluZWQpW10ge1xuICBjb25zdCB0aHJlc2hvbGRzID0gW107XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGJ1Y2tldHMpIHx8IGJ1Y2tldHMgPCAxKSB7XG4gICAgcmV0dXJuIFtxdWFudGlsZXNbMF0sIHF1YW50aWxlc1txdWFudGlsZXMubGVuZ3RoIC0gMV1dO1xuICB9XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYnVja2V0czsgaSsrKSB7XG4gICAgLy8gcG9zaXRpb24gaW4gc29ydGVkIGFycmF5XG4gICAgY29uc3QgcG9zaXRpb24gPSBpIC8gYnVja2V0cztcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhyZXNob2xkcy5wdXNoKGQzUXVhbnRpbGUocXVhbnRpbGVzLCBwb3NpdGlvbikpO1xuICB9XG5cbiAgcmV0dXJuIHRocmVzaG9sZHM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkb21haW4gYXQgem9vbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluU3RlcHNieVpvb20oZG9tYWluOiBhbnlbXSwgc3RlcHM6IG51bWJlcltdLCB6OiBudW1iZXIpOiBhbnkge1xuICBjb25zdCBpID0gYmlzZWN0TGVmdChzdGVwcywgeik7XG5cbiAgaWYgKHN0ZXBzW2ldID09PSB6KSB7XG4gICAgLy8gSWYgeiBpcyBhbiBpbnRlZ2VyIHZhbHVlIGV4YWN0bHkgbWF0Y2hpbmcgYSBzdGVwLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZG9tYWluXG4gICAgcmV0dXJuIGRvbWFpbltpXTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgbmV4dCBjb2Fyc2VzdCBkb21haW5cbiAgcmV0dXJuIGRvbWFpbltNYXRoLm1heChpIC0gMSwgMCldO1xufVxuXG4vKipcbiAqIEdldCBkMyBzY2FsZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGdW5jdGlvbihcbiAgc2NhbGU6IHN0cmluZyxcbiAgcmFuZ2U6IGFueVtdIHwgSXRlcmFibGVJdGVyYXRvcjxhbnk+LFxuICBkb21haW46IChudW1iZXIgfCB1bmRlZmluZWQpW10gfCBzdHJpbmdbXSB8IEl0ZXJhYmxlSXRlcmF0b3I8YW55PixcbiAgZml4ZWQ/OiBib29sZWFuXG4pOiBEM1NjYWxlRnVuY3Rpb24ge1xuICBjb25zdCBzY2FsZUZ1bmN0aW9uID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdKClcbiAgICAuZG9tYWluKGRvbWFpbilcbiAgICAucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIHNjYWxlRnVuY3Rpb24uc2NhbGVUeXBlID0gZml4ZWQgPyAnbGluZWFyJyA6IHNjYWxlO1xuICByZXR1cm4gc2NhbGVGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBHZXQgdGhyZXNob2xkIHNjYWxlIGNvbG9yIGxhYmVsc1xuICovXG5mdW5jdGlvbiBnZXRUaHJlc2hvbGRMYWJlbHMoXG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24sXG4gIGxhYmVsRm9ybWF0OiBMYWJlbEZvcm1hdFxuKTogT21pdDxDb2xvckJyZWFrLCAnZGF0YSc+W10ge1xuICBjb25zdCBnZW5MZW5ndGggPSBzY2FsZS5yYW5nZSgpLmxlbmd0aDtcbiAgcmV0dXJuIHNjYWxlLnJhbmdlKCkubWFwKChkLCBpKSA9PiB7XG4gICAgY29uc3QgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0RXh0ZW50KGQpO1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIGkgPT09IDAgPyBudWxsIDogcmV2ZXJzZUZvcm1hdE51bWJlcihsYWJlbEZvcm1hdChpbnZlcnRbMF0pKSxcbiAgICAgIGkgPT09IGdlbkxlbmd0aCAtIDEgPyBudWxsIDogcmV2ZXJzZUZvcm1hdE51bWJlcihsYWJlbEZvcm1hdChpbnZlcnRbMV0pKVxuICAgIF07XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHJhdyB2YWx1ZVxuICAgICAgcmFuZ2U6IGludmVydCxcbiAgICAgIC8vIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgaW5wdXRzLFxuICAgICAgbGFiZWw6XG4gICAgICAgIGkgPT09IDBcbiAgICAgICAgICA/IGBMZXNzIHRoYW4gJHtsYWJlbEZvcm1hdChpbnZlcnRbMV0pfWBcbiAgICAgICAgICA6IGkgPT09IGdlbkxlbmd0aCAtIDFcbiAgICAgICAgICA/IGAke2xhYmVsRm9ybWF0KGludmVydFswXSl9IG9yIG1vcmVgXG4gICAgICAgICAgOiBgJHtsYWJlbEZvcm1hdChpbnZlcnRbMF0pfSB0byAke2xhYmVsRm9ybWF0KGludmVydFsxXSl9YFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBsaW5lYXIgLyBxdWFudCBzY2FsZSBjb2xvciBsYWJlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2NhbGVMYWJlbHMoXG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24sXG4gIGxhYmVsRm9ybWF0OiBMYWJlbEZvcm1hdFxuKTogT21pdDxDb2xvckJyZWFrLCAnZGF0YSc+W10ge1xuICByZXR1cm4gc2NhbGUucmFuZ2UoKS5tYXAoKGQsIGkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0RXh0ZW50KGQpO1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHJldmVyc2VGb3JtYXROdW1iZXIobGFiZWxGb3JtYXQoaW52ZXJ0WzBdKSksXG4gICAgICByZXZlcnNlRm9ybWF0TnVtYmVyKGxhYmVsRm9ybWF0KGludmVydFsxXSkpXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYCR7bGFiZWxGb3JtYXQoaW52ZXJ0WzBdKX0gdG8gJHtsYWJlbEZvcm1hdChpbnZlcnRbMV0pfWAsXG4gICAgICAvLyByYXcgdmFsdWVcbiAgICAgIHJhbmdlOiBpbnZlcnQsXG4gICAgICAvLyBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgIGlucHV0c1xuICAgIH07XG4gIH0pO1xufVxuXG5jb25zdCBjdXN0b21TY2FsZUxhYmVsRm9ybWF0ID0gbiA9PiAobiA/IGZvcm1hdE51bWJlcihuLCAncmVhbCcpIDogJ25vIHZhbHVlJyk7XG4vKipcbiAqIEdldCBsaW5lYXIgLyBxdWFudCBzY2FsZSBjb2xvciBicmVha3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YW50TGVnZW5kcyhzY2FsZTogRDNTY2FsZUZ1bmN0aW9uLCBsYWJlbEZvcm1hdDogTGFiZWxGb3JtYXQpOiBDb2xvckJyZWFrW10ge1xuICBpZiAodHlwZW9mIHNjYWxlLmludmVydEV4dGVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBsYWJlbHMgPVxuICAgIHNjYWxlLnNjYWxlVHlwZSA9PT0gJ3RocmVzaG9sZCcgfHwgc2NhbGUuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgPyBnZXRUaHJlc2hvbGRMYWJlbHMoXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgc2NhbGUuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgPyBjdXN0b21TY2FsZUxhYmVsRm9ybWF0XG4gICAgICAgICAgICA6IG4gPT4gKG4gPyBmb3JtYXROdW1iZXIobikgOiAnbm8gdmFsdWUnKVxuICAgICAgICApXG4gICAgICA6IGdldFNjYWxlTGFiZWxzKHNjYWxlLCBsYWJlbEZvcm1hdCk7XG5cbiAgY29uc3QgZGF0YSA9IHNjYWxlLnJhbmdlKCk7XG5cbiAgcmV0dXJuIGxhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4gKHtcbiAgICBkYXRhOiBBcnJheS5pc0FycmF5KGRhdGFbaW5kZXhdKSA/IHJnYlRvSGV4KGRhdGFbaW5kZXhdKSA6IGRhdGFbaW5kZXhdLFxuICAgIC4uLmxhYmVsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBHZXQgb3JkaW5hbCBjb2xvciBzY2FsZSBsZWdlbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRpbmFsTGVnZW5kcyhzY2FsZTogRDNTY2FsZUZ1bmN0aW9uKTogQ29sb3JCcmVha09yZGluYWxbXSB7XG4gIGNvbnN0IGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpO1xuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5kb21haW4oKTtcbiAgY29uc3QgZGF0YSA9IGRvbWFpbi5tYXAoc2NhbGUpO1xuXG4gIHJldHVybiBkYXRhLm1hcCgoZGF0dW0sIGluZGV4KSA9PiAoe1xuICAgIGRhdGE6IGlzUmdiQ29sb3IoZGF0dW0pID8gcmdiVG9IZXgoZGF0dW0pIDogZGF0dW0sXG4gICAgbGFiZWw6IGxhYmVsc1tpbmRleF1cbiAgfSkpO1xufVxuXG5jb25zdCBkZWZhdWx0Rm9ybWF0ID0gZCA9PiBkO1xuXG5jb25zdCBnZXRUaW1lTGFiZWxGb3JtYXQgPSBkb21haW4gPT4ge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBnZXRUaW1lV2lkZ2V0SGludEZvcm1hdHRlcihkb21haW4pO1xuICByZXR1cm4gdmFsID0+IG1vbWVudC51dGModmFsKS5mb3JtYXQoZm9ybWF0dGVyKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFudExhYmVsRm9ybWF0KGRvbWFpbiwgZmllbGRUeXBlKSB7XG4gIC8vIHF1YW50IHNjYWxlIGNhbiBvbmx5IGJlIGFzc2lnbmVkIHRvIGxpbmVhciBGaWVsZHM6IHJlYWwsIHRpbWVzdGFtcCwgaW50ZWdlclxuICByZXR1cm4gZmllbGRUeXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wXG4gICAgPyBnZXRUaW1lTGFiZWxGb3JtYXQoZG9tYWluKVxuICAgIDogIWZpZWxkVHlwZVxuICAgID8gZGVmYXVsdEZvcm1hdFxuICAgIDogbiA9PiAoaXNOdW1iZXIobikgPyBmb3JtYXROdW1iZXIobiwgZmllbGRUeXBlKSA6ICdubyB2YWx1ZScpO1xufVxuXG4vKipcbiAqIEdldCBsZWdlbmRzIGZvciBzY2FsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVnZW5kT2ZTY2FsZSh7XG4gIHNjYWxlLFxuICBzY2FsZVR5cGUsXG4gIGxhYmVsRm9ybWF0LFxuICBmaWVsZFR5cGVcbn06IHtcbiAgc2NhbGU/OiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgbGFiZWxGb3JtYXQ/OiBMYWJlbEZvcm1hdDtcbiAgZmllbGRUeXBlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xufSk6IENvbG9yQnJlYWtbXSB8IENvbG9yQnJlYWtPcmRpbmFsW10ge1xuICBpZiAoIXNjYWxlIHx8IHNjYWxlLmJ5Wm9vbSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoc2NhbGVUeXBlID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsKSB7XG4gICAgcmV0dXJuIGdldE9yZGluYWxMZWdlbmRzKHNjYWxlKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdExhYmVsID0gbGFiZWxGb3JtYXQgfHwgZ2V0UXVhbnRMYWJlbEZvcm1hdChzY2FsZS5kb21haW4oKSwgZmllbGRUeXBlKTtcblxuICByZXR1cm4gZ2V0UXVhbnRMZWdlbmRzKHNjYWxlLCBmb3JtYXRMYWJlbCk7XG59XG5cbi8qKlxuICogR2V0IGNvbG9yIHNjYWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckNvbG9yU2NhbGUoe1xuICByYW5nZSxcbiAgZG9tYWluLFxuICBzY2FsZVR5cGUsXG4gIGxheWVyXG59OiB7XG4gIHJhbmdlOiBDb2xvclJhbmdlIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgZG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgbGF5ZXI6IExheWVyO1xuICBpc0ZpeGVkPzogYm9vbGVhbjtcbn0pOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsIHtcbiAgaWYgKHJhbmdlICYmIGRvbWFpbiAmJiBzY2FsZVR5cGUpIHtcbiAgICByZXR1cm4gbGF5ZXIuZ2V0Q29sb3JTY2FsZShzY2FsZVR5cGUsIGRvbWFpbiwgcmFuZ2UpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3JSYW5nZS5jb2xvck1hcCBpbnRvIGNvbG9yIGJyZWFrcyBVSSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUxheWVyQ29sb3JNYXAobGF5ZXI6IExheWVyLCB2aXN1YWxDaGFubmVsOiBWaXN1YWxDaGFubmVsKTogQ29sb3JNYXAge1xuICBjb25zdCBkb21haW4gPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5kb21haW5dO1xuICBjb25zdCByYW5nZSA9IGxheWVyLmNvbmZpZy52aXNDb25maWdbdmlzdWFsQ2hhbm5lbC5yYW5nZV07XG4gIGNvbnN0IHNjYWxlVHlwZSA9IGxheWVyLmNvbmZpZ1t2aXN1YWxDaGFubmVsLnNjYWxlXTtcbiAgY29uc3QgZmllbGQgPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG5cbiAgY29uc3Qgc2NhbGUgPSBnZXRMYXllckNvbG9yU2NhbGUoe1xuICAgIHJhbmdlLFxuICAgIGRvbWFpbixcbiAgICBzY2FsZVR5cGUsXG4gICAgbGF5ZXJcbiAgfSk7XG5cbiAgY29uc3QgY29sb3JCcmVha3MgPSBnZXRMZWdlbmRPZlNjYWxlKHtcbiAgICBzY2FsZTogc2NhbGU/LmJ5Wm9vbSA/IHNjYWxlKDApIDogc2NhbGUsXG4gICAgc2NhbGVUeXBlLFxuICAgIGZpZWxkVHlwZTogZmllbGQudHlwZVxuICB9KTtcbiAgcmV0dXJuIGNvbG9yQnJlYWtzVG9Db2xvck1hcChjb2xvckJyZWFrcyk7XG59XG5cbi8qKlxuICogR2V0IHZpc3VhbCBjaGFuZWwgc2NhbGUgZnVuY3Rpb24gaWYgaXQncyBiYXNlZCBvbiB6b29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaXN1YWxDaGFubmVsU2NhbGVCeVpvb20oe1xuICBzY2FsZSxcbiAgbGF5ZXIsXG4gIG1hcFN0YXRlXG59OiB7XG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsO1xuICBsYXllcjogTGF5ZXI7XG4gIG1hcFN0YXRlPzogTWFwU3RhdGU7XG59KTogRDNTY2FsZUZ1bmN0aW9uIHwgbnVsbCB7XG4gIGlmIChzY2FsZT8uYnlab29tKSB7XG4gICAgY29uc3QgeiA9IGxheWVyLm1ldGE/LmdldFpvb20gPyBsYXllci5tZXRhLmdldFpvb20obWFwU3RhdGUpIDogbWFwU3RhdGU/Lnpvb207XG4gICAgc2NhbGUgPSBOdW1iZXIuaXNGaW5pdGUoeikgPyBzY2FsZSh6KSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3IgYnJlYWtzIFVJIGlucHV0IGludG8gY29sb3JSYW5nZS5jb2xvck1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JCcmVha3NUb0NvbG9yTWFwKGNvbG9yQnJlYWtzOiBDb2xvckJyZWFrW10gfCBDb2xvckJyZWFrT3JkaW5hbFtdKTogQ29sb3JNYXAge1xuICBjb25zdCBjb2xvck1hcCA9IGNvbG9yQnJlYWtzLm1hcCgoY29sb3JCcmVhaywgaSkgPT4ge1xuICAgIC8vIFt2YWx1ZSwgaGV4XVxuICAgIHJldHVybiBbXG4gICAgICBjb2xvckJyZWFrLmlucHV0c1xuICAgICAgICA/IGkgPT09IGNvbG9yQnJlYWtzLmxlbmd0aCAtIDFcbiAgICAgICAgICA/IG51bGwgLy8gbGFzdFxuICAgICAgICAgIDogY29sb3JCcmVhay5pbnB1dHNbMV1cbiAgICAgICAgOiBjb2xvckJyZWFrLmxhYmVsLFxuICAgICAgY29sb3JCcmVhay5kYXRhXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gQHRzLWlnbm9yZSB0dXBsZVxuICByZXR1cm4gY29sb3JNYXA7XG59XG5cbi8qKlxuICogQ29udmVydCBjb2xvclJhbmdlLmNvbG9yTWFwIGludG8gY29sb3IgYnJlYWtzIFVJIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvck1hcFRvQ29sb3JCcmVha3MoY29sb3JNYXA/OiBDb2xvck1hcCk6IENvbG9yQnJlYWtbXSB8IG51bGwge1xuICBpZiAoIWNvbG9yTWFwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29sb3JCcmVha3MgPSBjb2xvck1hcC5tYXAoKFt2YWx1ZSwgY29sb3JdLCBpKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPVxuICAgICAgaSA9PT0gMFxuICAgICAgICA/IC8vIGZpcnN0XG4gICAgICAgICAgWy1JbmZpbml0eSwgdmFsdWVdXG4gICAgICAgIDogLy8gbGFzdFxuICAgICAgICBpID09PSBjb2xvck1hcC5sZW5ndGggLSAxXG4gICAgICAgID8gW2NvbG9yTWFwW2kgLSAxXVswXSwgSW5maW5pdHldXG4gICAgICAgIDogLy8gZWxzZVxuICAgICAgICAgIFtjb2xvck1hcFtpIC0gMV1bMF0sIHZhbHVlXTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogY29sb3IsXG4gICAgICByYW5nZSxcbiAgICAgIGlucHV0czogcmFuZ2UsXG4gICAgICBsYWJlbDpcbiAgICAgICAgLy8gZmlyc3RcbiAgICAgICAgaSA9PT0gMFxuICAgICAgICAgID8gYExlc3MgdGhhbiAke3ZhbHVlfWBcbiAgICAgICAgICA6IC8vIGxhc3RcbiAgICAgICAgICBpID09PSBjb2xvck1hcC5sZW5ndGggLSAxXG4gICAgICAgICAgPyBgJHtjb2xvck1hcFtpIC0gMV1bMF19IG9yIG1vcmVgXG4gICAgICAgICAgOiBgJHtjb2xvck1hcFtpIC0gMV1bMF19IHRvICR7dmFsdWV9YFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIEB0cy1pZ25vcmUgaW1wbGVtZW50IGNvbnZlcnNpb24gZm9yIG9yZGluYWxcbiAgcmV0dXJuIGNvbG9yQnJlYWtzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgY29sb3IgYnJlYWtzIGlzIGZvciBudW1lcmljIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNDb2xvckJyZWFrcyhjb2xvckJyZWFrczogdW5rbm93bik6IGNvbG9yQnJlYWtzIGlzIENvbG9yQnJlYWtbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbG9yQnJlYWtzKSAmJiBjb2xvckJyZWFrcy5sZW5ndGggJiYgY29sb3JCcmVha3NbMF0uaW5wdXRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFJQSxJQUFBSyxXQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxVQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFBc0MsU0FBQVMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxD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
601
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZDNBcnJheSIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tb21lbnQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX2NvbG9yVXRpbHMiLCJfZGF0YVV0aWxzIiwiX2ZpbHRlclV0aWxzIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRRdWFudGlsZURvbWFpbiIsImRhdGEiLCJ2YWx1ZUFjY2Vzc29yIiwic29ydEZ1bmMiLCJ2YWx1ZXMiLCJtYXAiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJzb3J0IiwiZ2V0T3JkaW5hbERvbWFpbiIsImRhdGFDb250YWluZXIiLCJtYXBJbmRleCIsInVuaXF1ZSIsImdldExpbmVhckRvbWFpbiIsInJhbmdlIiwiZXh0ZW50IiwiZCIsImkiLCJ1bmRlZmluZWQiLCJnZXRMb2dEb21haW4iLCJfZ2V0TGluZWFyRG9tYWluIiwiX2dldExpbmVhckRvbWFpbjIiLCJfc2xpY2VkVG9BcnJheTIiLCJkMCIsImQxIiwiaXNEb21haW5TdG9wcyIsImRvbWFpbiIsImlzUGxhaW5PYmplY3QiLCJBcnJheSIsImlzQXJyYXkiLCJzdG9wcyIsInoiLCJpc0RvbWFpblF1YW50aWxlIiwicXVhbnRpbGVzIiwiZ2V0VGhyZXNob2xkc0Zyb21RdWFudGlsZXMiLCJidWNrZXRzIiwidGhyZXNob2xkcyIsIk51bWJlciIsImlzRmluaXRlIiwicG9zaXRpb24iLCJkM1F1YW50aWxlIiwiZ2V0RG9tYWluU3RlcHNieVpvb20iLCJzdGVwcyIsImJpc2VjdExlZnQiLCJNYXRoIiwibWF4IiwiZ2V0U2NhbGVGdW5jdGlvbiIsInNjYWxlIiwiZml4ZWQiLCJzY2FsZUZ1bmN0aW9uIiwiU0NBTEVfRlVOQyIsInNjYWxlVHlwZSIsImdldFRocmVzaG9sZExhYmVscyIsImxhYmVsRm9ybWF0IiwiZ2VuTGVuZ3RoIiwiaW52ZXJ0IiwiaW52ZXJ0RXh0ZW50IiwiaW5wdXRzIiwicmV2ZXJzZUZvcm1hdE51bWJlciIsImxhYmVsIiwiY29uY2F0IiwiZ2V0U2NhbGVMYWJlbHMiLCJjdXN0b21TY2FsZUxhYmVsRm9ybWF0IiwibiIsImZvcm1hdE51bWJlciIsImdldFF1YW50TGVnZW5kcyIsInRocmVzaG9sZExhYmVsRm9ybWF0IiwidHlwZSIsImxhYmVscyIsImluZGV4IiwicmdiVG9IZXgiLCJnZXRPcmRpbmFsTGVnZW5kcyIsImRhdHVtIiwiaXNSZ2JDb2xvciIsImRlZmF1bHRGb3JtYXQiLCJnZXRUaW1lTGFiZWxGb3JtYXQiLCJmb3JtYXR0ZXIiLCJnZXRUaW1lV2lkZ2V0SGludEZvcm1hdHRlciIsInZhbCIsIm1vbWVudCIsInV0YyIsImZvcm1hdCIsImdldFF1YW50TGFiZWxGb3JtYXQiLCJmaWVsZFR5cGUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJpc051bWJlciIsImdldExlZ2VuZE9mU2NhbGUiLCJfcmVmIiwiYnlab29tIiwiU0NBTEVfVFlQRVMiLCJvcmRpbmFsIiwiY3VzdG9tT3JkaW5hbCIsInN0cmluZyIsImZvcm1hdExhYmVsIiwiZ2V0TGF5ZXJDb2xvclNjYWxlIiwiX3JlZjIiLCJsYXllciIsImdldENvbG9yU2NhbGUiLCJpbml0aWFsaXplTGF5ZXJDb2xvck1hcCIsInZpc3VhbENoYW5uZWwiLCJjb25maWciLCJ2aXNDb25maWciLCJmaWVsZCIsImNvbG9yQnJlYWtzIiwiY29sb3JCcmVha3NUb0NvbG9yTWFwIiwiZ2V0VmlzdWFsQ2hhbm5lbFNjYWxlQnlab29tIiwiX3JlZjMiLCJfc2NhbGUiLCJtYXBTdGF0ZSIsIl9sYXllciRtZXRhIiwibWV0YSIsImdldFpvb20iLCJ6b29tIiwiZ2V0Q2F0ZWdvcmljYWxDb2xvck1hcCIsImNvbG9ycyIsImNvbG9yVG9VbmlxdWVWYWx1ZXMiLCJ1bmlxdWVWYWx1ZXMiLCJsYXN0Q29sb3IiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiY29sb3JNYXAiLCJjb2xvciIsImNvbG9yTWFwVG9DYXRlZ29yaWNhbENvbG9yQnJlYWtzIiwiX3JlZjQiLCJfcmVmNSIsInZhbHVlIiwiY29sb3JCcmVha3NUb0NhdGVnb3JpY2FsQ29sb3JNYXAiLCJ1bmlxIiwiY2IiLCJjb2xvckJyZWFrIiwiY29sb3JNYXBUb0NvbG9yQnJlYWtzIiwiX3JlZjYiLCJfcmVmNyIsIkluZmluaXR5IiwiaXNOdW1lcmljQ29sb3JCcmVha3MiLCJCb29sZWFuIiwiZ2V0SGlzdG9ncmFtRG9tYWluIiwiX3JlZjgiLCJhZ2dyZWdhdGVkQmlucyIsImNvbHVtblN0YXRzIiwiZGF0YXNldCIsImZpZWxkVmFsdWVBY2Nlc3NvciIsImRvbWFpbk1pbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZG9tYWluTWF4IiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJuVmFsaWQiLCJkb21haW5TdW0iLCJiaW4iLCJtZWFuIiwiYWxsSW5kZXhlcyIsIngiLCJoaXN0b2dyYW1NZWFuIiwicmVzZXRDYXRlZ29yaWNhbENvbG9yTWFwQnlJbmRleCIsIm5ld0NvbG9yTWFwIiwiY20iLCJzZWxlY3RSZXN0Q2F0ZWdvcmljYWxDb2xvck1hcEJ5SW5kZXgiLCJ1bmlxVmFsdWVEaWN0IiwiZnJvbUVudHJpZXMiLCJ0b0FycmF5IiwidiIsInJlc3QiLCJyZW1vdmVDYXRlZ29yaWNhbFZhbHVlRnJvbUNvbG9yTWFwIiwiaXRlbSIsImN1cnJlbnRVbmlxdWVWYWx1ZXMiLCJ1cGRhdGVkVW5pcXVlVmFsdWVzIiwiYWRkQ2F0ZWdvcmljYWxWYWx1ZXNUb0NvbG9yTWFwIiwiaXRlbXMiLCJpbmNsdWRlcyIsImdldENhdGVnb3JpY2FsQ29sb3JTY2FsZSIsImNvbG9yRG9tYWluIiwiY29sb3JSYW5nZSIsInVzZVJnYiIsImNNYXAiLCJoZXhUb1JnYiIsInVua25vd24iLCJOT19WQUxVRV9DT0xPUiIsImluaXRDdXN0b21QYWxldHRlQnlDdXN0b21TY2FsZSIsIl9yZWY5Iiwib3JkaW5hbERvbWFpbiIsImN1c3RvbVBhbGV0dGVOYW1lIiwibmFtZSIsInJldXNlQ29sb3JNYXAiLCJjdXN0b21QYWxldHRlIiwiY2F0ZWdvcnkiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YS1zY2FsZS11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge2Jpc2VjdExlZnQsIHF1YW50aWxlU29ydGVkIGFzIGQzUXVhbnRpbGUsIGV4dGVudH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQge25vdE51bGxvclVuZGVmaW5lZCwgdG9BcnJheX0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIFNDQUxFX0ZVTkMsIFNDQUxFX1RZUEVTLCBOT19WQUxVRV9DT0xPUn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuLy8gaW1wb3J0IHtGaWx0ZXJQcm9wcywgS2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZWRCaW4sXG4gIENvbG9yTWFwLFxuICBDb2xvclJhbmdlLFxuICBIZXhDb2xvcixcbiAgS2VwbGVyTGF5ZXIgYXMgTGF5ZXIsXG4gIE1hcFN0YXRlLFxuICBWaXN1YWxDaGFubmVsLFxuICBWaXN1YWxDaGFubmVsRG9tYWluLFxuICBSR0JDb2xvcixcbiAgUkdCQUNvbG9yLFxuICBDb2xvclVJLFxuICBGaWVsZFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuaW1wb3J0IHtpc1JnYkNvbG9yLCByZ2JUb0hleCwgaGV4VG9SZ2J9IGZyb20gJy4vY29sb3ItdXRpbHMnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLWludGVyZmFjZSc7XG5pbXBvcnQge2Zvcm1hdE51bWJlciwgaXNOdW1iZXIsIHJldmVyc2VGb3JtYXROdW1iZXIsIHVuaXF1ZX0gZnJvbSAnLi9kYXRhLXV0aWxzJztcbmltcG9ydCB7Z2V0VGltZVdpZGdldEhpbnRGb3JtYXR0ZXJ9IGZyb20gJy4vZmlsdGVyLXV0aWxzJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIENvbG9yQnJlYWsgPSB7XG4gIGRhdGE6IEhleENvbG9yO1xuICBsYWJlbDogc3RyaW5nO1xuICByYW5nZTogbnVtYmVyW107XG4gIGlucHV0czogbnVtYmVyW107XG59O1xuZXhwb3J0IHR5cGUgQ29sb3JCcmVha09yZGluYWwgPSB7XG4gIGRhdGE6IEhleENvbG9yO1xuICBsYWJlbDogc3RyaW5nIHwgbnVtYmVyIHwgc3RyaW5nW10gfCBudW1iZXJbXSB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBEM1NjYWxlRnVuY3Rpb24gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgKCh4OiBhbnkpID0+IGFueSk7XG5cbi8vIFRPRE8gaXNvbGF0ZSB0eXBlcyAtIGRlcGVuZHMgb24gQGtlcGxlci5nbC9sYXllcnNcbnR5cGUgRmlsdGVyUHJvcHMgPSBhbnk7XG50eXBlIEtlcGxlclRhYmxlID0gYW55O1xuXG5leHBvcnQgdHlwZSBMYWJlbEZvcm1hdCA9IChuOiBudW1iZXIsIHR5cGU/OiBzdHJpbmcpID0+IHN0cmluZztcbnR5cGUgZGF0YVZhbHVlQWNjZXNzb3IgPSA8VD4ocGFyYW06IFQpID0+IFQ7XG50eXBlIGRhdGFDb250YWluZXJWYWx1ZUFjY2Vzc29yID0gKGQ6IHtpbmRleDogbnVtYmVyfSwgZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpID0+IGFueTtcbnR5cGUgc29ydCA9IChhOiBhbnksIGI6IGFueSkgPT4gYW55O1xuLyoqXG4gKiByZXR1cm4gcXVhbnRpbGUgZG9tYWluIGZvciBhbiBhcnJheSBvZiBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFudGlsZURvbWFpbihcbiAgZGF0YTogYW55W10sXG4gIHZhbHVlQWNjZXNzb3I/OiBkYXRhVmFsdWVBY2Nlc3NvcixcbiAgc29ydEZ1bmM/OiBzb3J0XG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHZhbHVlcyA9IHR5cGVvZiB2YWx1ZUFjY2Vzc29yID09PSAnZnVuY3Rpb24nID8gZGF0YS5tYXAodmFsdWVBY2Nlc3NvcikgOiBkYXRhO1xuXG4gIHJldHVybiB2YWx1ZXMuZmlsdGVyKG5vdE51bGxvclVuZGVmaW5lZCkuc29ydChzb3J0RnVuYyk7XG59XG5cbi8qKlxuICogcmV0dXJuIG9yZGluYWwgZG9tYWluIGZvciBhIGRhdGEgY29udGFpbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRpbmFsRG9tYWluKFxuICBkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLFxuICB2YWx1ZUFjY2Vzc29yOiBkYXRhQ29udGFpbmVyVmFsdWVBY2Nlc3NvclxuKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXMgPSBkYXRhQ29udGFpbmVyLm1hcEluZGV4KHZhbHVlQWNjZXNzb3IpO1xuXG4gIHJldHVybiB1bmlxdWUodmFsdWVzKS5maWx0ZXIobm90TnVsbG9yVW5kZWZpbmVkKS5zb3J0KCk7XG59XG5cbi8qKlxuICogcmV0dXJuIGxpbmVhciBkb21haW4gZm9yIGFuIGFycmF5IG9mIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVhckRvbWFpbihcbiAgZGF0YTogbnVtYmVyW10sXG4gIHZhbHVlQWNjZXNzb3I/OiBkYXRhVmFsdWVBY2Nlc3NvclxuKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZhbHVlQWNjZXNzb3IgPT09ICdmdW5jdGlvbicgPyBleHRlbnQoZGF0YSwgdmFsdWVBY2Nlc3NvcikgOiBleHRlbnQoZGF0YSk7XG4gIHJldHVybiByYW5nZS5tYXAoKGQ6IHVuZGVmaW5lZCB8IG51bWJlciwgaTogbnVtYmVyKSA9PiAoZCA9PT0gdW5kZWZpbmVkID8gaSA6IGQpKSBhcyBbXG4gICAgbnVtYmVyLFxuICAgIG51bWJlclxuICBdO1xufVxuXG4vKipcbiAqIHJldHVybiBsaW5lYXIgZG9tYWluIGZvciBhbiBhcnJheSBvZiBkYXRhLiBBIGxvZyBzY2FsZSBkb21haW4gY2Fubm90IGNvbnRhaW4gMFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nRG9tYWluKGRhdGE6IGFueVtdLCB2YWx1ZUFjY2Vzc29yOiBkYXRhVmFsdWVBY2Nlc3Nvcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBbZDAsIGQxXSA9IGdldExpbmVhckRvbWFpbihkYXRhLCB2YWx1ZUFjY2Vzc29yKTtcbiAgcmV0dXJuIFtkMCA9PT0gMCA/IDFlLTUgOiBkMCwgZDFdO1xufVxuXG5leHBvcnQgdHlwZSBEb21haW5TdG9wcyA9IHtcbiAgc3RvcHM6IG51bWJlcltdO1xuICB6OiBudW1iZXJbXTtcbn07XG5cbi8qKlxuICogd2hldGhlciBmaWVsZCBkb21haW4gaXMgc3RvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tYWluU3RvcHMoZG9tYWluOiB1bmtub3duKTogZG9tYWluIGlzIERvbWFpblN0b3BzIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoZG9tYWluKSAmJiBBcnJheS5pc0FycmF5KGRvbWFpbi5zdG9wcykgJiYgQXJyYXkuaXNBcnJheShkb21haW4ueik7XG59XG5cbmV4cG9ydCB0eXBlIERvbWFpblF1YW50aWxlcyA9IHtcbiAgcXVhbnRpbGVzOiBudW1iZXJbXTtcbiAgejogbnVtYmVyW107XG59O1xuXG4vKipcbiAqIHdoZXRoZXIgZmllbGQgZG9tYWluIGlzIHF1YW50aWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb21haW5RdWFudGlsZShkb21haW46IGFueSk6IGRvbWFpbiBpcyBEb21haW5RdWFudGlsZXMge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChkb21haW4pICYmIEFycmF5LmlzQXJyYXkoZG9tYWluLnF1YW50aWxlcykgJiYgQXJyYXkuaXNBcnJheShkb21haW4ueik7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkb21haW4gYXQgem9vbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhyZXNob2xkc0Zyb21RdWFudGlsZXMoXG4gIHF1YW50aWxlczogbnVtYmVyW10sXG4gIGJ1Y2tldHM6IG51bWJlclxuKTogKG51bWJlciB8IHVuZGVmaW5lZClbXSB7XG4gIGNvbnN0IHRocmVzaG9sZHMgPSBbXTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYnVja2V0cykgfHwgYnVja2V0cyA8IDEpIHtcbiAgICByZXR1cm4gW3F1YW50aWxlc1swXSwgcXVhbnRpbGVzW3F1YW50aWxlcy5sZW5ndGggLSAxXV07XG4gIH1cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBidWNrZXRzOyBpKyspIHtcbiAgICAvLyBwb3NpdGlvbiBpbiBzb3J0ZWQgYXJyYXlcbiAgICBjb25zdCBwb3NpdGlvbiA9IGkgLyBidWNrZXRzO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aHJlc2hvbGRzLnB1c2goZDNRdWFudGlsZShxdWFudGlsZXMsIHBvc2l0aW9uKSk7XG4gIH1cblxuICByZXR1cm4gdGhyZXNob2xkcztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRvbWFpbiBhdCB6b29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5TdGVwc2J5Wm9vbShkb21haW46IGFueVtdLCBzdGVwczogbnVtYmVyW10sIHo6IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IGkgPSBiaXNlY3RMZWZ0KHN0ZXBzLCB6KTtcblxuICBpZiAoc3RlcHNbaV0gPT09IHopIHtcbiAgICAvLyBJZiB6IGlzIGFuIGludGVnZXIgdmFsdWUgZXhhY3RseSBtYXRjaGluZyBhIHN0ZXAsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBkb21haW5cbiAgICByZXR1cm4gZG9tYWluW2ldO1xuICB9XG4gIC8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBuZXh0IGNvYXJzZXN0IGRvbWFpblxuICByZXR1cm4gZG9tYWluW01hdGgubWF4KGkgLSAxLCAwKV07XG59XG5cbi8qKlxuICogR2V0IGQzIHNjYWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZUZ1bmN0aW9uKFxuICBzY2FsZTogc3RyaW5nLFxuICByYW5nZTogYW55W10gfCBJdGVyYWJsZUl0ZXJhdG9yPGFueT4sXG4gIGRvbWFpbjogKG51bWJlciB8IHVuZGVmaW5lZClbXSB8IHN0cmluZ1tdIHwgSXRlcmFibGVJdGVyYXRvcjxhbnk+LFxuICBmaXhlZD86IGJvb2xlYW5cbik6IEQzU2NhbGVGdW5jdGlvbiB7XG4gIGNvbnN0IHNjYWxlRnVuY3Rpb24gPSBTQ0FMRV9GVU5DW2ZpeGVkID8gJ2xpbmVhcicgOiBzY2FsZV0oKVxuICAgIC5kb21haW4oZG9tYWluKVxuICAgIC5yYW5nZShmaXhlZCA/IGRvbWFpbiA6IHJhbmdlKTtcbiAgc2NhbGVGdW5jdGlvbi5zY2FsZVR5cGUgPSBmaXhlZCA/ICdsaW5lYXInIDogc2NhbGU7XG4gIHJldHVybiBzY2FsZUZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEdldCB0aHJlc2hvbGQgc2NhbGUgY29sb3IgbGFiZWxzXG4gKi9cbmZ1bmN0aW9uIGdldFRocmVzaG9sZExhYmVscyhcbiAgc2NhbGU6IEQzU2NhbGVGdW5jdGlvbixcbiAgbGFiZWxGb3JtYXQ6IExhYmVsRm9ybWF0XG4pOiBPbWl0PENvbG9yQnJlYWssICdkYXRhJz5bXSB7XG4gIGNvbnN0IGdlbkxlbmd0aCA9IHNjYWxlLnJhbmdlKCkubGVuZ3RoO1xuICByZXR1cm4gc2NhbGUucmFuZ2UoKS5tYXAoKGQsIGkpID0+IHtcbiAgICBjb25zdCBpbnZlcnQgPSBzY2FsZS5pbnZlcnRFeHRlbnQoZCk7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgaSA9PT0gMCA/IG51bGwgOiByZXZlcnNlRm9ybWF0TnVtYmVyKGxhYmVsRm9ybWF0KGludmVydFswXSkpLFxuICAgICAgaSA9PT0gZ2VuTGVuZ3RoIC0gMSA/IG51bGwgOiByZXZlcnNlRm9ybWF0TnVtYmVyKGxhYmVsRm9ybWF0KGludmVydFsxXSkpXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gcmF3IHZhbHVlXG4gICAgICByYW5nZTogaW52ZXJ0LFxuICAgICAgLy8gZm9ybWF0dGVkIHZhbHVlXG4gICAgICBpbnB1dHMsXG4gICAgICBsYWJlbDpcbiAgICAgICAgaSA9PT0gMFxuICAgICAgICAgID8gYExlc3MgdGhhbiAke2xhYmVsRm9ybWF0KGludmVydFsxXSl9YFxuICAgICAgICAgIDogaSA9PT0gZ2VuTGVuZ3RoIC0gMVxuICAgICAgICAgID8gYCR7bGFiZWxGb3JtYXQoaW52ZXJ0WzBdKX0gb3IgbW9yZWBcbiAgICAgICAgICA6IGAke2xhYmVsRm9ybWF0KGludmVydFswXSl9IHRvICR7bGFiZWxGb3JtYXQoaW52ZXJ0WzFdKX1gXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGxpbmVhciAvIHF1YW50IHNjYWxlIGNvbG9yIGxhYmVsc1xuICovXG5mdW5jdGlvbiBnZXRTY2FsZUxhYmVscyhcbiAgc2NhbGU6IEQzU2NhbGVGdW5jdGlvbixcbiAgbGFiZWxGb3JtYXQ6IExhYmVsRm9ybWF0XG4pOiBPbWl0PENvbG9yQnJlYWssICdkYXRhJz5bXSB7XG4gIHJldHVybiBzY2FsZS5yYW5nZSgpLm1hcCgoZCwgaSkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbnZlcnQgPSBzY2FsZS5pbnZlcnRFeHRlbnQoZCk7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgcmV2ZXJzZUZvcm1hdE51bWJlcihsYWJlbEZvcm1hdChpbnZlcnRbMF0pKSxcbiAgICAgIHJldmVyc2VGb3JtYXROdW1iZXIobGFiZWxGb3JtYXQoaW52ZXJ0WzFdKSlcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgJHtsYWJlbEZvcm1hdChpbnZlcnRbMF0pfSB0byAke2xhYmVsRm9ybWF0KGludmVydFsxXSl9YCxcbiAgICAgIC8vIHJhdyB2YWx1ZVxuICAgICAgcmFuZ2U6IGludmVydCxcbiAgICAgIC8vIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgaW5wdXRzXG4gICAgfTtcbiAgfSk7XG59XG5cbmNvbnN0IGN1c3RvbVNjYWxlTGFiZWxGb3JtYXQgPSBuID0+IChuID8gZm9ybWF0TnVtYmVyKG4sICdyZWFsJykgOiAnbm8gdmFsdWUnKTtcbi8qKlxuICogR2V0IGxpbmVhciAvIHF1YW50IHNjYWxlIGNvbG9yIGJyZWFrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVhbnRMZWdlbmRzKHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24sIGxhYmVsRm9ybWF0OiBMYWJlbEZvcm1hdCk6IENvbG9yQnJlYWtbXSB7XG4gIGlmICh0eXBlb2Ygc2NhbGUuaW52ZXJ0RXh0ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHRocmVzaG9sZExhYmVsRm9ybWF0ID0gKG4sIHR5cGUpID0+XG4gICAgbiAmJiBsYWJlbEZvcm1hdCA/IGxhYmVsRm9ybWF0KG4pIDogbiA/IGZvcm1hdE51bWJlcihuLCB0eXBlKSA6ICdubyB2YWx1ZSc7XG4gIGNvbnN0IGxhYmVscyA9XG4gICAgc2NhbGUuc2NhbGVUeXBlID09PSAndGhyZXNob2xkJ1xuICAgICAgPyBnZXRUaHJlc2hvbGRMYWJlbHMoc2NhbGUsIHRocmVzaG9sZExhYmVsRm9ybWF0KVxuICAgICAgOiBzY2FsZS5zY2FsZVR5cGUgPT09ICdjdXN0b20nXG4gICAgICA/IGdldFRocmVzaG9sZExhYmVscyhzY2FsZSwgY3VzdG9tU2NhbGVMYWJlbEZvcm1hdClcbiAgICAgIDogZ2V0U2NhbGVMYWJlbHMoc2NhbGUsIGxhYmVsRm9ybWF0KTtcblxuICBjb25zdCBkYXRhID0gc2NhbGUucmFuZ2UoKTtcblxuICByZXR1cm4gbGFiZWxzLm1hcCgobGFiZWwsIGluZGV4KSA9PiAoe1xuICAgIGRhdGE6IEFycmF5LmlzQXJyYXkoZGF0YVtpbmRleF0pID8gcmdiVG9IZXgoZGF0YVtpbmRleF0pIDogZGF0YVtpbmRleF0sXG4gICAgLi4ubGFiZWxcbiAgfSkpO1xufVxuXG4vKipcbiAqIEdldCBvcmRpbmFsIGNvbG9yIHNjYWxlIGxlZ2VuZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9yZGluYWxMZWdlbmRzKHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24pOiBDb2xvckJyZWFrT3JkaW5hbFtdIHtcbiAgY29uc3QgZG9tYWluID0gc2NhbGUuZG9tYWluKCk7XG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmRvbWFpbigpO1xuICBjb25zdCBkYXRhID0gZG9tYWluLm1hcChzY2FsZSk7XG5cbiAgcmV0dXJuIGRhdGEubWFwKChkYXR1bSwgaW5kZXgpID0+ICh7XG4gICAgZGF0YTogaXNSZ2JDb2xvcihkYXR1bSkgPyByZ2JUb0hleChkYXR1bSkgOiBkYXR1bSxcbiAgICBsYWJlbDogbGFiZWxzW2luZGV4XVxuICB9KSk7XG59XG5cbmNvbnN0IGRlZmF1bHRGb3JtYXQgPSBkID0+IGQ7XG5cbmNvbnN0IGdldFRpbWVMYWJlbEZvcm1hdCA9IGRvbWFpbiA9PiB7XG4gIGNvbnN0IGZvcm1hdHRlciA9IGdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyKGRvbWFpbik7XG4gIHJldHVybiB2YWwgPT4gbW9tZW50LnV0Yyh2YWwpLmZvcm1hdChmb3JtYXR0ZXIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YW50TGFiZWxGb3JtYXQoZG9tYWluLCBmaWVsZFR5cGUpIHtcbiAgLy8gcXVhbnQgc2NhbGUgY2FuIG9ubHkgYmUgYXNzaWduZWQgdG8gbGluZWFyIEZpZWxkczogcmVhbCwgdGltZXN0YW1wLCBpbnRlZ2VyXG4gIHJldHVybiBmaWVsZFR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXBcbiAgICA/IGdldFRpbWVMYWJlbEZvcm1hdChkb21haW4pXG4gICAgOiAhZmllbGRUeXBlXG4gICAgPyBkZWZhdWx0Rm9ybWF0XG4gICAgOiBuID0+IChpc051bWJlcihuKSA/IGZvcm1hdE51bWJlcihuLCBmaWVsZFR5cGUpIDogJ25vIHZhbHVlJyk7XG59XG5cbi8qKlxuICogR2V0IGxlZ2VuZHMgZm9yIHNjYWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZWdlbmRPZlNjYWxlKHtcbiAgc2NhbGUsXG4gIHNjYWxlVHlwZSxcbiAgbGFiZWxGb3JtYXQsXG4gIGZpZWxkVHlwZVxufToge1xuICBzY2FsZT86IEQzU2NhbGVGdW5jdGlvbiB8IG51bGw7XG4gIHNjYWxlVHlwZTogc3RyaW5nO1xuICBsYWJlbEZvcm1hdD86IExhYmVsRm9ybWF0O1xuICBmaWVsZFR5cGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59KTogQ29sb3JCcmVha1tdIHwgQ29sb3JCcmVha09yZGluYWxbXSB7XG4gIGlmICghc2NhbGUgfHwgc2NhbGUuYnlab29tKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChcbiAgICBzY2FsZVR5cGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgfHxcbiAgICBzY2FsZVR5cGUgPT09IFNDQUxFX1RZUEVTLmN1c3RvbU9yZGluYWwgfHxcbiAgICBmaWVsZFR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGdldE9yZGluYWxMZWdlbmRzKHNjYWxlKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdExhYmVsID0gbGFiZWxGb3JtYXQgfHwgZ2V0UXVhbnRMYWJlbEZvcm1hdChzY2FsZS5kb21haW4oKSwgZmllbGRUeXBlKTtcblxuICByZXR1cm4gZ2V0UXVhbnRMZWdlbmRzKHNjYWxlLCBmb3JtYXRMYWJlbCk7XG59XG5cbi8qKlxuICogR2V0IGNvbG9yIHNjYWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckNvbG9yU2NhbGUoe1xuICByYW5nZSxcbiAgZG9tYWluLFxuICBzY2FsZVR5cGUsXG4gIGxheWVyXG59OiB7XG4gIHJhbmdlOiBDb2xvclJhbmdlIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgZG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgbGF5ZXI6IExheWVyO1xuICBpc0ZpeGVkPzogYm9vbGVhbjtcbn0pOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsIHtcbiAgaWYgKHJhbmdlICYmIGRvbWFpbiAmJiBzY2FsZVR5cGUpIHtcbiAgICByZXR1cm4gbGF5ZXIuZ2V0Q29sb3JTY2FsZShzY2FsZVR5cGUsIGRvbWFpbiwgcmFuZ2UpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3JSYW5nZS5jb2xvck1hcCBpbnRvIGNvbG9yIGJyZWFrcyBVSSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUxheWVyQ29sb3JNYXAobGF5ZXI6IExheWVyLCB2aXN1YWxDaGFubmVsOiBWaXN1YWxDaGFubmVsKTogQ29sb3JNYXAge1xuICBjb25zdCBkb21haW4gPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5kb21haW5dO1xuICBjb25zdCByYW5nZSA9IGxheWVyLmNvbmZpZy52aXNDb25maWdbdmlzdWFsQ2hhbm5lbC5yYW5nZV07XG4gIGNvbnN0IHNjYWxlVHlwZSA9IGxheWVyLmNvbmZpZ1t2aXN1YWxDaGFubmVsLnNjYWxlXTtcbiAgY29uc3QgZmllbGQgPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG5cbiAgY29uc3Qgc2NhbGUgPSBnZXRMYXllckNvbG9yU2NhbGUoe1xuICAgIHJhbmdlLFxuICAgIGRvbWFpbixcbiAgICBzY2FsZVR5cGUsXG4gICAgbGF5ZXJcbiAgfSk7XG5cbiAgY29uc3QgY29sb3JCcmVha3MgPSBnZXRMZWdlbmRPZlNjYWxlKHtcbiAgICBzY2FsZTogc2NhbGU/LmJ5Wm9vbSA/IHNjYWxlKDApIDogc2NhbGUsXG4gICAgc2NhbGVUeXBlLFxuICAgIGZpZWxkVHlwZTogZmllbGQudHlwZVxuICB9KTtcbiAgcmV0dXJuIGNvbG9yQnJlYWtzVG9Db2xvck1hcChjb2xvckJyZWFrcyk7XG59XG5cbi8qKlxuICogR2V0IHZpc3VhbCBjaGFuZWwgc2NhbGUgZnVuY3Rpb24gaWYgaXQncyBiYXNlZCBvbiB6b29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaXN1YWxDaGFubmVsU2NhbGVCeVpvb20oe1xuICBzY2FsZSxcbiAgbGF5ZXIsXG4gIG1hcFN0YXRlXG59OiB7XG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsO1xuICBsYXllcjogTGF5ZXI7XG4gIG1hcFN0YXRlPzogTWFwU3RhdGU7XG59KTogRDNTY2FsZUZ1bmN0aW9uIHwgbnVsbCB7XG4gIGlmIChzY2FsZT8uYnlab29tKSB7XG4gICAgY29uc3QgeiA9IGxheWVyLm1ldGE/LmdldFpvb20gPyBsYXllci5tZXRhLmdldFpvb20obWFwU3RhdGUpIDogbWFwU3RhdGU/Lnpvb207XG4gICAgc2NhbGUgPSBOdW1iZXIuaXNGaW5pdGUoeikgPyBzY2FsZSh6KSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG4vKipcbiAqIEdldCBjYXRlZ29yaWNhbCBjb2xvck1hcCBmcm9tIGNvbG9ycyBhbmQgZG9tYWluICh1bmlxdWUgdmFsdWVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2F0ZWdvcmljYWxDb2xvck1hcChcbiAgY29sb3JzOiBzdHJpbmdbXSxcbiAgZG9tYWluOiAoc3RyaW5nIHwgbnVtYmVyIHwgc3RyaW5nW10gfCBudW1iZXJbXSB8IG51bGwpW11cbik6IGFueSB7XG4gIC8vIGNvbG9yTWFwOiBbc3RyaW5nIHwgc3RyaW5nW10sIGhleHN0cmluZ11cbiAgY29uc3QgY29sb3JUb1VuaXF1ZVZhbHVlcyA9IHt9O1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSB1bmlxdWUoZG9tYWluKS5maWx0ZXIobm90TnVsbG9yVW5kZWZpbmVkKS5zb3J0KCk7XG4gIC8vIGVhY2ggdW5pcXVlIHZhbHVlIGFzc2lnbiB0byBhIGNvbG9yLCB0aGUgcmVzdCB1bmlxdWUgdmFsdWVzIGFzc2lnbiB0byBsYXN0IGNvbG9yXG4gIGNvbnN0IGxhc3RDb2xvciA9IGNvbG9yc1tjb2xvcnMubGVuZ3RoIC0gMV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pcXVlVmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGkgPCBjb2xvcnMubGVuZ3RoKSB7XG4gICAgICBjb2xvclRvVW5pcXVlVmFsdWVzW2NvbG9yc1tpXV0gPSB1bmlxdWVWYWx1ZXNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbG9yVG9VbmlxdWVWYWx1ZXNbbGFzdENvbG9yXSA9IFtcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoY29sb3JUb1VuaXF1ZVZhbHVlc1tsYXN0Q29sb3JdKVxuICAgICAgICAgID8gY29sb3JUb1VuaXF1ZVZhbHVlc1tsYXN0Q29sb3JdXG4gICAgICAgICAgOiBbY29sb3JUb1VuaXF1ZVZhbHVlc1tsYXN0Q29sb3JdXSksXG4gICAgICAgIHVuaXF1ZVZhbHVlc1tpXVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb2xvck1hcCA9IGNvbG9ycy5tYXAoY29sb3IgPT4ge1xuICAgIGlmIChjb2xvciBpbiBjb2xvclRvVW5pcXVlVmFsdWVzKSB7XG4gICAgICByZXR1cm4gW2NvbG9yVG9VbmlxdWVWYWx1ZXNbY29sb3JdLCBjb2xvcl07XG4gICAgfVxuICAgIHJldHVybiBbbnVsbCwgY29sb3JdO1xuICB9KTtcblxuICByZXR1cm4gY29sb3JNYXA7XG59XG5cbi8qKlxuICogR2V0IGNhdGVnb3JpY2FsIGNvbG9yQnJlYWtzIGZyb20gY29sb3JNYXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yTWFwVG9DYXRlZ29yaWNhbENvbG9yQnJlYWtzKFxuICBjb2xvck1hcD86IENvbG9yTWFwIHwgbnVsbFxuKTogQ29sb3JCcmVha09yZGluYWxbXSB8IG51bGwge1xuICBpZiAoIWNvbG9yTWFwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29sb3JCcmVha3MgPSBjb2xvck1hcC5tYXAoKFt2YWx1ZSwgY29sb3JdLCBpKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IGNvbG9yLFxuICAgICAgbGFiZWw6IHZhbHVlXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbG9yQnJlYWtzO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBjYXRlZ29yaWNhbCBjb2xvck1hcCBmcm9tIGNvbG9yQnJlYWtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckJyZWFrc1RvQ2F0ZWdvcmljYWxDb2xvck1hcChjb2xvckJyZWFrczogQ29sb3JCcmVha09yZGluYWxbXSk6IENvbG9yTWFwIHtcbiAgLy8gY29sb3JNYXA6IFtzdHJpbmcgfCBzdHJpbmdbXSwgaGV4c3RyaW5nXVxuICBjb25zdCBjb2xvcnMgPSB1bmlxKGNvbG9yQnJlYWtzLm1hcChjYiA9PiBjYi5kYXRhKSk7XG4gIGNvbnN0IHZhbHVlcyA9IHVuaXEoY29sb3JCcmVha3MubWFwKGNiID0+IGNiLmxhYmVsKSk7XG5cbiAgcmV0dXJuIGdldENhdGVnb3JpY2FsQ29sb3JNYXAoY29sb3JzLCB2YWx1ZXMpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3IgYnJlYWtzIFVJIGlucHV0IGludG8gY29sb3JSYW5nZS5jb2xvck1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JCcmVha3NUb0NvbG9yTWFwKGNvbG9yQnJlYWtzOiBDb2xvckJyZWFrW10gfCBDb2xvckJyZWFrT3JkaW5hbFtdKTogQ29sb3JNYXAge1xuICBjb25zdCBjb2xvck1hcCA9IGNvbG9yQnJlYWtzLm1hcCgoY29sb3JCcmVhaywgaSkgPT4ge1xuICAgIC8vIFt2YWx1ZSwgaGV4XVxuICAgIHJldHVybiBbXG4gICAgICBjb2xvckJyZWFrLmlucHV0c1xuICAgICAgICA/IGkgPT09IGNvbG9yQnJlYWtzLmxlbmd0aCAtIDFcbiAgICAgICAgICA/IG51bGwgLy8gbGFzdFxuICAgICAgICAgIDogY29sb3JCcmVhay5pbnB1dHNbMV1cbiAgICAgICAgOiBjb2xvckJyZWFrLmxhYmVsLFxuICAgICAgY29sb3JCcmVhay5kYXRhXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gQHRzLWlnbm9yZSB0dXBsZVxuICByZXR1cm4gY29sb3JNYXA7XG59XG5cbi8qKlxuICogQ29udmVydCBjb2xvclJhbmdlLmNvbG9yTWFwIGludG8gY29sb3IgYnJlYWtzIFVJIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvck1hcFRvQ29sb3JCcmVha3MoY29sb3JNYXA/OiBDb2xvck1hcCB8IG51bGwpOiBDb2xvckJyZWFrW10gfCBudWxsIHtcbiAgaWYgKCFjb2xvck1hcCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGNvbG9yQnJlYWtzID0gY29sb3JNYXAubWFwKChbdmFsdWUsIGNvbG9yXSwgaSkgPT4ge1xuICAgIGNvbnN0IHJhbmdlID1cbiAgICAgIGkgPT09IDBcbiAgICAgICAgPyAvLyBmaXJzdFxuICAgICAgICAgIFstSW5maW5pdHksIHZhbHVlXVxuICAgICAgICA6IC8vIGxhc3RcbiAgICAgICAgaSA9PT0gY29sb3JNYXAubGVuZ3RoIC0gMVxuICAgICAgICA/IFtjb2xvck1hcFtpIC0gMV1bMF0sIEluZmluaXR5XVxuICAgICAgICA6IC8vIGVsc2VcbiAgICAgICAgICBbY29sb3JNYXBbaSAtIDFdWzBdLCB2YWx1ZV07XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IGNvbG9yLFxuICAgICAgcmFuZ2UsXG4gICAgICBpbnB1dHM6IHJhbmdlLFxuICAgICAgbGFiZWw6XG4gICAgICAgIC8vIGZpcnN0XG4gICAgICAgIGkgPT09IDBcbiAgICAgICAgICA/IGBMZXNzIHRoYW4gJHt2YWx1ZX1gXG4gICAgICAgICAgOiAvLyBsYXN0XG4gICAgICAgICAgaSA9PT0gY29sb3JNYXAubGVuZ3RoIC0gMVxuICAgICAgICAgID8gYCR7Y29sb3JNYXBbaSAtIDFdWzBdfSBvciBtb3JlYFxuICAgICAgICAgIDogYCR7Y29sb3JNYXBbaSAtIDFdWzBdfSB0byAke3ZhbHVlfWBcbiAgICB9O1xuICB9KTtcblxuICAvLyBAdHMtaWdub3JlIGltcGxlbWVudCBjb252ZXJzaW9uIGZvciBvcmRpbmFsXG4gIHJldHVybiBjb2xvckJyZWFrcztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGNvbG9yIGJyZWFrcyBpcyBmb3IgbnVtZXJpYyBmaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljQ29sb3JCcmVha3MoY29sb3JCcmVha3M6IHVua25vd24pOiBjb2xvckJyZWFrcyBpcyBDb2xvckJyZWFrW10ge1xuICByZXR1cm4gQm9vbGVhbihBcnJheS5pc0FycmF5KGNvbG9yQnJlYWtzKSAmJiBjb2xvckJyZWFrcy5sZW5ndGggJiYgY29sb3JCcmVha3NbMF0uaW5wdXRzKTtcbn1cblxuLy8gcmV0dXJuIGRvbWFpbk1pbiwgZG9tYWluTWF4LCBoaXN0b2dyYW1NZWFuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlzdG9ncmFtRG9tYWluKHtcbiAgYWdncmVnYXRlZEJpbnMsXG4gIGNvbHVtblN0YXRzLFxuICBkYXRhc2V0LFxuICBmaWVsZFZhbHVlQWNjZXNzb3Jcbn06IHtcbiAgYWdncmVnYXRlZEJpbnM/OiBBZ2dyZWdhdGVkQmluW107XG4gIGNvbHVtblN0YXRzPzogRmlsdGVyUHJvcHNbJ2NvbHVtblN0YXRzJ107XG4gIGRhdGFzZXQ/OiBLZXBsZXJUYWJsZTtcbiAgZmllbGRWYWx1ZUFjY2Vzc29yOiAoaWR4OiB1bmtub3duKSA9PiBudW1iZXI7XG59KSB7XG4gIGxldCBkb21haW5NaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGxldCBkb21haW5NYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGxldCBuVmFsaWQgPSAwO1xuICBsZXQgZG9tYWluU3VtID0gMDtcblxuICBpZiAoYWdncmVnYXRlZEJpbnMpIHtcbiAgICBPYmplY3QudmFsdWVzKGFnZ3JlZ2F0ZWRCaW5zKS5mb3JFYWNoKGJpbiA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBiaW4udmFsdWU7XG4gICAgICBpZiAoaXNOdW1iZXIodmFsKSkge1xuICAgICAgICBpZiAodmFsIDwgZG9tYWluTWluKSBkb21haW5NaW4gPSB2YWw7XG4gICAgICAgIGlmICh2YWwgPiBkb21haW5NYXgpIGRvbWFpbk1heCA9IHZhbDtcbiAgICAgICAgZG9tYWluU3VtICs9IHZhbDtcbiAgICAgICAgblZhbGlkICs9IDE7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbHVtblN0YXRzICYmIGNvbHVtblN0YXRzLnF1YW50aWxlcyAmJiBjb2x1bW5TdGF0cy5tZWFuKSB7XG4gICAgICAvLyBubyBuZWVkIHRvIHJlY2FsY3VhdGUgbWluL21heC9tZWFuIGlmIGl0cyBhbHJlYWR5IGluIGNvbHVtblN0YXRzXG4gICAgICByZXR1cm4gW1xuICAgICAgICBjb2x1bW5TdGF0cy5xdWFudGlsZXNbMF0udmFsdWUsXG4gICAgICAgIGNvbHVtblN0YXRzLnF1YW50aWxlc1tjb2x1bW5TdGF0cy5xdWFudGlsZXMubGVuZ3RoIC0gMV0udmFsdWUsXG4gICAgICAgIGNvbHVtblN0YXRzLm1lYW5cbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChkYXRhc2V0ICYmIGZpZWxkVmFsdWVBY2Nlc3Nvcikge1xuICAgICAgZGF0YXNldC5hbGxJbmRleGVzLmZvckVhY2goKHgsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gZmllbGRWYWx1ZUFjY2Vzc29yKHgpO1xuICAgICAgICBpZiAoaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIGlmICh2YWwgPCBkb21haW5NaW4pIGRvbWFpbk1pbiA9IHZhbDtcbiAgICAgICAgICBpZiAodmFsID4gZG9tYWluTWF4KSBkb21haW5NYXggPSB2YWw7XG4gICAgICAgICAgZG9tYWluU3VtICs9IHZhbDtcbiAgICAgICAgICBuVmFsaWQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGhpc3RvZ3JhbU1lYW4gPSBuVmFsaWQgPiAwID8gZG9tYWluU3VtIC8gblZhbGlkIDogMDtcbiAgcmV0dXJuIFtuVmFsaWQgPiAwID8gZG9tYWluTWluIDogMCwgblZhbGlkID4gMCA/IGRvbWFpbk1heCA6IDAsIGhpc3RvZ3JhbU1lYW5dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDYXRlZ29yaWNhbENvbG9yTWFwQnlJbmRleChjb2xvck1hcDogQ29sb3JNYXAsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICBpZiAoIWNvbG9yTWFwKSB7XG4gICAgcmV0dXJuIGNvbG9yTWFwO1xuICB9XG4gIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAubWFwKChjbSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIFtudWxsLCBjbVsxXV07XG4gICAgfVxuICAgIHJldHVybiBjbTtcbiAgfSk7XG4gIHJldHVybiBuZXdDb2xvck1hcDtcbn1cblxuLyoqXG4gKiBzZWxlY3QgcmVzdCBjYXRlZ29yaWNhbCB2YWx1ZXMgZm9yIGEgY29sb3JNYXAgYnkgaXRzIGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSZXN0Q2F0ZWdvcmljYWxDb2xvck1hcEJ5SW5kZXgoXG4gIGNvbG9yTWFwOiBDb2xvck1hcCB8IG51bGwsXG4gIGluZGV4OiBudW1iZXIsXG4gIHVuaXF1ZVZhbHVlcz86IG51bWJlcltdIHwgc3RyaW5nW11cbik6IENvbG9yTWFwIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gIGlmICghY29sb3JNYXAgfHwgIXVuaXF1ZVZhbHVlcykge1xuICAgIHJldHVybiBjb2xvck1hcDtcbiAgfVxuXG4gIC8vIGZpbmQgdW5pcXVlIHZhbHVlcyB0aGF0IGhhcyBub3QgYmVlbiB1c2VkIGluIGN1cnJlbnQgY29sb3JNYXBcbiAgY29uc3QgdW5pcVZhbHVlRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyh1bmlxdWVWYWx1ZXMubWFwKHZhbCA9PiBbdmFsLCBmYWxzZV0pKTtcbiAgY29sb3JNYXAuZm9yRWFjaChjbSA9PiB7XG4gICAgdG9BcnJheShjbVswXSkuZm9yRWFjaCh2ID0+IHtcbiAgICAgIGlmICh2KSB1bmlxVmFsdWVEaWN0W3ZdID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IHJlc3QgPSBPYmplY3Qua2V5cyh1bmlxVmFsdWVEaWN0KS5maWx0ZXIodiA9PiAhdW5pcVZhbHVlRGljdFt2XSk7XG5cbiAgLy8gdXNlIHRoZSBub3QgdXNlZCB1bmlxdWUgdmFsdWVzIGluIHRoZSBzZWxlY3RlZCBjb2xvciBtYXBcbiAgY29uc3QgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5tYXAoKGNtLCBpKSA9PiB7XG4gICAgaWYgKGkgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gW1suLi5yZXN0LCAuLi50b0FycmF5KGNtWzBdKV0sIGNtWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIGNtO1xuICB9KSBhcyBDb2xvck1hcDtcblxuICByZXR1cm4gbmV3Q29sb3JNYXA7XG59XG5cbi8qKlxuICogcmVtb3ZlIGEgY2F0ZWdvcmljYWwgdmFsdWUgZnJvbSBhIGNvbG9yTWFwIGJ5IGl0cyBpbmRleFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ2F0ZWdvcmljYWxWYWx1ZUZyb21Db2xvck1hcChcbiAgY29sb3JNYXA6IENvbG9yTWFwIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaXRlbTogbnVtYmVyIHwgc3RyaW5nLFxuICBpbmRleDogbnVtYmVyXG4pOiBDb2xvck1hcCB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbG9yTWFwKSB7XG4gICAgcmV0dXJuIGNvbG9yTWFwO1xuICB9XG4gIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAubWFwKChjbSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgaWYgKCFjbVswXSkge1xuICAgICAgICByZXR1cm4gW251bGwsIGNtWzFdXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRVbmlxdWVWYWx1ZXMgPSB0b0FycmF5KGNtWzBdKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRVbmlxdWVWYWx1ZXMgPSBjdXJyZW50VW5pcXVlVmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IGl0ZW0pO1xuICAgICAgcmV0dXJuIFt1cGRhdGVkVW5pcXVlVmFsdWVzLCBjbVsxXV07XG4gICAgfVxuICAgIHJldHVybiBjbTtcbiAgfSkgYXMgQ29sb3JNYXA7XG5cbiAgcmV0dXJuIG5ld0NvbG9yTWFwO1xufVxuXG4vKipcbiAqIGFkZCBjYXRlZ29yaWNhbCB2YWx1ZXMgKGZyb20gbXVsdGlzZWwgZHJvcGRvd24pIHRvIGEgY29sb3JNYXAgYnkgaXRzIGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDYXRlZ29yaWNhbFZhbHVlc1RvQ29sb3JNYXAoXG4gIGNvbG9yTWFwOiBDb2xvck1hcCxcbiAgaXRlbXM6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGluZGV4OiBudW1iZXJcbik6IENvbG9yTWFwIHtcbiAgaWYgKCFjb2xvck1hcCkge1xuICAgIHJldHVybiBjb2xvck1hcDtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAubWFwKChjbSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgaWYgKCFjbVswXSkge1xuICAgICAgICByZXR1cm4gW2l0ZW1zLCBjbVsxXV07XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50VW5pcXVlVmFsdWVzID0gdG9BcnJheShjbVswXSk7XG4gICAgICBjb25zdCB1cGRhdGVkVW5pcXVlVmFsdWVzID0gdW5pcShjdXJyZW50VW5pcXVlVmFsdWVzLmNvbmNhdChpdGVtcykpO1xuICAgICAgcmV0dXJuIFt1cGRhdGVkVW5pcXVlVmFsdWVzLCBjbVsxXV07XG4gICAgfVxuICAgIC8vIHJlbW92ZSB2YWx1ZSBmcm9tIG90aGVyIGNvbG9yTWFwXG4gICAgY29uc3QgY3VycmVudFVuaXF1ZVZhbHVlcyA9IGNtWzBdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRVbmlxdWVWYWx1ZXMpKSB7XG4gICAgICBjb25zdCB1cGRhdGVkVW5pcXVlVmFsdWVzOiBzdHJpbmdbXSB8IG51bWJlcltdID0gKGN1cnJlbnRVbmlxdWVWYWx1ZXMgYXMgYW55W10pLmZpbHRlcihcbiAgICAgICAgdiA9PiAhaXRlbXMuaW5jbHVkZXModilcbiAgICAgICk7XG4gICAgICByZXR1cm4gW3VwZGF0ZWRVbmlxdWVWYWx1ZXMsIGNtWzFdXTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRVbmlxdWVWYWx1ZXMgJiYgaXRlbXMuaW5jbHVkZXMoY3VycmVudFVuaXF1ZVZhbHVlcykpIHtcbiAgICAgIHJldHVybiBbbnVsbCwgY21bMV1dO1xuICAgIH1cblxuICAgIHJldHVybiBjbTtcbiAgfSkgYXMgQ29sb3JNYXA7XG5cbiAgcmV0dXJuIG5ld0NvbG9yTWFwO1xufVxuXG4vKipcbiAqIGdldCBhIGNvbG9yIHNjYWxlIGZ1bmMgZm9yIGNhdGVnb3JpY2FsIChjdXN0b20gb3JkaW5hbCkgc2NhbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhdGVnb3JpY2FsQ29sb3JTY2FsZShcbiAgY29sb3JEb21haW46IG51bWJlcltdIHwgc3RyaW5nW10sXG4gIGNvbG9yUmFuZ2U6IENvbG9yUmFuZ2UsXG4gIHVzZVJnYiA9IHRydWVcbik6IChjYXRlZ29yeVZhbHVlOiBzdHJpbmcgfCBudW1iZXIpID0+IFJHQkNvbG9yIHwgUkdCQUNvbG9yIHtcbiAgY29uc3QgY01hcCA9IGNvbG9yUmFuZ2UuY29sb3JNYXBcbiAgICA/IGNvbG9yUmFuZ2UuY29sb3JNYXBcbiAgICA6IGdldENhdGVnb3JpY2FsQ29sb3JNYXAoY29sb3JSYW5nZS5jb2xvcnMsIGNvbG9yRG9tYWluKTtcblxuICBjb25zdCByYW5nZTogbnVtYmVyW11bXSA9IFtdO1xuICBjb25zdCBkb21haW46IHN0cmluZ1tdID0gW107XG4gIGNNYXAuZm9yRWFjaChjbSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY21bMF0pKSB7XG4gICAgICBjbVswXS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgIGRvbWFpbi5wdXNoKHZhbCk7XG4gICAgICAgIHJhbmdlLnB1c2godXNlUmdiID8gaGV4VG9SZ2IoY21bMV0pIDogY21bMV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbWFpbi5wdXNoKGNtWzBdKTtcbiAgICAgIHJhbmdlLnB1c2godXNlUmdiID8gaGV4VG9SZ2IoY21bMV0pIDogY21bMV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qgc2NhbGUgPSBnZXRTY2FsZUZ1bmN0aW9uKFNDQUxFX1RZUEVTLmN1c3RvbU9yZGluYWwsIHJhbmdlLCBkb21haW4sIGZhbHNlKTtcbiAgc2NhbGUudW5rbm93bihOT19WQUxVRV9DT0xPUik7XG4gIHJldHVybiBzY2FsZSBhcyBhbnk7XG59XG5cbi8qKlxuICogaW5pdGlhbGl6ZSBjdXN0b21QYWxldHRlIGJ5IGN1c3RvbSBzY2FsZSBvciBjdXN0b21PcmRpbmFsIHNjYWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q3VzdG9tUGFsZXR0ZUJ5Q3VzdG9tU2NhbGUoe1xuICBzY2FsZSxcbiAgZmllbGQsXG4gIG9yZGluYWxEb21haW4sXG4gIHJhbmdlLFxuICBjb2xvckJyZWFrc1xufToge1xuICBzY2FsZTogc3RyaW5nO1xuICBmaWVsZDogRmllbGQ7XG4gIG9yZGluYWxEb21haW4/OiBudW1iZXJbXSB8IHN0cmluZ1tdO1xuICByYW5nZTogQ29sb3JSYW5nZTtcbiAgY29sb3JCcmVha3M6IENvbG9yQnJlYWtPcmRpbmFsW10gfCBudWxsO1xufSk6IENvbG9yVUlbJ2N1c3RvbVBhbGV0dGUnXSB7XG4gIGNvbnN0IGN1c3RvbVBhbGV0dGVOYW1lID0gYGNvbG9yLmN1c3RvbVBhbGV0dGUuJHtzY2FsZX0uJHtmaWVsZC5uYW1lfWA7XG4gIC8vIHJldXNlIHJhbmdlLmNvbG9yTWFwIGlmIHRoZSBmaWVsZCBhbmQgc2NhbGUgbm90IGNoYW5nZWRcbiAgY29uc3QgcmV1c2VDb2xvck1hcCA9IHJhbmdlLmNvbG9yTWFwICYmIHJhbmdlLm5hbWUgPT09IGN1c3RvbVBhbGV0dGVOYW1lICYmIHJhbmdlLnR5cGUgPT09IHNjYWxlO1xuICBjb25zdCBjb2xvck1hcCA9IHJldXNlQ29sb3JNYXBcbiAgICA/IHJhbmdlLmNvbG9yTWFwXG4gICAgOiBzY2FsZSA9PT0gU0NBTEVfVFlQRVMuY3VzdG9tT3JkaW5hbCAmJiBvcmRpbmFsRG9tYWluXG4gICAgPyBnZXRDYXRlZ29yaWNhbENvbG9yTWFwKHJhbmdlLmNvbG9ycywgb3JkaW5hbERvbWFpbilcbiAgICA6IGNvbG9yQnJlYWtzICYmIGlzTnVtZXJpY0NvbG9yQnJlYWtzKGNvbG9yQnJlYWtzKVxuICAgID8gY29sb3JCcmVha3NUb0NvbG9yTWFwKGNvbG9yQnJlYWtzKVxuICAgIDogbnVsbDtcbiAgY29uc3QgY29sb3JzID0gcmV1c2VDb2xvck1hcCA/IHJhbmdlLmNvbG9ycyA6IGNvbG9yTWFwID8gY29sb3JNYXAubWFwKGNtID0+IGNtWzFdKSA6IHJhbmdlLmNvbG9ycztcblxuICAvLyB1cGRhdGUgY3VzdG9tIGJyZWFrc1xuICBjb25zdCBjdXN0b21QYWxldHRlOiBDb2xvclVJWydjdXN0b21QYWxldHRlJ10gPSB7XG4gICAgY2F0ZWdvcnk6ICdDdXN0b20nLFxuICAgIG5hbWU6IGN1c3RvbVBhbGV0dGVOYW1lLFxuICAgIHR5cGU6IHNjYWxlLFxuICAgIGNvbG9yTWFwLFxuICAgIGNvbG9yczogY29sb3JzIHx8IFtdXG4gIH07XG5cbiAgcmV0dXJuIGN1c3RvbVBhbGV0dGU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUksWUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBaUJBLElBQUFNLFdBQUEsR0FBQU4sT0FBQTtBQUVBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFlBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVQsT0FBQTtBQUFzQyxTQUFBVSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFB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
@@ -1,6 +1,36 @@
1
1
  import { TooltipFormat } from '@kepler.gl/constants';
2
2
  import { Field, Millisecond } from '@kepler.gl/types';
3
3
  export declare type FieldFormatter = (value: any) => string;
4
+ export declare const MAX_LATITUDE = 89.9;
5
+ export declare const MIN_LATITUDE = -89.9;
6
+ export declare const MAX_LONGITUDE = 180;
7
+ export declare const MIN_LONGITUDE = -180;
8
+ /**
9
+ * Validates a latitude value.
10
+ * Ensures that the latitude is within the defined minimum and maximum latitude bounds.
11
+ * If the value is out of bounds, it returns the nearest bound value.
12
+ * @param latitude - The latitude value to validate.
13
+ * @returns The validated latitude value.
14
+ */
15
+ export declare function validateLatitude(latitude: number | undefined): number;
16
+ /**
17
+ * Validates a longitude value.
18
+ * Ensures that the longitude is within the defined minimum and maximum longitude bounds.
19
+ * If the value is out of bounds, it returns the nearest bound value.
20
+ * @param longitude - The longitude value to validate.
21
+ * @returns The validated longitude value.
22
+ */
23
+ export declare function validateLongitude(longitude: number | undefined): number;
24
+ /**
25
+ * Validates a coordinate value.
26
+ * Ensures that the value is within the specified minimum and maximum bounds.
27
+ * If the value is out of bounds, it returns the nearest bound value.
28
+ * @param value - The coordinate value to validate.
29
+ * @param minValue - The minimum bound for the value.
30
+ * @param maxValue - The maximum bound for the value.
31
+ * @returns The validated coordinate value.
32
+ */
33
+ export declare function validateCoordinate(value: number, minValue: number, maxValue: number): number;
4
34
  /**
5
35
  * simple getting unique values of an array
6
36
  *
@@ -50,7 +80,7 @@ export declare function getRoundingDecimalFromStep(step: number): number;
50
80
  * @param step
51
81
  * @param marks
52
82
  */
53
- export declare function normalizeSliderValue(val: number, minValue: number, step: number, marks?: number[] | null): number;
83
+ export declare function normalizeSliderValue(val: number, minValue: number | undefined, step: number, marks?: number[] | null): number;
54
84
  /**
55
85
  * round the value to step for the slider
56
86
  * @param minValue
@@ -58,7 +88,7 @@ export declare function normalizeSliderValue(val: number, minValue: number, step
58
88
  * @param val
59
89
  * @returns - rounded number
60
90
  */
61
- export declare function roundValToStep(minValue: number, step: number, val: number): number;
91
+ export declare function roundValToStep(minValue: number | undefined, step: number, val: number): number;
62
92
  /**
63
93
  * Get the value format based on field and format options
64
94
  * Used in render tooltip value
@@ -78,7 +108,7 @@ export declare const parseFieldValue: (value: any, type: string) => string;
78
108
  * @param format
79
109
  * @param field
80
110
  */
81
- export declare function getFormatter(format: string | Record<string, string> | null, field?: Field): FieldFormatter;
111
+ export declare function getFormatter(format?: string | Record<string, string> | null, field?: Field): FieldFormatter;
82
112
  export declare function getColumnFormatter(field: Pick<Field, 'type'> & Partial<Pick<Field, 'format' | 'displayFormat'>>): FieldFormatter;
83
113
  export declare function applyValueMap(format: any): (v: any) => any;
84
114
  export declare function applyDefaultFormat(tooltipFormat: TooltipFormat): (v: any) => string;