@kepler.gl/utils 3.1.0-alpha.1 → 3.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/aggregation.d.ts +13 -0
  2. package/dist/aggregation.js +84 -0
  3. package/dist/application-config.d.ts +25 -0
  4. package/dist/application-config.js +52 -0
  5. package/dist/arrow-data-container.d.ts +62 -0
  6. package/dist/arrow-data-container.js +331 -0
  7. package/dist/color-utils.d.ts +108 -0
  8. package/dist/color-utils.js +443 -0
  9. package/dist/data-container-interface.d.ts +138 -0
  10. package/dist/data-container-interface.js +6 -0
  11. package/dist/data-container-utils.d.ts +30 -0
  12. package/dist/data-container-utils.js +74 -0
  13. package/dist/data-row.d.ts +59 -0
  14. package/dist/data-row.js +110 -0
  15. package/dist/data-scale-utils.d.ts +120 -0
  16. package/dist/data-scale-utils.js +340 -0
  17. package/dist/data-utils.d.ts +98 -0
  18. package/dist/data-utils.js +436 -0
  19. package/dist/dataset-utils.d.ts +45 -0
  20. package/dist/dataset-utils.js +313 -0
  21. package/dist/dom-to-image.d.ts +73 -0
  22. package/dist/dom-to-image.js +421 -0
  23. package/dist/dom-utils.d.ts +23 -0
  24. package/dist/dom-utils.js +349 -0
  25. package/dist/effect-utils.d.ts +24 -0
  26. package/dist/effect-utils.js +166 -0
  27. package/dist/export-map-html.d.ts +9 -0
  28. package/dist/export-map-html.js +25 -0
  29. package/dist/export-utils.d.ts +40 -0
  30. package/dist/export-utils.js +201 -0
  31. package/dist/filter-utils.d.ts +331 -0
  32. package/dist/filter-utils.js +1214 -0
  33. package/dist/format.d.ts +3 -0
  34. package/dist/format.js +38 -0
  35. package/dist/gl-utils.d.ts +1 -0
  36. package/dist/gl-utils.js +27 -0
  37. package/dist/index.d.ts +41 -0
  38. package/dist/index.js +941 -0
  39. package/dist/indexed-data-container.d.ts +34 -0
  40. package/dist/indexed-data-container.js +214 -0
  41. package/dist/locale-utils.d.ts +2 -0
  42. package/dist/locale-utils.js +39 -0
  43. package/dist/map-info-utils.d.ts +1 -0
  44. package/dist/map-info-utils.js +14 -0
  45. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +57 -0
  46. package/dist/map-style-utils/mapbox-gl-style-editor.js +188 -0
  47. package/dist/map-style-utils/mapbox-utils.d.ts +14 -0
  48. package/dist/map-style-utils/mapbox-utils.js +51 -0
  49. package/dist/map-utils.d.ts +9 -0
  50. package/dist/map-utils.js +48 -0
  51. package/dist/mapbox-utils.d.ts +7 -0
  52. package/dist/mapbox-utils.js +19 -0
  53. package/dist/noop.d.ts +1 -0
  54. package/dist/noop.js +13 -0
  55. package/dist/notifications-utils.d.ts +42 -0
  56. package/dist/notifications-utils.js +69 -0
  57. package/dist/observe-dimensions.d.ts +15 -0
  58. package/dist/observe-dimensions.js +130 -0
  59. package/dist/plot.d.ts +131 -0
  60. package/dist/plot.js +615 -0
  61. package/dist/position-utils.d.ts +6 -0
  62. package/dist/position-utils.js +26 -0
  63. package/dist/projection-utils.d.ts +22 -0
  64. package/dist/projection-utils.js +83 -0
  65. package/dist/quick-insertion-sort.d.ts +12 -0
  66. package/dist/quick-insertion-sort.js +132 -0
  67. package/dist/row-data-container.d.ts +31 -0
  68. package/dist/row-data-container.js +206 -0
  69. package/dist/searcher-utils.d.ts +1 -0
  70. package/dist/searcher-utils.js +25 -0
  71. package/dist/split-map-utils.d.ts +32 -0
  72. package/dist/split-map-utils.js +99 -0
  73. package/dist/strings.d.ts +4 -0
  74. package/dist/strings.js +16 -0
  75. package/dist/time.d.ts +54 -0
  76. package/dist/time.js +325 -0
  77. package/dist/types.d.ts +18 -0
  78. package/dist/types.js +6 -0
  79. package/dist/utils.d.ts +104 -0
  80. package/dist/utils.js +241 -0
  81. package/package.json +6 -5
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.datasetColorMaker = exports.addTimeLabel = void 0;
8
+ exports.findDefaultColorField = findDefaultColorField;
9
+ exports.getFieldFormatLabels = getFieldFormatLabels;
10
+ exports.getFormatLabels = void 0;
11
+ exports.validateInputData = validateInputData;
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
14
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
15
+ var _constants = require("@kepler.gl/constants");
16
+ var _commonUtils = require("@kepler.gl/common-utils");
17
+ var _typeAnalyzer = require("type-analyzer");
18
+ var _assert = _interopRequireDefault(require("assert"));
19
+ var _utils = require("./utils");
20
+ var _dataUtils = require("./data-utils");
21
+ var _format = require("./format");
22
+ var _colorUtils = require("./color-utils");
23
+ 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; }
24
+ 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; }
25
+ var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor); // SPDX-License-Identifier: MIT
26
+ // Copyright contributors to the kepler.gl project
27
+ // apply a color for each dataset
28
+ // to use as label colors
29
+ var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_colorUtils.hexToRgb);
30
+
31
+ /**
32
+ * Random color generator
33
+ */
34
+ function generateColor() {
35
+ var index;
36
+ return _regenerator["default"].wrap(function generateColor$(_context) {
37
+ while (1) switch (_context.prev = _context.next) {
38
+ case 0:
39
+ index = 0;
40
+ case 1:
41
+ if (!(index < datasetColors.length + 1)) {
42
+ _context.next = 7;
43
+ break;
44
+ }
45
+ if (index === datasetColors.length) {
46
+ index = 0;
47
+ }
48
+ _context.next = 5;
49
+ return datasetColors[index++];
50
+ case 5:
51
+ _context.next = 1;
52
+ break;
53
+ case 7:
54
+ case "end":
55
+ return _context.stop();
56
+ }
57
+ }, _marked);
58
+ }
59
+ var datasetColorMaker = exports.datasetColorMaker = generateColor();
60
+
61
+ /**
62
+ * Field name prefixes and suffixes which should not be considered
63
+ * as metrics. Fields will still be included if a 'metric word'
64
+ * is found on the field name, however.
65
+ */
66
+ var EXCLUDED_DEFAULT_FIELDS = [
67
+ // Serial numbers and identification numbers
68
+ '_id', 'id', 'index', 'uuid', 'guid', 'uid', 'gid', 'serial',
69
+ // Geographic IDs are unlikely to be interesting to color
70
+ 'zip', 'code', 'post', 'region', 'fips', 'cbgs', 'h3', 's2',
71
+ // Geographic coords (but not z/elevation/altitude
72
+ // since that might be a metric)
73
+ 'lat', 'lon', 'lng', 'latitude', 'longitude', '_x', '_y'];
74
+
75
+ /**
76
+ * Prefixes and suffixes that indicate a field is a metric.
77
+ *
78
+ * Note that these are in order of preference, first being
79
+ * most preferred.
80
+ */
81
+ var METRIC_DEFAULT_FIELDS = ['metric', 'value', 'sum', 'count', 'unique', 'mean', 'mode', 'median', 'max', 'min', 'deviation', 'variance', 'p99', 'p95', 'p75', 'p50', 'p25', 'p05',
82
+ // Abbreviations are less preferred
83
+ 'cnt', 'val'];
84
+
85
+ /**
86
+ * Choose a field to use as the default color field of a layer.
87
+ *
88
+ * The heuristic is:
89
+ *
90
+ * First, exclude fields that are on the exclusion list and don't
91
+ * have names that suggest they contain metrics. Also exclude
92
+ * field names that are blank.
93
+ *
94
+ * Next, look for a field that is of real type and contains one
95
+ * of the preferred names (in order of the preferred names).
96
+ *
97
+ * Next, look for a field that is of integer type and contains
98
+ * one of the preferred names (in order of the preferred names).
99
+ *
100
+ * Next, look for the first field that is of real type (in order
101
+ * of field index).
102
+ *
103
+ * Next, look for the first field that is of integer type (in
104
+ * order of field index).
105
+ *
106
+ * It's possible no field will be chosen (i.e. because all fields
107
+ * are strings.)
108
+ *
109
+ * @param dataset
110
+ */
111
+ function findDefaultColorField(_ref) {
112
+ var fields = _ref.fields,
113
+ _ref$fieldPairs = _ref.fieldPairs,
114
+ fieldPairs = _ref$fieldPairs === void 0 ? [] : _ref$fieldPairs;
115
+ var fieldsWithoutExcluded = fields.filter(function (field) {
116
+ if (field.type !== _constants.ALL_FIELD_TYPES.real && field.type !== _constants.ALL_FIELD_TYPES.integer) {
117
+ // Only select numeric fields.
118
+ return false;
119
+ }
120
+ if (fieldPairs.find(function (pair) {
121
+ return pair.pair.lat.value === field.name || pair.pair.lng.value === field.name;
122
+ })) {
123
+ // Do not permit lat, lon fields
124
+ return false;
125
+ }
126
+ var normalizedFieldName = field.name.toLowerCase();
127
+ if (normalizedFieldName === '') {
128
+ // Special case excluded name when the name is blank.
129
+ return false;
130
+ }
131
+ var hasExcluded = EXCLUDED_DEFAULT_FIELDS.find(function (f) {
132
+ return normalizedFieldName.startsWith(f) || normalizedFieldName.endsWith(f);
133
+ });
134
+ var hasInclusion = METRIC_DEFAULT_FIELDS.find(function (f) {
135
+ return normalizedFieldName.startsWith(f) || normalizedFieldName.endsWith(f);
136
+ });
137
+ return !hasExcluded || hasInclusion;
138
+ });
139
+ var sortedFields = fieldsWithoutExcluded.sort(function (left, right) {
140
+ var normalizedLeft = left.name.toLowerCase();
141
+ var normalizedRight = right.name.toLowerCase();
142
+ var leftHasInclusion = METRIC_DEFAULT_FIELDS.findIndex(function (f) {
143
+ return normalizedLeft.startsWith(f) || normalizedLeft.endsWith(f);
144
+ });
145
+ var rightHasInclusion = METRIC_DEFAULT_FIELDS.findIndex(function (f) {
146
+ return normalizedRight.startsWith(f) || normalizedRight.endsWith(f);
147
+ });
148
+ if (leftHasInclusion !== rightHasInclusion) {
149
+ if (leftHasInclusion === -1) {
150
+ // Elements that do not have the inclusion list should go after those that do.
151
+ return 1;
152
+ } else if (rightHasInclusion === -1) {
153
+ // Elements that do have the inclusion list should go before those that don't.
154
+ return -1;
155
+ }
156
+ // Compare based on order in the inclusion list
157
+ return leftHasInclusion - rightHasInclusion;
158
+ }
159
+
160
+ // Compare based on type
161
+ if (left.type !== right.type) {
162
+ if (left.type === _constants.ALL_FIELD_TYPES.real) {
163
+ return -1;
164
+ }
165
+ // left is an integer and right is not
166
+ // and reals come before integers
167
+ return 1;
168
+ }
169
+
170
+ // Finally, order based on the order in the datasets columns
171
+ // @ts-expect-error
172
+ return left.index - right.index;
173
+ });
174
+ if (sortedFields.length) {
175
+ // There was a best match
176
+ return sortedFields[0];
177
+ }
178
+ // No matches
179
+ return null;
180
+ }
181
+
182
+ /**
183
+ * Validate input data, adding missing field types, rename duplicate columns
184
+ */
185
+ function validateInputData(data) {
186
+ if (!(0, _utils.isPlainObject)(data)) {
187
+ (0, _assert["default"])('addDataToMap Error: dataset.data cannot be null');
188
+ return null;
189
+ } else if (!Array.isArray(data.fields)) {
190
+ (0, _assert["default"])('addDataToMap Error: expect dataset.data.fields to be an array');
191
+ return null;
192
+ } else if (!Array.isArray(data.rows)) {
193
+ (0, _assert["default"])('addDataToMap Error: expect dataset.data.rows to be an array');
194
+ return null;
195
+ }
196
+ var fields = data.fields,
197
+ rows = data.rows,
198
+ cols = data.cols;
199
+
200
+ // check if all fields has name, format and type
201
+ var allValid = fields.every(function (f, i) {
202
+ if (!(0, _utils.isPlainObject)(f)) {
203
+ (0, _assert["default"])("fields needs to be an array of object, but find ".concat((0, _typeof2["default"])(f)));
204
+ fields[i] = {
205
+ name: "column_".concat(i),
206
+ type: _constants.ALL_FIELD_TYPES.string
207
+ };
208
+ }
209
+ if (!f.name) {
210
+ (0, _assert["default"])("field.name is required but missing in ".concat(JSON.stringify(f)));
211
+ // assign a name
212
+ fields[i].name = "column_".concat(i);
213
+ }
214
+ if (!f.type || !_constants.ALL_FIELD_TYPES[f.type]) {
215
+ (0, _assert["default"])("unknown field type ".concat(f.type));
216
+ return false;
217
+ }
218
+ if (!fields.every(function (field) {
219
+ return field.analyzerType;
220
+ })) {
221
+ (0, _assert["default"])('field missing analyzerType');
222
+ return false;
223
+ }
224
+
225
+ // check time format is correct based on first 10 not empty element
226
+ if (f.type === _constants.ALL_FIELD_TYPES.timestamp) {
227
+ var sample = findNonEmptyRowsAtField(rows, i, 10).map(function (r) {
228
+ return {
229
+ ts: r[i]
230
+ };
231
+ });
232
+ var analyzedType = _typeAnalyzer.Analyzer.computeColMeta(sample)[0];
233
+ return analyzedType && analyzedType.category === 'TIME' && analyzedType.format === f.format;
234
+ }
235
+
236
+ // check existing string field is H3 type
237
+ if (f.type === _constants.ALL_FIELD_TYPES.string) {
238
+ var _sample = findNonEmptyRowsAtField(rows, i, 10).map(function (r) {
239
+ return r[i];
240
+ });
241
+ return _sample.every(function (item) {
242
+ return !(0, _commonUtils.h3IsValid)(item);
243
+ });
244
+ }
245
+ return true;
246
+ });
247
+ if (allValid) {
248
+ return {
249
+ rows: rows,
250
+ fields: fields,
251
+ cols: cols
252
+ };
253
+ }
254
+
255
+ // if any field has missing type, recalculate it for everyone
256
+ // because we simply lost faith in humanity
257
+ var sampleData = (0, _commonUtils.getSampleForTypeAnalyze)({
258
+ fields: fields.map(function (f) {
259
+ return f.name;
260
+ }),
261
+ rows: rows
262
+ });
263
+ var fieldOrder = fields.map(function (f) {
264
+ return f.name;
265
+ });
266
+ var meta = (0, _commonUtils.getFieldsFromData)(sampleData, fieldOrder);
267
+ var updatedFields = fields.map(function (f, i) {
268
+ return _objectSpread(_objectSpread({}, f), {}, {
269
+ type: meta[i].type,
270
+ format: meta[i].format,
271
+ analyzerType: meta[i].analyzerType
272
+ });
273
+ });
274
+ return {
275
+ fields: updatedFields,
276
+ rows: rows
277
+ };
278
+ }
279
+ function findNonEmptyRowsAtField(rows, fieldIdx, total) {
280
+ var sample = [];
281
+ var i = 0;
282
+ while (sample.length < total && i < rows.length) {
283
+ var _rows$i;
284
+ if ((0, _commonUtils.notNullorUndefined)((_rows$i = rows[i]) === null || _rows$i === void 0 ? void 0 : _rows$i[fieldIdx])) {
285
+ sample.push(rows[i]);
286
+ }
287
+ i++;
288
+ }
289
+ return sample;
290
+ }
291
+ var TIME_DISPLAY = '2020-05-11 14:00';
292
+ var addTimeLabel = exports.addTimeLabel = function addTimeLabel(formats) {
293
+ return formats.map(function (f) {
294
+ return _objectSpread(_objectSpread({}, f), {}, {
295
+ label: f.type === _constants.TOOLTIP_FORMAT_TYPES.DATE_TIME || f.type === _constants.TOOLTIP_FORMAT_TYPES.DATE ? (0, _dataUtils.getFormatter)((0, _format.getFormatValue)(f))(TIME_DISPLAY) : f.label
296
+ });
297
+ });
298
+ };
299
+ function getFieldFormatLabels(fieldType) {
300
+ var tooltipTypes = fieldType && _constants.FIELD_OPTS[fieldType].format.tooltip || [];
301
+ var formatLabels = Object.values(_constants.TOOLTIP_FORMATS).filter(function (t) {
302
+ return tooltipTypes.includes(t.type);
303
+ });
304
+ return addTimeLabel(formatLabels);
305
+ }
306
+ var getFormatLabels = exports.getFormatLabels = function getFormatLabels(fields, fieldName) {
307
+ var _fields$find;
308
+ var fieldType = (_fields$find = fields.find(function (f) {
309
+ return f.name === fieldName;
310
+ })) === null || _fields$find === void 0 ? void 0 : _fields$find.type;
311
+ return getFieldFormatLabels(fieldType);
312
+ };
313
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9jb21tb25VdGlscyIsIl90eXBlQW5hbHl6ZXIiLCJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfZm9ybWF0IiwiX2NvbG9yVXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9tYXJrZWQiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiZ2VuZXJhdGVDb2xvciIsImRhdGFzZXRDb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImluZGV4Iiwid3JhcCIsImdlbmVyYXRlQ29sb3IkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInN0b3AiLCJkYXRhc2V0Q29sb3JNYWtlciIsImV4cG9ydHMiLCJFWENMVURFRF9ERUZBVUxUX0ZJRUxEUyIsIk1FVFJJQ19ERUZBVUxUX0ZJRUxEUyIsImZpbmREZWZhdWx0Q29sb3JGaWVsZCIsIl9yZWYiLCJmaWVsZHMiLCJfcmVmJGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwiZmllbGRzV2l0aG91dEV4Y2x1ZGVkIiwiZmllbGQiLCJ0eXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsImludGVnZXIiLCJmaW5kIiwicGFpciIsImxhdCIsInZhbHVlIiwibmFtZSIsImxuZyIsIm5vcm1hbGl6ZWRGaWVsZE5hbWUiLCJ0b0xvd2VyQ2FzZSIsImhhc0V4Y2x1ZGVkIiwiZiIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsImhhc0luY2x1c2lvbiIsInNvcnRlZEZpZWxkcyIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJub3JtYWxpemVkTGVmdCIsIm5vcm1hbGl6ZWRSaWdodCIsImxlZnRIYXNJbmNsdXNpb24iLCJmaW5kSW5kZXgiLCJyaWdodEhhc0luY2x1c2lvbiIsInZhbGlkYXRlSW5wdXREYXRhIiwiZGF0YSIsImlzUGxhaW5PYmplY3QiLCJhc3NlcnQiLCJBcnJheSIsImlzQXJyYXkiLCJyb3dzIiwiY29scyIsImFsbFZhbGlkIiwiZXZlcnkiLCJpIiwiY29uY2F0IiwiX3R5cGVvZjIiLCJzdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYW5hbHl6ZXJUeXBlIiwidGltZXN0YW1wIiwic2FtcGxlIiwiZmluZE5vbkVtcHR5Um93c0F0RmllbGQiLCJ0cyIsImFuYWx5emVkVHlwZSIsIkFuYWx5emVyIiwiY29tcHV0ZUNvbE1ldGEiLCJjYXRlZ29yeSIsImZvcm1hdCIsIml0ZW0iLCJoM0lzVmFsaWQiLCJzYW1wbGVEYXRhIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJmaWVsZE9yZGVyIiwibWV0YSIsImdldEZpZWxkc0Zyb21EYXRhIiwidXBkYXRlZEZpZWxkcyIsImZpZWxkSWR4IiwidG90YWwiLCJfcm93cyRpIiwibm90TnVsbG9yVW5kZWZpbmVkIiwiVElNRV9ESVNQTEFZIiwiYWRkVGltZUxhYmVsIiwiZm9ybWF0cyIsImxhYmVsIiwiVE9PTFRJUF9GT1JNQVRfVFlQRVMiLCJEQVRFX1RJTUUiLCJEQVRFIiwiZ2V0Rm9ybWF0dGVyIiwiZ2V0Rm9ybWF0VmFsdWUiLCJnZXRGaWVsZEZvcm1hdExhYmVscyIsImZpZWxkVHlwZSIsInRvb2x0aXBUeXBlcyIsIkZJRUxEX09QVFMiLCJ0b29sdGlwIiwiZm9ybWF0TGFiZWxzIiwidmFsdWVzIiwiVE9PTFRJUF9GT1JNQVRTIiwiaW5jbHVkZXMiLCJnZXRGb3JtYXRMYWJlbHMiLCJmaWVsZE5hbWUiLCJfZmllbGRzJGZpbmQiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YXNldC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIEZJRUxEX09QVFMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVNcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSwgZ2V0RmllbGRzRnJvbURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7QW5hbHl6ZXJ9IGZyb20gJ3R5cGUtYW5hbHl6ZXInO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICBQcm9jZXNzb3JSZXN1bHQsXG4gIFJHQkNvbG9yLFxuICBGaWVsZCxcbiAgRmllbGRQYWlyLFxuICBUaW1lTGFiZWxGb3JtYXQsXG4gIFRvb2x0aXBGaWVsZHMsXG4gIFByb3RvRGF0YXNldFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7VG9vbHRpcEZvcm1hdH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtub3ROdWxsb3JVbmRlZmluZWQsIGgzSXNWYWxpZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtnZXRGb3JtYXR0ZXJ9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQge2dldEZvcm1hdFZhbHVlfSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICcuL2NvbG9yLXV0aWxzJztcblxuLy8gYXBwbHkgYSBjb2xvciBmb3IgZWFjaCBkYXRhc2V0XG4vLyB0byB1c2UgYXMgbGFiZWwgY29sb3JzXG5jb25zdCBkYXRhc2V0Q29sb3JzID0gW1xuICAnIzhGMkZCRicsXG4gICcjMDA1Q0ZGJyxcbiAgJyNDMDZDODQnLFxuICAnI0Y4QjE5NScsXG4gICcjNTQ3QTgyJyxcbiAgJyMzRUFDQTgnLFxuICAnI0EyRDRBQidcbl0ubWFwKGhleFRvUmdiKTtcblxuLyoqXG4gKiBSYW5kb20gY29sb3IgZ2VuZXJhdG9yXG4gKi9cbmZ1bmN0aW9uKiBnZW5lcmF0ZUNvbG9yKCk6IEdlbmVyYXRvcjxSR0JDb2xvcj4ge1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBkYXRhc2V0Q29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGRhdGFzZXRDb2xvcnMubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIHlpZWxkIGRhdGFzZXRDb2xvcnNbaW5kZXgrK107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRhdGFzZXRDb2xvck1ha2VyID0gZ2VuZXJhdGVDb2xvcigpO1xuXG4vKipcbiAqIEZpZWxkIG5hbWUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHdoaWNoIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZFxuICogYXMgbWV0cmljcy4gRmllbGRzIHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQgaWYgYSAnbWV0cmljIHdvcmQnXG4gKiBpcyBmb3VuZCBvbiB0aGUgZmllbGQgbmFtZSwgaG93ZXZlci5cbiAqL1xuY29uc3QgRVhDTFVERURfREVGQVVMVF9GSUVMRFMgPSBbXG4gIC8vIFNlcmlhbCBudW1iZXJzIGFuZCBpZGVudGlmaWNhdGlvbiBudW1iZXJzXG4gICdfaWQnLFxuICAnaWQnLFxuICAnaW5kZXgnLFxuICAndXVpZCcsXG4gICdndWlkJyxcbiAgJ3VpZCcsXG4gICdnaWQnLFxuICAnc2VyaWFsJyxcbiAgLy8gR2VvZ3JhcGhpYyBJRHMgYXJlIHVubGlrZWx5IHRvIGJlIGludGVyZXN0aW5nIHRvIGNvbG9yXG4gICd6aXAnLFxuICAnY29kZScsXG4gICdwb3N0JyxcbiAgJ3JlZ2lvbicsXG4gICdmaXBzJyxcbiAgJ2NiZ3MnLFxuICAnaDMnLFxuICAnczInLFxuICAvLyBHZW9ncmFwaGljIGNvb3JkcyAoYnV0IG5vdCB6L2VsZXZhdGlvbi9hbHRpdHVkZVxuICAvLyBzaW5jZSB0aGF0IG1pZ2h0IGJlIGEgbWV0cmljKVxuICAnbGF0JyxcbiAgJ2xvbicsXG4gICdsbmcnLFxuICAnbGF0aXR1ZGUnLFxuICAnbG9uZ2l0dWRlJyxcbiAgJ194JyxcbiAgJ195J1xuXTtcblxuLyoqXG4gKiBQcmVmaXhlcyBhbmQgc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBhIGZpZWxkIGlzIGEgbWV0cmljLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSwgZmlyc3QgYmVpbmdcbiAqIG1vc3QgcHJlZmVycmVkLlxuICovXG5jb25zdCBNRVRSSUNfREVGQVVMVF9GSUVMRFMgPSBbXG4gICdtZXRyaWMnLFxuICAndmFsdWUnLFxuICAnc3VtJyxcbiAgJ2NvdW50JyxcbiAgJ3VuaXF1ZScsXG4gICdtZWFuJyxcbiAgJ21vZGUnLFxuICAnbWVkaWFuJyxcbiAgJ21heCcsXG4gICdtaW4nLFxuICAnZGV2aWF0aW9uJyxcbiAgJ3ZhcmlhbmNlJyxcbiAgJ3A5OScsXG4gICdwOTUnLFxuICAncDc1JyxcbiAgJ3A1MCcsXG4gICdwMjUnLFxuICAncDA1JyxcbiAgLy8gQWJicmV2aWF0aW9ucyBhcmUgbGVzcyBwcmVmZXJyZWRcbiAgJ2NudCcsXG4gICd2YWwnXG5dO1xuXG4vKipcbiAqIENob29zZSBhIGZpZWxkIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBjb2xvciBmaWVsZCBvZiBhIGxheWVyLlxuICpcbiAqIFRoZSBoZXVyaXN0aWMgaXM6XG4gKlxuICogRmlyc3QsIGV4Y2x1ZGUgZmllbGRzIHRoYXQgYXJlIG9uIHRoZSBleGNsdXNpb24gbGlzdCBhbmQgZG9uJ3RcbiAqIGhhdmUgbmFtZXMgdGhhdCBzdWdnZXN0IHRoZXkgY29udGFpbiBtZXRyaWNzLiBBbHNvIGV4Y2x1ZGVcbiAqIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGJsYW5rLlxuICpcbiAqIE5leHQsIGxvb2sgZm9yIGEgZmllbGQgdGhhdCBpcyBvZiByZWFsIHR5cGUgYW5kIGNvbnRhaW5zIG9uZVxuICogb2YgdGhlIHByZWZlcnJlZCBuYW1lcyAoaW4gb3JkZXIgb2YgdGhlIHByZWZlcnJlZCBuYW1lcykuXG4gKlxuICogTmV4dCwgbG9vayBmb3IgYSBmaWVsZCB0aGF0IGlzIG9mIGludGVnZXIgdHlwZSBhbmQgY29udGFpbnNcbiAqIG9uZSBvZiB0aGUgcHJlZmVycmVkIG5hbWVzIChpbiBvcmRlciBvZiB0aGUgcHJlZmVycmVkIG5hbWVzKS5cbiAqXG4gKiBOZXh0LCBsb29rIGZvciB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBvZiByZWFsIHR5cGUgKGluIG9yZGVyXG4gKiBvZiBmaWVsZCBpbmRleCkuXG4gKlxuICogTmV4dCwgbG9vayBmb3IgdGhlIGZpcnN0IGZpZWxkIHRoYXQgaXMgb2YgaW50ZWdlciB0eXBlIChpblxuICogb3JkZXIgb2YgZmllbGQgaW5kZXgpLlxuICpcbiAqIEl0J3MgcG9zc2libGUgbm8gZmllbGQgd2lsbCBiZSBjaG9zZW4gKGkuZS4gYmVjYXVzZSBhbGwgZmllbGRzXG4gKiBhcmUgc3RyaW5ncy4pXG4gKlxuICogQHBhcmFtIGRhdGFzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREZWZhdWx0Q29sb3JGaWVsZCh7XG4gIGZpZWxkcyxcbiAgZmllbGRQYWlycyA9IFtdXG59OiB7XG4gIGZpZWxkczogRmllbGRbXTtcbiAgZmllbGRQYWlyczogRmllbGRQYWlyW107XG59KTogbnVsbCB8IEZpZWxkIHtcbiAgY29uc3QgZmllbGRzV2l0aG91dEV4Y2x1ZGVkID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiB7XG4gICAgaWYgKGZpZWxkLnR5cGUgIT09IEFMTF9GSUVMRF9UWVBFUy5yZWFsICYmIGZpZWxkLnR5cGUgIT09IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyKSB7XG4gICAgICAvLyBPbmx5IHNlbGVjdCBudW1lcmljIGZpZWxkcy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZmllbGRQYWlycy5maW5kKFxuICAgICAgICBwYWlyID0+IHBhaXIucGFpci5sYXQudmFsdWUgPT09IGZpZWxkLm5hbWUgfHwgcGFpci5wYWlyLmxuZy52YWx1ZSA9PT0gZmllbGQubmFtZVxuICAgICAgKVxuICAgICkge1xuICAgICAgLy8gRG8gbm90IHBlcm1pdCBsYXQsIGxvbiBmaWVsZHNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkRmllbGROYW1lID0gZmllbGQubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkRmllbGROYW1lID09PSAnJykge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGV4Y2x1ZGVkIG5hbWUgd2hlbiB0aGUgbmFtZSBpcyBibGFuay5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGFzRXhjbHVkZWQgPSBFWENMVURFRF9ERUZBVUxUX0ZJRUxEUy5maW5kKFxuICAgICAgZiA9PiBub3JtYWxpemVkRmllbGROYW1lLnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZEZpZWxkTmFtZS5lbmRzV2l0aChmKVxuICAgICk7XG4gICAgY29uc3QgaGFzSW5jbHVzaW9uID0gTUVUUklDX0RFRkFVTFRfRklFTERTLmZpbmQoXG4gICAgICBmID0+IG5vcm1hbGl6ZWRGaWVsZE5hbWUuc3RhcnRzV2l0aChmKSB8fCBub3JtYWxpemVkRmllbGROYW1lLmVuZHNXaXRoKGYpXG4gICAgKTtcbiAgICByZXR1cm4gIWhhc0V4Y2x1ZGVkIHx8IGhhc0luY2x1c2lvbjtcbiAgfSk7XG5cbiAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzV2l0aG91dEV4Y2x1ZGVkLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExlZnQgPSBsZWZ0Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBub3JtYWxpemVkUmlnaHQgPSByaWdodC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbGVmdEhhc0luY2x1c2lvbiA9IE1FVFJJQ19ERUZBVUxUX0ZJRUxEUy5maW5kSW5kZXgoXG4gICAgICBmID0+IG5vcm1hbGl6ZWRMZWZ0LnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZExlZnQuZW5kc1dpdGgoZilcbiAgICApO1xuICAgIGNvbnN0IHJpZ2h0SGFzSW5jbHVzaW9uID0gTUVUUklDX0RFRkFVTFRfRklFTERTLmZpbmRJbmRleChcbiAgICAgIGYgPT4gbm9ybWFsaXplZFJpZ2h0LnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZFJpZ2h0LmVuZHNXaXRoKGYpXG4gICAgKTtcbiAgICBpZiAobGVmdEhhc0luY2x1c2lvbiAhPT0gcmlnaHRIYXNJbmNsdXNpb24pIHtcbiAgICAgIGlmIChsZWZ0SGFzSW5jbHVzaW9uID09PSAtMSkge1xuICAgICAgICAvLyBFbGVtZW50cyB0aGF0IGRvIG5vdCBoYXZlIHRoZSBpbmNsdXNpb24gbGlzdCBzaG91bGQgZ28gYWZ0ZXIgdGhvc2UgdGhhdCBkby5cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0SGFzSW5jbHVzaW9uID09PSAtMSkge1xuICAgICAgICAvLyBFbGVtZW50cyB0aGF0IGRvIGhhdmUgdGhlIGluY2x1c2lvbiBsaXN0IHNob3VsZCBnbyBiZWZvcmUgdGhvc2UgdGhhdCBkb24ndC5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgLy8gQ29tcGFyZSBiYXNlZCBvbiBvcmRlciBpbiB0aGUgaW5jbHVzaW9uIGxpc3RcbiAgICAgIHJldHVybiBsZWZ0SGFzSW5jbHVzaW9uIC0gcmlnaHRIYXNJbmNsdXNpb247XG4gICAgfVxuXG4gICAgLy8gQ29tcGFyZSBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKGxlZnQudHlwZSAhPT0gcmlnaHQudHlwZSkge1xuICAgICAgaWYgKGxlZnQudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnJlYWwpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgLy8gbGVmdCBpcyBhbiBpbnRlZ2VyIGFuZCByaWdodCBpcyBub3RcbiAgICAgIC8vIGFuZCByZWFscyBjb21lIGJlZm9yZSBpbnRlZ2Vyc1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgb3JkZXIgYmFzZWQgb24gdGhlIG9yZGVyIGluIHRoZSBkYXRhc2V0cyBjb2x1bW5zXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXg7XG4gIH0pO1xuXG4gIGlmIChzb3J0ZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgLy8gVGhlcmUgd2FzIGEgYmVzdCBtYXRjaFxuICAgIHJldHVybiBzb3J0ZWRGaWVsZHNbMF07XG4gIH1cbiAgLy8gTm8gbWF0Y2hlc1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBpbnB1dCBkYXRhLCBhZGRpbmcgbWlzc2luZyBmaWVsZCB0eXBlcywgcmVuYW1lIGR1cGxpY2F0ZSBjb2x1bW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0RGF0YShkYXRhOiBQcm90b0RhdGFzZXRbJ2RhdGEnXSk6IFByb2Nlc3NvclJlc3VsdCB7XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGFzc2VydCgnYWRkRGF0YVRvTWFwIEVycm9yOiBkYXRhc2V0LmRhdGEgY2Fubm90IGJlIG51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmZpZWxkcykpIHtcbiAgICBhc3NlcnQoJ2FkZERhdGFUb01hcCBFcnJvcjogZXhwZWN0IGRhdGFzZXQuZGF0YS5maWVsZHMgdG8gYmUgYW4gYXJyYXknKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnJvd3MpKSB7XG4gICAgYXNzZXJ0KCdhZGREYXRhVG9NYXAgRXJyb3I6IGV4cGVjdCBkYXRhc2V0LmRhdGEucm93cyB0byBiZSBhbiBhcnJheScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qge2ZpZWxkcywgcm93cywgY29sc30gPSBkYXRhO1xuXG4gIC8vIGNoZWNrIGlmIGFsbCBmaWVsZHMgaGFzIG5hbWUsIGZvcm1hdCBhbmQgdHlwZVxuICBjb25zdCBhbGxWYWxpZCA9IGZpZWxkcy5ldmVyeSgoZiwgaSkgPT4ge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChmKSkge1xuICAgICAgYXNzZXJ0KGBmaWVsZHMgbmVlZHMgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0LCBidXQgZmluZCAke3R5cGVvZiBmfWApO1xuICAgICAgZmllbGRzW2ldID0ge25hbWU6IGBjb2x1bW5fJHtpfWAsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9O1xuICAgIH1cblxuICAgIGlmICghZi5uYW1lKSB7XG4gICAgICBhc3NlcnQoYGZpZWxkLm5hbWUgaXMgcmVxdWlyZWQgYnV0IG1pc3NpbmcgaW4gJHtKU09OLnN0cmluZ2lmeShmKX1gKTtcbiAgICAgIC8vIGFzc2lnbiBhIG5hbWVcbiAgICAgIGZpZWxkc1tpXS5uYW1lID0gYGNvbHVtbl8ke2l9YDtcbiAgICB9XG5cbiAgICBpZiAoIWYudHlwZSB8fCAhQUxMX0ZJRUxEX1RZUEVTW2YudHlwZV0pIHtcbiAgICAgIGFzc2VydChgdW5rbm93biBmaWVsZCB0eXBlICR7Zi50eXBlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZmllbGRzLmV2ZXJ5KGZpZWxkID0+IGZpZWxkLmFuYWx5emVyVHlwZSkpIHtcbiAgICAgIGFzc2VydCgnZmllbGQgbWlzc2luZyBhbmFseXplclR5cGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB0aW1lIGZvcm1hdCBpcyBjb3JyZWN0IGJhc2VkIG9uIGZpcnN0IDEwIG5vdCBlbXB0eSBlbGVtZW50XG4gICAgaWYgKGYudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgY29uc3Qgc2FtcGxlID0gZmluZE5vbkVtcHR5Um93c0F0RmllbGQocm93cywgaSwgMTApLm1hcChyID0+ICh7dHM6IHJbaV19KSk7XG4gICAgICBjb25zdCBhbmFseXplZFR5cGUgPSBBbmFseXplci5jb21wdXRlQ29sTWV0YShzYW1wbGUpWzBdO1xuICAgICAgcmV0dXJuIGFuYWx5emVkVHlwZSAmJiBhbmFseXplZFR5cGUuY2F0ZWdvcnkgPT09ICdUSU1FJyAmJiBhbmFseXplZFR5cGUuZm9ybWF0ID09PSBmLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBleGlzdGluZyBzdHJpbmcgZmllbGQgaXMgSDMgdHlwZVxuICAgIGlmIChmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpIHtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IGZpbmROb25FbXB0eVJvd3NBdEZpZWxkKHJvd3MsIGksIDEwKS5tYXAociA9PiByW2ldKTtcbiAgICAgIHJldHVybiBzYW1wbGUuZXZlcnkoaXRlbSA9PiAhaDNJc1ZhbGlkKGl0ZW0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGFsbFZhbGlkKSB7XG4gICAgcmV0dXJuIHtyb3dzLCBmaWVsZHMsIGNvbHN9O1xuICB9XG5cbiAgLy8gaWYgYW55IGZpZWxkIGhhcyBtaXNzaW5nIHR5cGUsIHJlY2FsY3VsYXRlIGl0IGZvciBldmVyeW9uZVxuICAvLyBiZWNhdXNlIHdlIHNpbXBseSBsb3N0IGZhaXRoIGluIGh1bWFuaXR5XG4gIGNvbnN0IHNhbXBsZURhdGEgPSBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGYgPT4gZi5uYW1lKSxcbiAgICByb3dzXG4gIH0pO1xuICBjb25zdCBmaWVsZE9yZGVyID0gZmllbGRzLm1hcChmID0+IGYubmFtZSk7XG4gIGNvbnN0IG1ldGEgPSBnZXRGaWVsZHNGcm9tRGF0YShzYW1wbGVEYXRhLCBmaWVsZE9yZGVyKTtcbiAgY29uc3QgdXBkYXRlZEZpZWxkcyA9IGZpZWxkcy5tYXAoKGYsIGkpID0+ICh7XG4gICAgLi4uZixcbiAgICB0eXBlOiBtZXRhW2ldLnR5cGUsXG4gICAgZm9ybWF0OiBtZXRhW2ldLmZvcm1hdCxcbiAgICBhbmFseXplclR5cGU6IG1ldGFbaV0uYW5hbHl6ZXJUeXBlXG4gIH0pKTtcblxuICByZXR1cm4ge2ZpZWxkczogdXBkYXRlZEZpZWxkcywgcm93c307XG59XG5cbmZ1bmN0aW9uIGZpbmROb25FbXB0eVJvd3NBdEZpZWxkKHJvd3M6IHVua25vd25bXVtdLCBmaWVsZElkeDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogYW55W10ge1xuICBjb25zdCBzYW1wbGU6IGFueVtdID0gW107XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKHNhbXBsZS5sZW5ndGggPCB0b3RhbCAmJiBpIDwgcm93cy5sZW5ndGgpIHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKHJvd3NbaV0/LltmaWVsZElkeF0pKSB7XG4gICAgICBzYW1wbGUucHVzaChyb3dzW2ldKTtcbiAgICB9XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiBzYW1wbGU7XG59XG5cbmNvbnN0IFRJTUVfRElTUExBWSA9ICcyMDIwLTA1LTExIDE0OjAwJztcblxuZXhwb3J0IGNvbnN0IGFkZFRpbWVMYWJlbCA9IChmb3JtYXRzOiBUaW1lTGFiZWxGb3JtYXRbXSkgPT5cbiAgZm9ybWF0cy5tYXAoZiA9PiAoe1xuICAgIC4uLmYsXG4gICAgbGFiZWw6XG4gICAgICBmLnR5cGUgPT09IFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVfVElNRSB8fCBmLnR5cGUgPT09IFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVcbiAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZ2V0Rm9ybWF0VmFsdWUoZikpKFRJTUVfRElTUExBWSlcbiAgICAgICAgOiBmLmxhYmVsXG4gIH0pKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkRm9ybWF0TGFiZWxzKGZpZWxkVHlwZT86IHN0cmluZyk6IFRvb2x0aXBGb3JtYXRbXSB7XG4gIGNvbnN0IHRvb2x0aXBUeXBlcyA9IChmaWVsZFR5cGUgJiYgRklFTERfT1BUU1tmaWVsZFR5cGVdLmZvcm1hdC50b29sdGlwKSB8fCBbXTtcbiAgY29uc3QgZm9ybWF0TGFiZWxzOiBUaW1lTGFiZWxGb3JtYXRbXSA9IE9iamVjdC52YWx1ZXMoVE9PTFRJUF9GT1JNQVRTKS5maWx0ZXIodCA9PlxuICAgIHRvb2x0aXBUeXBlcy5pbmNsdWRlcyh0LnR5cGUpXG4gICk7XG4gIHJldHVybiBhZGRUaW1lTGFiZWwoZm9ybWF0TGFiZWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZvcm1hdExhYmVscyA9IChmaWVsZHM6IFRvb2x0aXBGaWVsZHNbXSwgZmllbGROYW1lOiBzdHJpbmcpOiBUb29sdGlwRm9ybWF0W10gPT4ge1xuICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGROYW1lKT8udHlwZTtcbiAgcmV0dXJuIGdldEZpZWxkRm9ybWF0TGFiZWxzKGZpZWxkVHlwZSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQU1BLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQWNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLE9BQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUF1QyxTQUFB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
@@ -0,0 +1,73 @@
1
+ declare const domtoimage: {
2
+ toSvg: typeof toSvg;
3
+ toPng: typeof toPng;
4
+ toJpeg: typeof toJpeg;
5
+ toBlob: typeof toBlob;
6
+ toPixelData: typeof toPixelData;
7
+ impl: {
8
+ fontFaces: {
9
+ resolveAll: () => Promise<string>;
10
+ impl: {
11
+ readAll: () => Promise<any>;
12
+ };
13
+ };
14
+ images: {
15
+ inlineAll: (node: any) => any;
16
+ impl: {
17
+ newImage: (element: any) => {
18
+ inline: (get: any) => Promise<unknown>;
19
+ };
20
+ };
21
+ };
22
+ inliner: {
23
+ inlineAll: (string: any, baseUrl: any, get: any) => Promise<any>;
24
+ shouldProcess: (string: any) => boolean;
25
+ impl: {
26
+ readUrls: (string: any) => string[];
27
+ inline: (string: any, url: any, baseUrl: any, get: any) => Promise<any>;
28
+ };
29
+ };
30
+ options: any;
31
+ };
32
+ };
33
+ /**
34
+ * @param {Node} node - The DOM Node object to render
35
+ * @param {Object} options - Rendering options
36
+ * @param {Function} [options.filter] - Should return true if passed node should be included in the output
37
+ * (excluding node means excluding it's children as well). Not called on the root node.
38
+ * @param {String} [options.bgcolor] - color for the background, any valid CSS color value.
39
+ * @param {Number} [options.width] - width to be applied to node before rendering.
40
+ * @param {Number} [options.height] - height to be applied to node before rendering.
41
+ * @param {Object} [options.style] - an object whose properties to be copied to node's style before rendering.
42
+ * @param {Number} [options.quality] - a Number between 0 and 1 indicating image quality (applicable to JPEG only), defaults to 1.0.
43
+ * @param {boolean} [options.escapeXhtmlForWebpack] - whether to apply fix for uglify error in dom-to-image (should be true for webpack builds), defaults to true.
44
+ * @param {String} [options.imagePlaceholder] - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch
45
+ * @param {Boolean} [options.cacheBust] - set to true to cache bust by appending the time to the request url
46
+ * @return {Promise} - A promise that is fulfilled with a SVG image data URL
47
+ * */
48
+ declare function toSvg(node: any, options: any): Promise<string>;
49
+ /**
50
+ * @param {Node} node - The DOM Node object to render
51
+ * @param {Object} options - Rendering options
52
+ * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.
53
+ * */
54
+ declare function toPixelData(node: any, options: any): Promise<any>;
55
+ /**
56
+ * @param {Node} node - The DOM Node object to render
57
+ * @param {Object} options - Rendering options
58
+ * @return {Promise} - A promise that is fulfilled with a PNG image data URL
59
+ * */
60
+ declare function toPng(node: any, options: any): Promise<any>;
61
+ /**
62
+ * @param {Node} node - The DOM Node object to render
63
+ * @param {Object} options - Rendering options
64
+ * @return {Promise} - A promise that is fulfilled with a JPEG image data URL
65
+ * */
66
+ declare function toJpeg(node: any, options: any): Promise<any>;
67
+ /**
68
+ * @param {Node} node - The DOM Node object to render
69
+ * @param {Object} options - Rendering options
70
+ * @return {Promise} - A promise that is fulfilled with a PNG image blob
71
+ * */
72
+ declare function toBlob(node: any, options: any): Promise<unknown>;
73
+ export default domtoimage;