@kepler.gl/reducers 3.3.0-alpha.16 → 3.3.0-alpha.17

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 (38) hide show
  1. package/dist/cjs/column-edit-reconcile.js +100 -0
  2. package/dist/cjs/column-edit-updaters.spec.js +840 -0
  3. package/dist/cjs/dataset-ops-updaters.js +101 -15
  4. package/dist/cjs/dataset-ops-updaters.spec.js +129 -4
  5. package/dist/cjs/export-utils.js +118 -46
  6. package/dist/cjs/interaction-utils.js +11 -3
  7. package/dist/cjs/layer-utils.js +3 -2
  8. package/dist/cjs/ui-state-updaters.js +70 -26
  9. package/dist/cjs/ui-state.js +2 -2
  10. package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
  11. package/dist/cjs/vis-state-merger.js +65 -22
  12. package/dist/cjs/vis-state-updaters.js +581 -177
  13. package/dist/cjs/vis-state.js +2 -2
  14. package/dist/column-edit-reconcile.d.ts +4 -0
  15. package/dist/column-edit-updaters.spec.d.ts +1 -0
  16. package/dist/dataset-ops-updaters.d.ts +3 -0
  17. package/dist/esm/column-edit-reconcile.js +95 -0
  18. package/dist/esm/column-edit-updaters.spec.js +839 -0
  19. package/dist/esm/dataset-ops-updaters.js +99 -16
  20. package/dist/esm/dataset-ops-updaters.spec.js +129 -4
  21. package/dist/esm/export-utils.js +117 -45
  22. package/dist/esm/interaction-utils.js +10 -3
  23. package/dist/esm/layer-utils.js +3 -2
  24. package/dist/esm/ui-state-updaters.js +69 -25
  25. package/dist/esm/ui-state.js +2 -2
  26. package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
  27. package/dist/esm/vis-state-merger.js +66 -24
  28. package/dist/esm/vis-state-updaters.js +571 -185
  29. package/dist/esm/vis-state.js +2 -2
  30. package/dist/export-utils.d.ts +2 -2
  31. package/dist/interaction-utils.d.ts +4 -1
  32. package/dist/layer-utils.d.ts +1 -0
  33. package/dist/ui-state-updaters.d.ts +10 -0
  34. package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
  35. package/dist/vis-state-merger.d.ts +10 -2
  36. package/dist/vis-state-updaters.d.ts +31 -4
  37. package/dist/vis-state.d.ts +4 -0
  38. package/package.json +17 -17
@@ -0,0 +1,840 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
5
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _constants = require("@kepler.gl/constants");
8
+ var _actions = require("@kepler.gl/actions");
9
+ var _table = require("@kepler.gl/table");
10
+ var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
11
+ var _tasks = require("@kepler.gl/tasks");
12
+ var _visState = _interopRequireDefault(require("./vis-state"));
13
+ var _visStateUpdaters = require("./vis-state-updaters");
14
+ 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; }
15
+ 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
16
+ // Copyright contributors to the kepler.gl project
17
+ var reduceVisState = _visState["default"];
18
+ function makeTable(id, data) {
19
+ var table = new _table.KeplerTable({
20
+ info: {
21
+ id: id,
22
+ label: id,
23
+ type: 'local'
24
+ },
25
+ color: [0, 0, 0]
26
+ });
27
+ return table.updateSchema(data);
28
+ }
29
+ function withTables() {
30
+ for (var _len = arguments.length, tables = new Array(_len), _key = 0; _key < _len; _key++) {
31
+ tables[_key] = arguments[_key];
32
+ }
33
+ return _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
34
+ datasets: Object.fromEntries(tables.map(function (table) {
35
+ return [table.id, table];
36
+ }))
37
+ });
38
+ }
39
+ function withFilter(state, dataId, column) {
40
+ return reduceVisState(state, _actions.VisStateActions.createOrUpdateFilter(undefined, dataId, column));
41
+ }
42
+ function withSyncedFilter(primary, secondary, column) {
43
+ return reduceVisState(withFilter(withTables(primary, secondary), primary.id, column), _actions.VisStateActions.setFilter(0, ['dataId', 'name'], [secondary.id, column], 1));
44
+ }
45
+ function changeType(state, dataId, column, type) {
46
+ return reduceVisState(state, _actions.VisStateActions.changeTableColumnType(dataId, column, type));
47
+ }
48
+ function makeCities() {
49
+ var table = new _table.KeplerTable({
50
+ info: {
51
+ id: 'cities',
52
+ label: 'cities',
53
+ type: 'local'
54
+ },
55
+ color: [0, 0, 0]
56
+ });
57
+ table.updateSchema({
58
+ fields: [{
59
+ name: 'lat',
60
+ type: _constants.ALL_FIELD_TYPES.real
61
+ }, {
62
+ name: 'lng',
63
+ type: _constants.ALL_FIELD_TYPES.real
64
+ }, {
65
+ name: 'region',
66
+ type: _constants.ALL_FIELD_TYPES.string
67
+ }, {
68
+ name: 'pop',
69
+ type: _constants.ALL_FIELD_TYPES.integer
70
+ }],
71
+ rows: [[37.7, -122.4, 'west', 10], [40.7, -74.0, 'east', 40]]
72
+ });
73
+ return table;
74
+ }
75
+ function withCities() {
76
+ var cities = makeCities();
77
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
78
+ datasets: {
79
+ cities: cities
80
+ },
81
+ interactionConfig: _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE.interactionConfig), {}, {
82
+ tooltip: _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE.interactionConfig.tooltip), {}, {
83
+ config: _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE.interactionConfig.tooltip.config), {}, {
84
+ fieldsToShow: {
85
+ cities: [{
86
+ name: 'region',
87
+ format: null
88
+ }]
89
+ }
90
+ })
91
+ })
92
+ })
93
+ });
94
+ state = reduceVisState(state, _actions.VisStateActions.addLayer({
95
+ id: 'cities-layer',
96
+ type: 'point',
97
+ config: {
98
+ dataId: 'cities',
99
+ label: 'cities',
100
+ color: [255, 0, 0],
101
+ columns: {
102
+ lat: 'lat',
103
+ lng: 'lng'
104
+ },
105
+ colorField: {
106
+ name: 'region',
107
+ type: 'string'
108
+ },
109
+ textLabel: [{
110
+ field: {
111
+ name: 'region',
112
+ type: 'string'
113
+ }
114
+ }]
115
+ }
116
+ }));
117
+ state = reduceVisState(state, _actions.VisStateActions.createOrUpdateFilter(undefined, 'cities', 'region'));
118
+ state = reduceVisState(state, _actions.VisStateActions.addChart({
119
+ id: 'region-chart',
120
+ title: 'Regions',
121
+ type: 'barChart',
122
+ dataId: 'cities',
123
+ applyFilters: true,
124
+ display: {},
125
+ chartDisplay: {},
126
+ xAxis: {
127
+ field: {
128
+ name: 'region',
129
+ type: 'string'
130
+ },
131
+ aggregation: null,
132
+ title: 'region'
133
+ },
134
+ yAxis: {
135
+ field: {
136
+ name: 'pop',
137
+ type: 'integer'
138
+ },
139
+ aggregation: 'sum',
140
+ title: 'Population'
141
+ },
142
+ crossFilter: {
143
+ enabled: false,
144
+ filterId: 'region-chart-filter',
145
+ fieldNames: {
146
+ xAxis: 'region'
147
+ },
148
+ value: {}
149
+ }
150
+ }));
151
+ return state;
152
+ }
153
+ describe('column edits', function () {
154
+ beforeEach(function () {
155
+ (0, _tasks.drainTasksForTesting)();
156
+ });
157
+ test('rename changes the field identity stored in layers, filters, and saved maps', function () {
158
+ var _layer$config$colorFi, _layer$config$textLab, _state$charts$0$xAxis, _state$charts$0$yAxis, _state$charts$0$cross, _savedVisState$layers, _savedVisState$layers2, _savedVisState$layers3, _savedVisState$charts;
159
+ var state = withCities();
160
+ state.datasets.cities.hiddenColumns = ['region', 'pop'];
161
+ expect(state.layers).toHaveLength(1);
162
+ expect(state.filters[0].name).toEqual(['region']);
163
+ state = reduceVisState(state, _actions.VisStateActions.renameTableColumn('cities', 'region', 'area'));
164
+ var region = state.datasets.cities.fields.find(function (field) {
165
+ return field.name === 'area';
166
+ });
167
+ expect(region === null || region === void 0 ? void 0 : region.name).toBe('area');
168
+ expect(region === null || region === void 0 ? void 0 : region.id).toBe('area');
169
+ expect(region === null || region === void 0 ? void 0 : region.displayName).toBe('area');
170
+ expect(state.datasets.cities.fields.map(function (field) {
171
+ return field.name;
172
+ })).toEqual(['lat', 'lng', 'area', 'pop']);
173
+ expect(state.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
174
+ var layer = state.layers[0];
175
+ expect(layer.config.columns.lat.value).toBe('lat');
176
+ expect(layer.config.columns.lng.value).toBe('lng');
177
+ expect((_layer$config$colorFi = layer.config.colorField) === null || _layer$config$colorFi === void 0 ? void 0 : _layer$config$colorFi.name).toBe('area');
178
+ expect((_layer$config$textLab = layer.config.textLabel[0].field) === null || _layer$config$textLab === void 0 ? void 0 : _layer$config$textLab.name).toBe('area');
179
+ expect(state.filters[0].name).toEqual(['area']);
180
+ expect((_state$charts$0$xAxis = state.charts[0].xAxis) === null || _state$charts$0$xAxis === void 0 || (_state$charts$0$xAxis = _state$charts$0$xAxis.field) === null || _state$charts$0$xAxis === void 0 ? void 0 : _state$charts$0$xAxis.name).toBe('area');
181
+ expect((_state$charts$0$yAxis = state.charts[0].yAxis) === null || _state$charts$0$yAxis === void 0 || (_state$charts$0$yAxis = _state$charts$0$yAxis.field) === null || _state$charts$0$yAxis === void 0 ? void 0 : _state$charts$0$yAxis.name).toBe('pop');
182
+ expect((_state$charts$0$cross = state.charts[0].crossFilter) === null || _state$charts$0$cross === void 0 ? void 0 : _state$charts$0$cross.fieldNames).toEqual({
183
+ xAxis: 'area'
184
+ });
185
+ expect(state.interactionConfig.tooltip.config.fieldsToShow.cities[0].name).toBe('area');
186
+ expect(state.datasets.cities.hiddenColumns).toEqual(['area', 'pop']);
187
+ var saved = _schemas["default"].save({
188
+ visState: state,
189
+ mapState: {},
190
+ mapStyle: {},
191
+ uiState: {}
192
+ });
193
+ var savedVisState = saved.config.config.visState;
194
+ expect((_savedVisState$layers = savedVisState.layers) === null || _savedVisState$layers === void 0 || (_savedVisState$layers = _savedVisState$layers[0].visualChannels) === null || _savedVisState$layers === void 0 ? void 0 : _savedVisState$layers.colorField).toEqual({
195
+ name: 'area',
196
+ type: 'string'
197
+ });
198
+ expect((_savedVisState$layers2 = savedVisState.layers) === null || _savedVisState$layers2 === void 0 ? void 0 : _savedVisState$layers2[0].config.columns.lat).toBe('lat');
199
+ expect((_savedVisState$layers3 = savedVisState.layers) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].config.textLabel) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].field) === null || _savedVisState$layers3 === void 0 ? void 0 : _savedVisState$layers3.name).toBe('area');
200
+ expect(JSON.stringify(savedVisState.filters)).toContain('area');
201
+ expect(JSON.stringify(savedVisState.filters)).not.toContain('region');
202
+ expect((_savedVisState$charts = savedVisState.charts) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts[0].xAxis) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts.field) === null || _savedVisState$charts === void 0 ? void 0 : _savedVisState$charts.name).toBe('area');
203
+ });
204
+ test('delete drops references and refuses the last column', function () {
205
+ var _state$charts$0$yAxis2;
206
+ var state = withCities();
207
+ state.datasets.cities.hiddenColumns = ['region', 'pop'];
208
+ state = reduceVisState(state, _actions.VisStateActions.deleteTableColumn('cities', 'pop'));
209
+ expect(state.datasets.cities.fields.map(function (field) {
210
+ return field.name;
211
+ })).toEqual(['lat', 'lng', 'region']);
212
+ expect(state.layers).toHaveLength(1);
213
+ expect(state.filters).toHaveLength(1);
214
+ expect((_state$charts$0$yAxis2 = state.charts[0].yAxis) === null || _state$charts$0$yAxis2 === void 0 ? void 0 : _state$charts$0$yAxis2.field).toBeNull();
215
+ expect(state.datasets.cities.hiddenColumns).toEqual(['region']);
216
+ state = reduceVisState(state, _actions.VisStateActions.deleteTableColumn('cities', 'lat'));
217
+ expect(state.layers).toHaveLength(0);
218
+ expect(state.datasets.cities.fields.map(function (field) {
219
+ return field.name;
220
+ })).toEqual(['lng', 'region']);
221
+ var only = new _table.KeplerTable({
222
+ info: {
223
+ id: 'only',
224
+ label: 'only',
225
+ type: 'local'
226
+ },
227
+ color: [0, 0, 0]
228
+ });
229
+ only.updateSchema({
230
+ fields: [{
231
+ name: 'region',
232
+ type: _constants.ALL_FIELD_TYPES.string
233
+ }],
234
+ rows: [['west']]
235
+ });
236
+ var single = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
237
+ datasets: {
238
+ only: only
239
+ }
240
+ });
241
+ var kept = reduceVisState(single, _actions.VisStateActions.deleteTableColumn('only', 'region'));
242
+ expect(kept.datasets.only.fields.map(function (field) {
243
+ return field.name;
244
+ })).toEqual(['region']);
245
+ });
246
+ test('deleting an unrelated column preserves an inverted numeric histogram', function () {
247
+ var table = makeTable('data', {
248
+ fields: [{
249
+ name: 'unused',
250
+ type: _constants.ALL_FIELD_TYPES.string
251
+ }, {
252
+ name: 'value',
253
+ type: _constants.ALL_FIELD_TYPES.integer
254
+ }, {
255
+ name: 'category',
256
+ type: _constants.ALL_FIELD_TYPES.string
257
+ }],
258
+ rows: [['x', 1, 'A'], ['x', 2, 'B'], ['x', 3, 'A']]
259
+ });
260
+ var state = withFilter(withTables(table), 'data', 'category');
261
+ state = reduceVisState(state, _actions.VisStateActions.setFilter(0, 'value', ['A']));
262
+ state = withFilter(state, 'data', 'value');
263
+ state = reduceVisState(state, _actions.VisStateActions.setFilter(1, 'value', [2, 2]));
264
+ state = reduceVisState(state, _actions.VisStateActions.setFilter(1, 'inverted', true));
265
+ var histogramCount = function histogramCount() {
266
+ var _bins;
267
+ return (_bins = state.filters[1].bins) === null || _bins === void 0 || (_bins = _bins.data) === null || _bins === void 0 ? void 0 : _bins.reduce(function (sum, bin) {
268
+ return sum + bin.count;
269
+ }, 0);
270
+ };
271
+ expect(histogramCount()).toBe(2);
272
+ state = reduceVisState(state, _actions.VisStateActions.deleteTableColumn('data', 'unused'));
273
+ expect(histogramCount()).toBe(2);
274
+ expect(state.datasets.data.filteredIndex).toEqual([0, 2]);
275
+ expect(state.datasets.data.fields.map(function (field) {
276
+ return field.type;
277
+ })).toEqual([_constants.ALL_FIELD_TYPES.integer, _constants.ALL_FIELD_TYPES.string]);
278
+ });
279
+ test('type change converts values and reconciles incompatible references', function () {
280
+ var _state$layers$find, _state$layers$find2, _state$charts$0$yAxis3;
281
+ var state = withCities();
282
+ state = reduceVisState(state, _actions.VisStateActions.addLayer({
283
+ id: 'cities-heatmap',
284
+ type: 'heatmap',
285
+ config: {
286
+ dataId: 'cities',
287
+ label: 'cities heatmap',
288
+ color: [255, 0, 0],
289
+ columns: {
290
+ lat: 'lat',
291
+ lng: 'lng'
292
+ },
293
+ weightField: {
294
+ name: 'pop',
295
+ type: 'integer'
296
+ },
297
+ textLabel: [{
298
+ field: {
299
+ name: 'pop',
300
+ type: 'integer'
301
+ }
302
+ }]
303
+ }
304
+ }));
305
+ state = changeType(state, 'cities', 'pop', _constants.ALL_FIELD_TYPES.string);
306
+ var pop = state.datasets.cities.fields.find(function (field) {
307
+ return field.name === 'pop';
308
+ });
309
+ expect(pop).toMatchObject({
310
+ type: _constants.ALL_FIELD_TYPES.string,
311
+ analyzerType: 'STRING',
312
+ format: ''
313
+ });
314
+ expect(state.datasets.cities.dataContainer.rowAsArray(0)[3]).toBe('10');
315
+ expect(state.layers).toHaveLength(2);
316
+ expect(((_state$layers$find = state.layers.find(function (layer) {
317
+ return layer.id === 'cities-heatmap';
318
+ })) === null || _state$layers$find === void 0 ? void 0 : _state$layers$find.config).weightField).toBeNull();
319
+ expect((_state$layers$find2 = state.layers.find(function (layer) {
320
+ return layer.id === 'cities-heatmap';
321
+ })) === null || _state$layers$find2 === void 0 ? void 0 : _state$layers$find2.config.textLabel[0].field).toMatchObject({
322
+ name: 'pop',
323
+ type: 'string'
324
+ });
325
+ expect((_state$charts$0$yAxis3 = state.charts[0].yAxis) === null || _state$charts$0$yAxis3 === void 0 ? void 0 : _state$charts$0$yAxis3.field).toEqual({
326
+ name: 'pop',
327
+ type: 'string'
328
+ });
329
+ });
330
+ test('type change preserves polygon filters targeting the dataset', function () {
331
+ var _state$datasets$citie, _state$datasets$citie2;
332
+ var state = withCities();
333
+ var polygonFilter = {
334
+ id: 'polygon-filter',
335
+ dataId: ['cities'],
336
+ enabled: true,
337
+ fixedDomain: true,
338
+ view: 'side',
339
+ isAnimating: false,
340
+ speed: 1,
341
+ name: [],
342
+ type: _constants.FILTER_TYPES.polygon,
343
+ fieldIdx: [],
344
+ domain: null,
345
+ value: {
346
+ type: 'Feature',
347
+ id: 'polygon-selection',
348
+ properties: {
349
+ filterId: 'polygon-filter'
350
+ },
351
+ geometry: {
352
+ type: 'Polygon',
353
+ coordinates: [[[-123, 37], [-122, 37], [-122, 38], [-123, 37]]]
354
+ }
355
+ },
356
+ plotType: {
357
+ type: _constants.PLOT_TYPES.histogram
358
+ },
359
+ yAxis: null,
360
+ layerId: ['cities-layer'],
361
+ gpu: false
362
+ };
363
+ state = _objectSpread(_objectSpread({}, state), {}, {
364
+ filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [polygonFilter])
365
+ });
366
+ state = changeType(state, 'cities', 'pop', _constants.ALL_FIELD_TYPES.string);
367
+ expect(state.filters.find(function (filter) {
368
+ return filter.id === polygonFilter.id;
369
+ })).toBe(polygonFilter);
370
+ state = reduceVisState(state, _actions.VisStateActions.deleteTableColumn('cities', 'lat'));
371
+ expect(state.layers).toHaveLength(0);
372
+ expect(state.filters.find(function (filter) {
373
+ return filter.id === polygonFilter.id;
374
+ })).toBeUndefined();
375
+ expect((_state$datasets$citie = state.datasets.cities.filterRecord) === null || _state$datasets$citie === void 0 ? void 0 : _state$datasets$citie.gpu).not.toContainEqual(expect.objectContaining({
376
+ id: polygonFilter.id
377
+ }));
378
+ expect((_state$datasets$citie2 = state.datasets.cities.filterRecord) === null || _state$datasets$citie2 === void 0 ? void 0 : _state$datasets$citie2.cpu).not.toContainEqual(expect.objectContaining({
379
+ id: polygonFilter.id
380
+ }));
381
+ });
382
+ test('type change preserves an existing sort on another column', function () {
383
+ var state = withCities();
384
+ state = reduceVisState(state, _actions.VisStateActions.sortTableColumn('cities', 'region', _constants.SORT_ORDER.ASCENDING));
385
+ expect(state.datasets.cities.sortColumn).toEqual({
386
+ region: _constants.SORT_ORDER.ASCENDING
387
+ });
388
+ expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
389
+ state = changeType(state, 'cities', 'pop', _constants.ALL_FIELD_TYPES.string);
390
+ expect(state.datasets.cities.sortColumn).toEqual({
391
+ region: _constants.SORT_ORDER.ASCENDING
392
+ });
393
+ expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
394
+ });
395
+ test('type change clears timeline state when a time filter becomes non-time', function () {
396
+ var events = makeTable('events', {
397
+ fields: [{
398
+ name: 'start',
399
+ type: _constants.ALL_FIELD_TYPES.timestamp,
400
+ analyzerType: 'DATETIME'
401
+ }, {
402
+ name: 'amount',
403
+ type: _constants.ALL_FIELD_TYPES.integer
404
+ }],
405
+ rows: [['2024-01-01T00:00:00Z', 10], ['2024-01-02T00:00:00Z', 20]]
406
+ });
407
+ var state = withFilter(withTables(events), 'events', 'start');
408
+ state = _objectSpread(_objectSpread({}, state), {}, {
409
+ filters: [_objectSpread(_objectSpread({}, state.filters[0]), {}, {
410
+ syncedWithLayerTimeline: true,
411
+ syncTimelineMode: 1,
412
+ isAnimating: true,
413
+ animationWindow: _constants.ANIMATION_WINDOW.interval,
414
+ timeBins: {
415
+ events: {
416
+ day: []
417
+ }
418
+ },
419
+ lineChart: {
420
+ series: [],
421
+ yDomain: [0, 1],
422
+ xDomain: [0, 1],
423
+ aggregation: 'sum',
424
+ interval: 'day',
425
+ yAxis: 'amount'
426
+ },
427
+ timezone: 'UTC',
428
+ invertTrendColor: true,
429
+ showTimeDisplay: true,
430
+ yAxis: state.datasets.events.fields[1],
431
+ plotType: {
432
+ type: _constants.PLOT_TYPES.lineChart,
433
+ interval: 'day',
434
+ aggregation: 'sum'
435
+ }
436
+ })]
437
+ });
438
+ state = changeType(state, 'events', 'start', _constants.ALL_FIELD_TYPES.string);
439
+ var filter = state.filters[0];
440
+ expect(filter.type).toBe('multiSelect');
441
+ expect(filter).not.toHaveProperty('syncedWithLayerTimeline');
442
+ expect(filter).not.toHaveProperty('syncTimelineMode');
443
+ expect(filter).not.toHaveProperty('timeBins');
444
+ expect(filter).not.toHaveProperty('lineChart');
445
+ expect(filter).not.toHaveProperty('timezone');
446
+ expect(filter).not.toHaveProperty('invertTrendColor');
447
+ expect(filter).not.toHaveProperty('showTimeDisplay');
448
+ expect(filter).toMatchObject({
449
+ fixedDomain: false,
450
+ isAnimating: false,
451
+ animationWindow: _constants.ANIMATION_WINDOW.free,
452
+ yAxis: null,
453
+ plotType: {
454
+ type: _constants.PLOT_TYPES.histogram
455
+ }
456
+ });
457
+ });
458
+ test('type change detaches an incompatible synced filter member and refilters its dataset', function () {
459
+ var _state$datasets$secon;
460
+ var primary = makeTable('primary', {
461
+ fields: [{
462
+ name: 'value',
463
+ type: _constants.ALL_FIELD_TYPES.integer
464
+ }],
465
+ rows: [[1], [2]]
466
+ });
467
+ var secondary = makeTable('secondary', {
468
+ fields: [{
469
+ name: 'value',
470
+ type: _constants.ALL_FIELD_TYPES.integer
471
+ }],
472
+ rows: [[1], [3]]
473
+ });
474
+ var state = withSyncedFilter(primary, secondary, 'value');
475
+ expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
476
+ expect((_state$datasets$secon = state.datasets.secondary.filterRecord) === null || _state$datasets$secon === void 0 ? void 0 : _state$datasets$secon.gpu).toHaveLength(1);
477
+ state = changeType(state, 'secondary', 'value', _constants.ALL_FIELD_TYPES.string);
478
+ expect(state.filters[0].dataId).toEqual(['primary']);
479
+ expect(state.filters[0].name).toEqual(['value']);
480
+ expect(state.filters[0].type).toBe('range');
481
+ expect(state.datasets.secondary.filterRecord).toMatchObject({
482
+ dynamicDomain: [],
483
+ fixedDomain: [],
484
+ cpu: [],
485
+ gpu: []
486
+ });
487
+ });
488
+ test('changing a synced secondary dataset does not reconcile the primary plot axis', function () {
489
+ var makeEvents = function makeEvents(id) {
490
+ return makeTable(id, {
491
+ fields: [{
492
+ name: 'start',
493
+ type: _constants.ALL_FIELD_TYPES.timestamp,
494
+ analyzerType: 'TIME',
495
+ format: 'x'
496
+ }, {
497
+ name: 'amount',
498
+ type: _constants.ALL_FIELD_TYPES.integer
499
+ }],
500
+ rows: [[1700000000, 10], [1700000020, 20]]
501
+ });
502
+ };
503
+ var primary = makeEvents('primary');
504
+ var secondary = makeEvents('secondary');
505
+ var state = withSyncedFilter(primary, secondary, 'start');
506
+ state = reduceVisState(state, _actions.VisStateActions.setFilterPlot(0, {
507
+ yAxis: state.datasets.primary.fields[1]
508
+ }));
509
+ state = changeType(state, 'secondary', 'amount', _constants.ALL_FIELD_TYPES.string);
510
+ expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
511
+ expect(state.filters[0].yAxis).toMatchObject({
512
+ name: 'amount',
513
+ type: 'integer'
514
+ });
515
+ expect(state.filters[0].plotType.type).toBe('lineChart');
516
+ });
517
+ test('detaching a synced primary dataset rebuilds the plot for the new primary', function () {
518
+ var primary = makeTable('primary', {
519
+ fields: [{
520
+ name: 'start',
521
+ type: _constants.ALL_FIELD_TYPES.timestamp,
522
+ analyzerType: 'TIME',
523
+ format: 'x'
524
+ }, {
525
+ name: 'amount',
526
+ type: _constants.ALL_FIELD_TYPES.integer
527
+ }],
528
+ rows: [[1700000000, 10], [1700000020, 20]]
529
+ });
530
+ var secondary = makeTable('secondary', {
531
+ fields: [{
532
+ name: 'start',
533
+ type: _constants.ALL_FIELD_TYPES.timestamp,
534
+ analyzerType: 'TIME',
535
+ format: 'x'
536
+ }],
537
+ rows: [[1700000040], [1700000060]]
538
+ });
539
+ var state = withSyncedFilter(primary, secondary, 'start');
540
+ state = reduceVisState(state, _actions.VisStateActions.setFilterPlot(0, {
541
+ yAxis: state.datasets.primary.fields[1]
542
+ }));
543
+ expect(state.filters[0].lineChart).toBeDefined();
544
+ state = changeType(state, 'primary', 'start', _constants.ALL_FIELD_TYPES.string);
545
+ expect(state.filters[0].dataId).toEqual(['secondary']);
546
+ expect(state.filters[0].name).toEqual(['start']);
547
+ expect(state.filters[0].type).toBe('timeRange');
548
+ expect(state.filters[0].yAxis).toBeNull();
549
+ expect(state.filters[0].plotType.type).toBe('histogram');
550
+ expect(state.filters[0].lineChart).toBeUndefined();
551
+ });
552
+ test('grouped timeline series survive a rename and rebuild when group values collapse', function () {
553
+ var _state$filters$0$line, _state$filters$0$line2, _state$filters$0$line3;
554
+ var events = makeTable('events', {
555
+ fields: [{
556
+ name: 'start',
557
+ type: _constants.ALL_FIELD_TYPES.timestamp,
558
+ analyzerType: 'TIME',
559
+ format: 'x'
560
+ }, {
561
+ name: 'group',
562
+ type: _constants.ALL_FIELD_TYPES.string
563
+ }, {
564
+ name: 'amount',
565
+ type: _constants.ALL_FIELD_TYPES.integer
566
+ }],
567
+ rows: [[1700000000, '01', 10], [1700000020, '1', 20]]
568
+ });
569
+ var state = withFilter(withTables(events), 'events', 'start');
570
+ state = reduceVisState(state, _actions.VisStateActions.setFilterPlot(0, {
571
+ yAxis: state.datasets.events.fields[2]
572
+ }));
573
+ state = reduceVisState(state, _actions.VisStateActions.setFilterPlot(0, {
574
+ plotType: {
575
+ groupBy: {
576
+ fieldName: 'group',
577
+ numGroups: 'ALL',
578
+ groupOthers: false
579
+ }
580
+ }
581
+ }));
582
+ var seriesBefore = (_state$filters$0$line = state.filters[0].lineChart) === null || _state$filters$0$line === void 0 ? void 0 : _state$filters$0$line.series;
583
+ expect(new Set(seriesBefore.names)).toEqual(new Set(['01', '1']));
584
+ state = reduceVisState(state, _actions.VisStateActions.renameTableColumn('events', 'group', 'category'));
585
+ expect((_state$filters$0$line2 = state.filters[0].lineChart) === null || _state$filters$0$line2 === void 0 ? void 0 : _state$filters$0$line2.series).toEqual(seriesBefore);
586
+ expect(state.filters[0].plotType.groupBy.fieldName).toBe('category');
587
+ expect(state.datasets.events.fields[1].type).toBe(_constants.ALL_FIELD_TYPES.string);
588
+ state = changeType(state, 'events', 'category', _constants.ALL_FIELD_TYPES.integer);
589
+ var namesAfter = ((_state$filters$0$line3 = state.filters[0].lineChart) === null || _state$filters$0$line3 === void 0 ? void 0 : _state$filters$0$line3.series).names;
590
+ expect(new Set(namesAfter)).toEqual(new Set(['1']));
591
+ });
592
+ test('type change clears an interval end field that is no longer a timestamp', function () {
593
+ var _state$filters$0$yAxi, _timeFilter$timeBins, _timeFilter$timeBins2, _state$charts$0$xAxis2;
594
+ var events = makeTable('events', {
595
+ fields: [{
596
+ name: 'start',
597
+ type: _constants.ALL_FIELD_TYPES.timestamp,
598
+ analyzerType: 'TIME',
599
+ format: 'x'
600
+ }, {
601
+ name: 'end',
602
+ type: _constants.ALL_FIELD_TYPES.timestamp,
603
+ analyzerType: 'TIME',
604
+ format: 'x'
605
+ }, {
606
+ name: 'value',
607
+ type: _constants.ALL_FIELD_TYPES.integer
608
+ }],
609
+ rows: [[1700000000, 1700086400, 10], [1700000020, 1700172800, 20]]
610
+ });
611
+ var state = withTables(events);
612
+ state = reduceVisState(state, _actions.VisStateActions.addChart({
613
+ id: 'events-chart',
614
+ title: 'Events',
615
+ type: 'barChart',
616
+ dataId: 'events',
617
+ applyFilters: true,
618
+ display: {},
619
+ chartDisplay: {},
620
+ xAxis: {
621
+ field: {
622
+ name: 'end',
623
+ type: 'timestamp'
624
+ },
625
+ aggregation: 'timeBin',
626
+ interval: 'day',
627
+ title: 'end'
628
+ },
629
+ yAxis: {
630
+ field: {
631
+ name: 'value',
632
+ type: 'integer'
633
+ },
634
+ aggregation: 'sum',
635
+ title: 'value'
636
+ }
637
+ }));
638
+ state = withFilter(state, 'events', 'start');
639
+ state = reduceVisState(state, _actions.VisStateActions.setFilter(0, 'endName', 'end', 0));
640
+ state = reduceVisState(state, _actions.VisStateActions.setFilterPlot(0, {
641
+ yAxis: state.datasets.events.fields[2]
642
+ }));
643
+ expect(state.filters[0].endName).toEqual(['end']);
644
+ expect((_state$filters$0$yAxi = state.filters[0].yAxis) === null || _state$filters$0$yAxi === void 0 ? void 0 : _state$filters$0$yAxi.name).toBe('value');
645
+ state = changeType(state, 'events', 'value', _constants.ALL_FIELD_TYPES.string);
646
+ expect(state.filters[0].yAxis).toBeNull();
647
+ expect(state.filters[0].plotType.type).toBe('histogram');
648
+ expect(state.filters[0].endName).toEqual(['end']);
649
+ expect(state.charts[0].yAxis).toMatchObject({
650
+ field: {
651
+ name: 'value',
652
+ type: 'string'
653
+ },
654
+ aggregation: 'sum'
655
+ });
656
+ var timeFilter = state.filters[0];
657
+ var interval = timeFilter.plotType.interval;
658
+ var intervalBins = (_timeFilter$timeBins = timeFilter.timeBins) === null || _timeFilter$timeBins === void 0 || (_timeFilter$timeBins = _timeFilter$timeBins.events) === null || _timeFilter$timeBins === void 0 ? void 0 : _timeFilter$timeBins[interval];
659
+ expect(intervalBins === null || intervalBins === void 0 ? void 0 : intervalBins.reduce(function (sum, bin) {
660
+ return sum + bin.count;
661
+ }, 0)).toBeGreaterThan(2);
662
+ state = changeType(state, 'events', 'end', _constants.ALL_FIELD_TYPES.string);
663
+ expect(state.filters[0].type).toBe('timeRange');
664
+ expect(state.filters[0].endName).toBeUndefined();
665
+ expect(state.filters[0].endFieldIdx).toBeUndefined();
666
+ timeFilter = state.filters[0];
667
+ var bins = (_timeFilter$timeBins2 = timeFilter.timeBins) === null || _timeFilter$timeBins2 === void 0 || (_timeFilter$timeBins2 = _timeFilter$timeBins2.events) === null || _timeFilter$timeBins2 === void 0 ? void 0 : _timeFilter$timeBins2[interval];
668
+ expect(bins === null || bins === void 0 ? void 0 : bins.reduce(function (sum, bin) {
669
+ return sum + bin.count;
670
+ }, 0)).toBe(2);
671
+ expect(state.charts[0].xAxis).toMatchObject({
672
+ field: {
673
+ name: 'end',
674
+ type: 'string'
675
+ },
676
+ aggregation: 'uniqueBin'
677
+ });
678
+ expect((_state$charts$0$xAxis2 = state.charts[0].xAxis) === null || _state$charts$0$xAxis2 === void 0 ? void 0 : _state$charts$0$xAxis2.interval).toBeUndefined();
679
+ });
680
+ test('invalid type change is atomic and schedules a precise error', function () {
681
+ var _next$datasets$cities;
682
+ var state = withCities();
683
+ var next = changeType(state, 'cities', 'region', _constants.ALL_FIELD_TYPES.integer);
684
+ expect(next.datasets.cities).toBe(state.datasets.cities);
685
+ expect((_next$datasets$cities = next.datasets.cities.fields.find(function (field) {
686
+ return field.name === 'region';
687
+ })) === null || _next$datasets$cities === void 0 ? void 0 : _next$datasets$cities.type).toBe(_constants.ALL_FIELD_TYPES.string);
688
+ expect(next.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
689
+ var tasks = (0, _tasks.drainTasksForTesting)();
690
+ expect(tasks).toHaveLength(1);
691
+ var notification = (0, _tasks.succeedTaskInTest)(tasks[0], undefined);
692
+ expect(notification.payload.message).toContain('Cannot change “region” to integer: row 1 value “west” is not a safe integer');
693
+ expect(notification.payload.message).toContain('No values were changed.');
694
+ });
695
+ test('late column statistics cannot overwrite a changed column', function () {
696
+ var _state$datasets$citie3;
697
+ var state = withCities();
698
+ state = reduceVisState(state, _actions.VisStateActions.loadColumnStats('cities', 'pop'));
699
+ var requestRevision = state.datasets.cities.dataRevision;
700
+ var _drainTasksForTesting = (0, _tasks.drainTasksForTesting)(),
701
+ _drainTasksForTesting2 = (0, _slicedToArray2["default"])(_drainTasksForTesting, 1),
702
+ task = _drainTasksForTesting2[0];
703
+ var result = {
704
+ type: 'numeric',
705
+ mean: 25
706
+ };
707
+ var staleSuccess = (0, _tasks.succeedTaskInTest)(task, {
708
+ result: result,
709
+ filterProps: {
710
+ type: _constants.FILTER_TYPES.range
711
+ }
712
+ });
713
+ expect(staleSuccess).toMatchObject({
714
+ fieldType: _constants.ALL_FIELD_TYPES.integer
715
+ });
716
+ state = changeType(state, 'cities', 'pop', _constants.ALL_FIELD_TYPES.string);
717
+ expect(state.datasets.cities.dataRevision).toBe(requestRevision + 1);
718
+ var changedState = state;
719
+ state = reduceVisState(state, staleSuccess);
720
+ expect(state).toBe(changedState);
721
+ var changedField = state.datasets.cities.fields.find(function (field) {
722
+ return field.name === 'pop';
723
+ });
724
+ expect(changedField).toMatchObject({
725
+ type: _constants.ALL_FIELD_TYPES.string
726
+ });
727
+ expect(changedField).not.toHaveProperty('isLoadingStats');
728
+ expect((_state$datasets$citie3 = state.datasets.cities.fields.find(function (field) {
729
+ return field.name === 'pop';
730
+ })) === null || _state$datasets$citie3 === void 0 || (_state$datasets$citie3 = _state$datasets$citie3.filterProps) === null || _state$datasets$citie3 === void 0 ? void 0 : _state$datasets$citie3.columnStats).not.toBe(result);
731
+ });
732
+ test.each(['refresh', 'append'])('pending statistics complete after a normal %s', function (update) {
733
+ var state = withCities();
734
+ var types = state.datasets.cities.fields.map(function (field) {
735
+ return field.type;
736
+ });
737
+ state = reduceVisState(state, _actions.VisStateActions.loadColumnStats('cities', 'pop'));
738
+ var _drainTasksForTesting3 = (0, _tasks.drainTasksForTesting)(),
739
+ _drainTasksForTesting4 = (0, _slicedToArray2["default"])(_drainTasksForTesting3, 1),
740
+ task = _drainTasksForTesting4[0];
741
+ state = reduceVisState(state, _actions.VisStateActions.pinTableColumn('cities', 'region'));
742
+ var row = [41, -75, 'north', 50];
743
+ state = reduceVisState(state, update === 'refresh' ? _actions.VisStateActions.refreshDatasetSuccess('cities', {
744
+ notModified: false,
745
+ data: {
746
+ fields: state.datasets.cities.fields,
747
+ rows: [row]
748
+ }
749
+ }) : _actions.VisStateActions.addToDataset('cities', [row]));
750
+ var result = {
751
+ type: 'numeric',
752
+ mean: 25
753
+ };
754
+ var successState = reduceVisState(state, (0, _tasks.succeedTaskInTest)(task, {
755
+ result: result,
756
+ filterProps: {
757
+ type: _constants.FILTER_TYPES.range
758
+ }
759
+ }));
760
+ var logError = jest.spyOn(console, 'error').mockImplementation(function () {
761
+ return undefined;
762
+ });
763
+ var errorState = reduceVisState(state, (0, _tasks.errorTaskInTest)(task, new Error('stats failed')));
764
+ logError.mockRestore();
765
+ expect(state.datasets.cities.fields.map(function (field) {
766
+ return field.type;
767
+ })).toEqual(types);
768
+ expect(successState.datasets.cities.fields[3]).toMatchObject({
769
+ isLoadingStats: false,
770
+ filterProps: {
771
+ columnStats: result
772
+ }
773
+ });
774
+ expect(errorState.datasets.cities.fields[3].isLoadingStats).toBe(false);
775
+ expect(state.datasets.cities.dataContainer.rowAsArray(update === 'refresh' ? 0 : 2)).toEqual(row);
776
+ });
777
+ test('duplicate rename and non-tabular datasets are ignored', function () {
778
+ var state = withCities();
779
+ var duplicate = reduceVisState(state, _actions.VisStateActions.renameTableColumn('cities', 'region', 'pop'));
780
+ expect(duplicate).toBe(state);
781
+ var tiles = new _table.KeplerTable({
782
+ info: {
783
+ id: 'tiles',
784
+ label: 'tiles',
785
+ type: 'vector-tile'
786
+ },
787
+ color: [0, 0, 0]
788
+ });
789
+ tiles.updateSchema({
790
+ fields: [{
791
+ name: 'region',
792
+ type: _constants.ALL_FIELD_TYPES.string
793
+ }, {
794
+ name: 'pop',
795
+ type: _constants.ALL_FIELD_TYPES.integer
796
+ }],
797
+ rows: [['west', 1]]
798
+ });
799
+ var tiled = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
800
+ datasets: {
801
+ tiles: tiles
802
+ }
803
+ });
804
+ var unchanged = reduceVisState(tiled, _actions.VisStateActions.renameTableColumn('tiles', 'region', 'area'));
805
+ expect(unchanged).toBe(tiled);
806
+ expect(reduceVisState(tiled, _actions.VisStateActions.deleteTableColumn('tiles', 'pop'))).toBe(tiled);
807
+ expect(changeType(tiled, 'tiles', 'pop', _constants.ALL_FIELD_TYPES.string)).toBe(tiled);
808
+ });
809
+ test('externally hosted datasets ignore rename and delete', function () {
810
+ var remote = new _table.KeplerTable({
811
+ info: {
812
+ id: 'remote',
813
+ label: 'remote',
814
+ type: 'externally-hosted'
815
+ },
816
+ color: [0, 0, 0]
817
+ });
818
+ remote.updateSchema({
819
+ fields: [{
820
+ name: 'region',
821
+ type: _constants.ALL_FIELD_TYPES.string,
822
+ displayName: 'Region'
823
+ }, {
824
+ name: 'pop',
825
+ type: _constants.ALL_FIELD_TYPES.integer
826
+ }],
827
+ rows: [['west', 1]]
828
+ });
829
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
830
+ datasets: {
831
+ remote: remote
832
+ }
833
+ });
834
+ expect(reduceVisState(state, _actions.VisStateActions.renameTableColumn('remote', 'region', 'area'))).toBe(state);
835
+ expect(reduceVisState(state, _actions.VisStateActions.deleteTableColumn('remote', 'pop'))).toBe(state);
836
+ expect(changeType(state, 'remote', 'pop', _constants.ALL_FIELD_TYPES.string)).toBe(state);
837
+ expect(state.datasets.remote.fields[0].displayName).toBe('Region');
838
+ });
839
+ });
840
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3RhYmxlIiwiX3NjaGVtYXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3Rhc2tzIiwiX3Zpc1N0YXRlIiwiX3Zpc1N0YXRlVXBkYXRlcnMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInJlZHVjZVZpc1N0YXRlIiwidmlzU3RhdGVSZWR1Y2VyIiwibWFrZVRhYmxlIiwiaWQiLCJkYXRhIiwidGFibGUiLCJLZXBsZXJUYWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIndpdGhUYWJsZXMiLCJfbGVuIiwidGFibGVzIiwiQXJyYXkiLCJfa2V5IiwiSU5JVElBTF9WSVNfU1RBVEUiLCJkYXRhc2V0cyIsImZyb21FbnRyaWVzIiwibWFwIiwid2l0aEZpbHRlciIsInN0YXRlIiwiZGF0YUlkIiwiY29sdW1uIiwiVmlzU3RhdGVBY3Rpb25zIiwiY3JlYXRlT3JVcGRhdGVGaWx0ZXIiLCJ1bmRlZmluZWQiLCJ3aXRoU3luY2VkRmlsdGVyIiwicHJpbWFyeSIsInNlY29uZGFyeSIsInNldEZpbHRlciIsImNoYW5nZVR5cGUiLCJjaGFuZ2VUYWJsZUNvbHVtblR5cGUiLCJtYWtlQ2l0aWVzIiwiZmllbGRzIiwibmFtZSIsIkFMTF9GSUVMRF9UWVBFUyIsInJlYWwiLCJzdHJpbmciLCJpbnRlZ2VyIiwicm93cyIsIndpdGhDaXRpZXMiLCJjaXRpZXMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsInRvb2x0aXAiLCJjb25maWciLCJmaWVsZHNUb1Nob3ciLCJmb3JtYXQiLCJhZGRMYXllciIsImNvbHVtbnMiLCJsYXQiLCJsbmciLCJjb2xvckZpZWxkIiwidGV4dExhYmVsIiwiZmllbGQiLCJhZGRDaGFydCIsInRpdGxlIiwiYXBwbHlGaWx0ZXJzIiwiZGlzcGxheSIsImNoYXJ0RGlzcGxheSIsInhBeGlzIiwiYWdncmVnYXRpb24iLCJ5QXhpcyIsImNyb3NzRmlsdGVyIiwiZW5hYmxlZCIsImZpbHRlcklkIiwiZmllbGROYW1lcyIsInZhbHVlIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwiZHJhaW5UYXNrc0ZvclRlc3RpbmciLCJ0ZXN0IiwiX2xheWVyJGNvbmZpZyRjb2xvckZpIiwiX2xheWVyJGNvbmZpZyR0ZXh0TGFiIiwiX3N0YXRlJGNoYXJ0cyQwJHhBeGlzIiwiX3N0YXRlJGNoYXJ0cyQwJHlBeGlzIiwiX3N0YXRlJGNoYXJ0cyQwJGNyb3NzIiwiX3NhdmVkVmlzU3RhdGUkbGF5ZXJzIiwiX3NhdmVkVmlzU3RhdGUkbGF5ZXJzMiIsIl9zYXZlZFZpc1N0YXRlJGxheWVyczMiLCJfc2F2ZWRWaXNTdGF0ZSRjaGFydHMiLCJoaWRkZW5Db2x1bW5zIiwiZXhwZWN0IiwibGF5ZXJzIiwidG9IYXZlTGVuZ3RoIiwiZmlsdGVycyIsInRvRXF1YWwiLCJyZW5hbWVUYWJsZUNvbHVtbiIsInJlZ2lvbiIsImZpbmQiLCJ0b0JlIiwiZGlzcGxheU5hbWUiLCJkYXRhQ29udGFpbmVyIiwicm93QXNBcnJheSIsImxheWVyIiwiY2hhcnRzIiwic2F2ZWQiLCJTY2hlbWFNYW5hZ2VyIiwic2F2ZSIsInZpc1N0YXRlIiwibWFwU3RhdGUiLCJtYXBTdHlsZSIsInVpU3RhdGUiLCJzYXZlZFZpc1N0YXRlIiwidmlzdWFsQ2hhbm5lbHMiLCJKU09OIiwic3RyaW5naWZ5IiwidG9Db250YWluIiwibm90IiwiX3N0YXRlJGNoYXJ0cyQwJHlBeGlzMiIsImRlbGV0ZVRhYmxlQ29sdW1uIiwidG9CZU51bGwiLCJvbmx5Iiwic2luZ2xlIiwia2VwdCIsImhpc3RvZ3JhbUNvdW50IiwiX2JpbnMiLCJiaW5zIiwicmVkdWNlIiwic3VtIiwiYmluIiwiY291bnQiLCJmaWx0ZXJlZEluZGV4IiwiX3N0YXRlJGxheWVycyRmaW5kIiwiX3N0YXRlJGxheWVycyRmaW5kMiIsIl9zdGF0ZSRjaGFydHMkMCR5QXhpczMiLCJ3ZWlnaHRGaWVsZCIsInBvcCIsInRvTWF0Y2hPYmplY3QiLCJhbmFseXplclR5cGUiLCJfc3RhdGUkZGF0YXNldHMkY2l0aWUiLCJfc3RhdGUkZGF0YXNldHMkY2l0aWUyIiwicG9seWdvbkZpbHRlciIsImZpeGVkRG9tYWluIiwidmlldyIsImlzQW5pbWF0aW5nIiwic3BlZWQiLCJGSUxURVJfVFlQRVMiLCJwb2x5Z29uIiwiZmllbGRJZHgiLCJkb21haW4iLCJwcm9wZXJ0aWVzIiwiZ2VvbWV0cnkiLCJjb29yZGluYXRlcyIsInBsb3RUeXBlIiwiUExPVF9UWVBFUyIsImhpc3RvZ3JhbSIsImxheWVySWQiLCJncHUiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwidG9CZVVuZGVmaW5lZCIsImZpbHRlclJlY29yZCIsInRvQ29udGFpbkVxdWFsIiwib2JqZWN0Q29udGFpbmluZyIsImNwdSIsInNvcnRUYWJsZUNvbHVtbiIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJzb3J0Q29sdW1uIiwic29ydE9yZGVyIiwiZXZlbnRzIiwidGltZXN0YW1wIiwic3luY2VkV2l0aExheWVyVGltZWxpbmUiLCJzeW5jVGltZWxpbmVNb2RlIiwiYW5pbWF0aW9uV2luZG93IiwiQU5JTUFUSU9OX1dJTkRPVyIsImludGVydmFsIiwidGltZUJpbnMiLCJkYXkiLCJsaW5lQ2hhcnQiLCJzZXJpZXMiLCJ5RG9tYWluIiwieERvbWFpbiIsInRpbWV6b25lIiwiaW52ZXJ0VHJlbmRDb2xvciIsInNob3dUaW1lRGlzcGxheSIsInRvSGF2ZVByb3BlcnR5IiwiZnJlZSIsIl9zdGF0ZSRkYXRhc2V0cyRzZWNvbiIsImR5bmFtaWNEb21haW4iLCJtYWtlRXZlbnRzIiwic2V0RmlsdGVyUGxvdCIsInRvQmVEZWZpbmVkIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lMiIsIl9zdGF0ZSRmaWx0ZXJzJDAkbGluZTMiLCJncm91cEJ5IiwiZmllbGROYW1lIiwibnVtR3JvdXBzIiwiZ3JvdXBPdGhlcnMiLCJzZXJpZXNCZWZvcmUiLCJTZXQiLCJuYW1lcyIsIm5hbWVzQWZ0ZXIiLCJfc3RhdGUkZmlsdGVycyQwJHlBeGkiLCJfdGltZUZpbHRlciR0aW1lQmlucyIsIl90aW1lRmlsdGVyJHRpbWVCaW5zMiIsIl9zdGF0ZSRjaGFydHMkMCR4QXhpczIiLCJlbmROYW1lIiwidGltZUZpbHRlciIsImludGVydmFsQmlucyIsInRvQmVHcmVhdGVyVGhhbiIsImVuZEZpZWxkSWR4IiwiX25leHQkZGF0YXNldHMkY2l0aWVzIiwibmV4dCIsInRhc2tzIiwibm90aWZpY2F0aW9uIiwic3VjY2VlZFRhc2tJblRlc3QiLCJwYXlsb2FkIiwibWVzc2FnZSIsIl9zdGF0ZSRkYXRhc2V0cyRjaXRpZTMiLCJsb2FkQ29sdW1uU3RhdHMiLCJyZXF1ZXN0UmV2aXNpb24iLCJkYXRhUmV2aXNpb24iLCJfZHJhaW5UYXNrc0ZvclRlc3RpbmciLCJfZHJhaW5UYXNrc0ZvclRlc3RpbmcyIiwiX3NsaWNlZFRvQXJyYXkyIiwidGFzayIsInJlc3VsdCIsIm1lYW4iLCJzdGFsZVN1Y2Nlc3MiLCJmaWx0ZXJQcm9wcyIsInJhbmdlIiwiZmllbGRUeXBlIiwiY2hhbmdlZFN0YXRlIiwiY2hhbmdlZEZpZWxkIiwiY29sdW1uU3RhdHMiLCJlYWNoIiwidXBkYXRlIiwidHlwZXMiLCJfZHJhaW5UYXNrc0ZvclRlc3RpbmczIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nNCIsInBpblRhYmxlQ29sdW1uIiwicm93IiwicmVmcmVzaERhdGFzZXRTdWNjZXNzIiwibm90TW9kaWZpZWQiLCJhZGRUb0RhdGFzZXQiLCJzdWNjZXNzU3RhdGUiLCJsb2dFcnJvciIsImplc3QiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJlcnJvclN0YXRlIiwiZXJyb3JUYXNrSW5UZXN0IiwiRXJyb3IiLCJtb2NrUmVzdG9yZSIsImlzTG9hZGluZ1N0YXRzIiwiZHVwbGljYXRlIiwidGlsZXMiLCJ0aWxlZCIsInVuY2hhbmdlZCIsInJlbW90ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2x1bW4tZWRpdC11cGRhdGVycy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7XG4gIEFMTF9GSUVMRF9UWVBFUyxcbiAgQU5JTUFUSU9OX1dJTkRPVyxcbiAgRklMVEVSX1RZUEVTLFxuICBQTE9UX1RZUEVTLFxuICBTT1JUX09SREVSXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgZXJyb3JUYXNrSW5UZXN0LCBzdWNjZWVkVGFza0luVGVzdH0gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG5pbXBvcnQgdHlwZSB7UG9seWdvbkZpbHRlciwgUmFuZ2VGaWx0ZXIsIFRpbWVSYW5nZUZpbHRlcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmltcG9ydCB2aXNTdGF0ZVJlZHVjZXIgZnJvbSAnLi92aXMtc3RhdGUnO1xuaW1wb3J0IHtJTklUSUFMX1ZJU19TVEFURX0gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuXG5jb25zdCByZWR1Y2VWaXNTdGF0ZSA9IHZpc1N0YXRlUmVkdWNlciBhcyAoc3RhdGU6IFZpc1N0YXRlLCBhY3Rpb246IHVua25vd24pID0+IFZpc1N0YXRlO1xuXG5mdW5jdGlvbiBtYWtlVGFibGUoaWQ6IHN0cmluZywgZGF0YTogUGFyYW1ldGVyczxLZXBsZXJUYWJsZVsndXBkYXRlU2NoZW1hJ10+WzBdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlLnVwZGF0ZVNjaGVtYShkYXRhKTtcbn1cblxuZnVuY3Rpb24gd2l0aFRhYmxlcyguLi50YWJsZXM6IEtlcGxlclRhYmxlW10pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgZGF0YXNldHM6IE9iamVjdC5mcm9tRW50cmllcyh0YWJsZXMubWFwKHRhYmxlID0+IFt0YWJsZS5pZCwgdGFibGVdKSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2l0aEZpbHRlcihzdGF0ZTogVmlzU3RhdGUsIGRhdGFJZDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuY3JlYXRlT3JVcGRhdGVGaWx0ZXIodW5kZWZpbmVkLCBkYXRhSWQsIGNvbHVtbikpO1xufVxuXG5mdW5jdGlvbiB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnk6IEtlcGxlclRhYmxlLCBzZWNvbmRhcnk6IEtlcGxlclRhYmxlLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKFxuICAgIHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhwcmltYXJ5LCBzZWNvbmRhcnkpLCBwcmltYXJ5LmlkLCBjb2x1bW4pLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgWydkYXRhSWQnLCAnbmFtZSddLCBbc2Vjb25kYXJ5LmlkLCBjb2x1bW5dLCAxKVxuICApO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VUeXBlKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBWaXNTdGF0ZSB7XG4gIHJldHVybiByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmNoYW5nZVRhYmxlQ29sdW1uVHlwZShkYXRhSWQsIGNvbHVtbiwgdHlwZSkpO1xufVxuXG5mdW5jdGlvbiBtYWtlQ2l0aWVzKCkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkOiAnY2l0aWVzJywgbGFiZWw6ICdjaXRpZXMnLCB0eXBlOiAnbG9jYWwnfSxcbiAgICBjb2xvcjogWzAsIDAsIDBdXG4gIH0pO1xuICB0YWJsZS51cGRhdGVTY2hlbWEoe1xuICAgIGZpZWxkczogW1xuICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICB7bmFtZTogJ2xuZycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgIF0sXG4gICAgcm93czogW1xuICAgICAgWzM3LjcsIC0xMjIuNCwgJ3dlc3QnLCAxMF0sXG4gICAgICBbNDAuNywgLTc0LjAsICdlYXN0JywgNDBdXG4gICAgXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlO1xufVxuXG5mdW5jdGlvbiB3aXRoQ2l0aWVzKCk6IFZpc1N0YXRlIHtcbiAgY29uc3QgY2l0aWVzID0gbWFrZUNpdGllcygpO1xuICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgIGRhdGFzZXRzOiB7Y2l0aWVzfSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgY2l0aWVzOiBbe25hbWU6ICdyZWdpb24nLCBmb3JtYXQ6IG51bGx9XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5hZGRMYXllcih7XG4gICAgICBpZDogJ2NpdGllcy1sYXllcicsXG4gICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGRhdGFJZDogJ2NpdGllcycsXG4gICAgICAgIGxhYmVsOiAnY2l0aWVzJyxcbiAgICAgICAgY29sb3I6IFsyNTUsIDAsIDBdLFxuICAgICAgICBjb2x1bW5zOiB7bGF0OiAnbGF0JywgbG5nOiAnbG5nJ30sXG4gICAgICAgIGNvbG9yRmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9LFxuICAgICAgICB0ZXh0TGFiZWw6IFt7ZmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9fV1cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5jcmVhdGVPclVwZGF0ZUZpbHRlcih1bmRlZmluZWQsICdjaXRpZXMnLCAncmVnaW9uJylcbiAgKTtcbiAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICBzdGF0ZSxcbiAgICBWaXNTdGF0ZUFjdGlvbnMuYWRkQ2hhcnQoe1xuICAgICAgaWQ6ICdyZWdpb24tY2hhcnQnLFxuICAgICAgdGl0bGU6ICdSZWdpb25zJyxcbiAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICBkYXRhSWQ6ICdjaXRpZXMnLFxuICAgICAgYXBwbHlGaWx0ZXJzOiB0cnVlLFxuICAgICAgZGlzcGxheToge30sXG4gICAgICBjaGFydERpc3BsYXk6IHt9LFxuICAgICAgeEF4aXM6IHtmaWVsZDoge25hbWU6ICdyZWdpb24nLCB0eXBlOiAnc3RyaW5nJ30sIGFnZ3JlZ2F0aW9uOiBudWxsLCB0aXRsZTogJ3JlZ2lvbid9LFxuICAgICAgeUF4aXM6IHtmaWVsZDoge25hbWU6ICdwb3AnLCB0eXBlOiAnaW50ZWdlcid9LCBhZ2dyZWdhdGlvbjogJ3N1bScsIHRpdGxlOiAnUG9wdWxhdGlvbid9LFxuICAgICAgY3Jvc3NGaWx0ZXI6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGZpbHRlcklkOiAncmVnaW9uLWNoYXJ0LWZpbHRlcicsXG4gICAgICAgIGZpZWxkTmFtZXM6IHt4QXhpczogJ3JlZ2lvbid9LFxuICAgICAgICB2YWx1ZToge31cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmRlc2NyaWJlKCdjb2x1bW4gZWRpdHMnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlbmFtZSBjaGFuZ2VzIHRoZSBmaWVsZCBpZGVudGl0eSBzdG9yZWQgaW4gbGF5ZXJzLCBmaWx0ZXJzLCBhbmQgc2F2ZWQgbWFwcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsICdhcmVhJykpO1xuXG4gICAgY29uc3QgcmVnaW9uID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChyZWdpb24/LmlkKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8uZGlzcGxheU5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoW1xuICAgICAgJ2xhdCcsXG4gICAgICAnbG5nJyxcbiAgICAgICdhcmVhJyxcbiAgICAgICdwb3AnXG4gICAgXSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbMl0pLnRvQmUoJ3dlc3QnKTtcblxuICAgIGNvbnN0IGxheWVyID0gc3RhdGUubGF5ZXJzWzBdO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sYXQudmFsdWUpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sbmcudmFsdWUpLnRvQmUoJ2xuZycpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcudGV4dExhYmVsWzBdLmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ2FyZWEnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcz8uZmllbGQ/Lm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZD8ubmFtZSkudG9CZSgncG9wJyk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS5jcm9zc0ZpbHRlcj8uZmllbGROYW1lcykudG9FcXVhbCh7eEF4aXM6ICdhcmVhJ30pO1xuICAgIGV4cGVjdChzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3cuY2l0aWVzWzBdLm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydhcmVhJywgJ3BvcCddKTtcblxuICAgIGNvbnN0IHNhdmVkID0gU2NoZW1hTWFuYWdlci5zYXZlKHtcbiAgICAgIHZpc1N0YXRlOiBzdGF0ZSxcbiAgICAgIG1hcFN0YXRlOiB7fSxcbiAgICAgIG1hcFN0eWxlOiB7fSxcbiAgICAgIHVpU3RhdGU6IHt9XG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGU7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUubGF5ZXJzPy5bMF0udmlzdWFsQ2hhbm5lbHM/LmNvbG9yRmllbGQpLnRvRXF1YWwoe1xuICAgICAgbmFtZTogJ2FyZWEnLFxuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9KTtcbiAgICBleHBlY3Qoc2F2ZWRWaXNTdGF0ZS5sYXllcnM/LlswXS5jb25maWcuY29sdW1ucy5sYXQpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChzYXZlZFZpc1N0YXRlLmxheWVycz8uWzBdLmNvbmZpZy50ZXh0TGFiZWw/LlswXS5maWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShzYXZlZFZpc1N0YXRlLmZpbHRlcnMpKS50b0NvbnRhaW4oJ2FyZWEnKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaXNTdGF0ZS5maWx0ZXJzKSkubm90LnRvQ29udGFpbigncmVnaW9uJyk7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUuY2hhcnRzPy5bMF0ueEF4aXM/LmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBkcm9wcyByZWZlcmVuY2VzIGFuZCByZWZ1c2VzIHRoZSBsYXN0IGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdwb3AnKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoWydsYXQnLCAnbG5nJywgJ3JlZ2lvbiddKTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZCkudG9CZU51bGwoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydyZWdpb24nXSk7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdsYXQnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ2xuZycsICdyZWdpb24nXSk7XG5cbiAgICBjb25zdCBvbmx5ID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICAgIGluZm86IHtpZDogJ29ubHknLCBsYWJlbDogJ29ubHknLCB0eXBlOiAnbG9jYWwnfSxcbiAgICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgICB9KTtcbiAgICBvbmx5LnVwZGF0ZVNjaGVtYSh7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnXV1cbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge29ubHl9fTtcbiAgICBjb25zdCBrZXB0ID0gcmVkdWNlVmlzU3RhdGUoc2luZ2xlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ29ubHknLCAncmVnaW9uJykpO1xuICAgIGV4cGVjdChrZXB0LmRhdGFzZXRzLm9ubHkuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgYW4gdW5yZWxhdGVkIGNvbHVtbiBwcmVzZXJ2ZXMgYW4gaW52ZXJ0ZWQgbnVtZXJpYyBoaXN0b2dyYW0nLCAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBtYWtlVGFibGUoJ2RhdGEnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICd1bnVzZWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICd2YWx1ZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjYXRlZ29yeScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XG4gICAgICBdLFxuICAgICAgcm93czogW1xuICAgICAgICBbJ3gnLCAxLCAnQSddLFxuICAgICAgICBbJ3gnLCAyLCAnQiddLFxuICAgICAgICBbJ3gnLCAzLCAnQSddXG4gICAgICBdXG4gICAgfSk7XG4gICAgbGV0IHN0YXRlID0gd2l0aEZpbHRlcih3aXRoVGFibGVzKHRhYmxlKSwgJ2RhdGEnLCAnY2F0ZWdvcnknKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICd2YWx1ZScsIFsnQSddKSk7XG4gICAgc3RhdGUgPSB3aXRoRmlsdGVyKHN0YXRlLCAnZGF0YScsICd2YWx1ZScpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMSwgJ3ZhbHVlJywgWzIsIDJdKSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlcigxLCAnaW52ZXJ0ZWQnLCB0cnVlKSk7XG4gICAgY29uc3QgaGlzdG9ncmFtQ291bnQgPSAoKSA9PlxuICAgICAgKHN0YXRlLmZpbHRlcnNbMV0gYXMgUmFuZ2VGaWx0ZXIpLmJpbnM/LmRhdGE/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCk7XG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2RhdGEnLCAndW51c2VkJykpO1xuXG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmRhdGEuZmlsdGVyZWRJbmRleCkudG9FcXVhbChbMCwgMl0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5kYXRhLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQudHlwZSkpLnRvRXF1YWwoW1xuICAgICAgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIsXG4gICAgICBBTExfRklFTERfVFlQRVMuc3RyaW5nXG4gICAgXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNvbnZlcnRzIHZhbHVlcyBhbmQgcmVjb25jaWxlcyBpbmNvbXBhdGlibGUgcmVmZXJlbmNlcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZExheWVyKHtcbiAgICAgICAgaWQ6ICdjaXRpZXMtaGVhdG1hcCcsXG4gICAgICAgIHR5cGU6ICdoZWF0bWFwJyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgZGF0YUlkOiAnY2l0aWVzJyxcbiAgICAgICAgICBsYWJlbDogJ2NpdGllcyBoZWF0bWFwJyxcbiAgICAgICAgICBjb2xvcjogWzI1NSwgMCwgMF0sXG4gICAgICAgICAgY29sdW1uczoge2xhdDogJ2xhdCcsIGxuZzogJ2xuZyd9LFxuICAgICAgICAgIHdlaWdodEZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ30sXG4gICAgICAgICAgdGV4dExhYmVsOiBbe2ZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ319XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgcG9wID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdwb3AnKTtcbiAgICBleHBlY3QocG9wKS50b01hdGNoT2JqZWN0KHt0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nLCBhbmFseXplclR5cGU6ICdTVFJJTkcnLCBmb3JtYXQ6ICcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbM10pLnRvQmUoJzEwJyk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIGV4cGVjdChcbiAgICAgIChzdGF0ZS5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gJ2NpdGllcy1oZWF0bWFwJyk/LmNvbmZpZyBhcyB7d2VpZ2h0RmllbGQ/OiB1bmtub3dufSlcbiAgICAgICAgLndlaWdodEZpZWxkXG4gICAgKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChcbiAgICAgIHN0YXRlLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSAnY2l0aWVzLWhlYXRtYXAnKT8uY29uZmlnLnRleHRMYWJlbFswXS5maWVsZFxuICAgICkudG9NYXRjaE9iamVjdCh7bmFtZTogJ3BvcCcsIHR5cGU6ICdzdHJpbmcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcz8uZmllbGQpLnRvRXF1YWwoe25hbWU6ICdwb3AnLCB0eXBlOiAnc3RyaW5nJ30pO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgcG9seWdvbiBmaWx0ZXJzIHRhcmdldGluZyB0aGUgZGF0YXNldCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgY29uc3QgcG9seWdvbkZpbHRlcjogUG9seWdvbkZpbHRlciA9IHtcbiAgICAgIGlkOiAncG9seWdvbi1maWx0ZXInLFxuICAgICAgZGF0YUlkOiBbJ2NpdGllcyddLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZpeGVkRG9tYWluOiB0cnVlLFxuICAgICAgdmlldzogJ3NpZGUnLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgc3BlZWQ6IDEsXG4gICAgICBuYW1lOiBbXSxcbiAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5wb2x5Z29uLFxuICAgICAgZmllbGRJZHg6IFtdLFxuICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogJ3BvbHlnb24tc2VsZWN0aW9uJyxcbiAgICAgICAgcHJvcGVydGllczoge2ZpbHRlcklkOiAncG9seWdvbi1maWx0ZXInfSxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM4XSxcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XVxuICAgICAgICAgICAgXVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19LFxuICAgICAgeUF4aXM6IG51bGwsXG4gICAgICBsYXllcklkOiBbJ2NpdGllcy1sYXllciddLFxuICAgICAgZ3B1OiBmYWxzZVxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHsuLi5zdGF0ZSwgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIHBvbHlnb25GaWx0ZXJdfTtcbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdjaXRpZXMnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIuaWQgPT09IHBvbHlnb25GaWx0ZXIuaWQpKS50b0JlKHBvbHlnb25GaWx0ZXIpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmRlbGV0ZVRhYmxlQ29sdW1uKCdjaXRpZXMnLCAnbGF0JykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzLmZpbmQoZmlsdGVyID0+IGZpbHRlci5pZCA9PT0gcG9seWdvbkZpbHRlci5pZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpbHRlclJlY29yZD8uZ3B1KS5ub3QudG9Db250YWluRXF1YWwoXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7aWQ6IHBvbHlnb25GaWx0ZXIuaWR9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWx0ZXJSZWNvcmQ/LmNwdSkubm90LnRvQ29udGFpbkVxdWFsKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe2lkOiBwb2x5Z29uRmlsdGVyLmlkfSlcbiAgICApO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgYW4gZXhpc3Rpbmcgc29ydCBvbiBhbm90aGVyIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNvcnRUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsIFNPUlRfT1JERVIuQVNDRU5ESU5HKVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0Q29sdW1uKS50b0VxdWFsKHtyZWdpb246IFNPUlRfT1JERVIuQVNDRU5ESU5HfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0T3JkZXIpLnRvRXF1YWwoWzEsIDBdKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdwb3AnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydENvbHVtbikudG9FcXVhbCh7cmVnaW9uOiBTT1JUX09SREVSLkFTQ0VORElOR30pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydE9yZGVyKS50b0VxdWFsKFsxLCAwXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNsZWFycyB0aW1lbGluZSBzdGF0ZSB3aGVuIGEgdGltZSBmaWx0ZXIgYmVjb21lcyBub24tdGltZScsICgpID0+IHtcbiAgICBjb25zdCBldmVudHMgPSBtYWtlVGFibGUoJ2V2ZW50cycsIHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3N0YXJ0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCwgYW5hbHl6ZXJUeXBlOiAnREFURVRJTUUnfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsnMjAyNC0wMS0wMVQwMDowMDowMFonLCAxMF0sXG4gICAgICAgIFsnMjAyNC0wMS0wMlQwMDowMDowMFonLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoRmlsdGVyKHdpdGhUYWJsZXMoZXZlbnRzKSwgJ2V2ZW50cycsICdzdGFydCcpO1xuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4oc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXIpLFxuICAgICAgICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiB0cnVlLFxuICAgICAgICAgIHN5bmNUaW1lbGluZU1vZGU6IDEgYXMgY29uc3QsXG4gICAgICAgICAgaXNBbmltYXRpbmc6IHRydWUsXG4gICAgICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmludGVydmFsLFxuICAgICAgICAgIHRpbWVCaW5zOiB7ZXZlbnRzOiB7ZGF5OiBbXX19LFxuICAgICAgICAgIGxpbmVDaGFydDoge1xuICAgICAgICAgICAgc2VyaWVzOiBbXSxcbiAgICAgICAgICAgIHlEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIHhEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgICAgICAgICAgIGludGVydmFsOiAnZGF5JyxcbiAgICAgICAgICAgIHlBeGlzOiAnYW1vdW50J1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZXpvbmU6ICdVVEMnLFxuICAgICAgICAgIGludmVydFRyZW5kQ29sb3I6IHRydWUsXG4gICAgICAgICAgc2hvd1RpbWVEaXNwbGF5OiB0cnVlLFxuICAgICAgICAgIHlBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzFdLFxuICAgICAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5saW5lQ2hhcnQsIGludGVydmFsOiAnZGF5JywgYWdncmVnYXRpb246ICdzdW0nfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICdzdGFydCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXTtcbiAgICBleHBlY3QoZmlsdGVyLnR5cGUpLnRvQmUoJ211bHRpU2VsZWN0Jyk7XG4gICAgZXhwZWN0KGZpbHRlcikubm90LnRvSGF2ZVByb3BlcnR5KCdzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3luY1RpbWVsaW5lTW9kZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZUJpbnMnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2xpbmVDaGFydCcpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZXpvbmUnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2ludmVydFRyZW5kQ29sb3InKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ3Nob3dUaW1lRGlzcGxheScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZml4ZWREb21haW46IGZhbHNlLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmZyZWUsXG4gICAgICB5QXhpczogbnVsbCxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGRldGFjaGVzIGFuIGluY29tcGF0aWJsZSBzeW5jZWQgZmlsdGVyIG1lbWJlciBhbmQgcmVmaWx0ZXJzIGl0cyBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IHByaW1hcnkgPSBtYWtlVGFibGUoJ3ByaW1hcnknLCB7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XSxcbiAgICAgIHJvd3M6IFtbMV0sIFsyXV1cbiAgICB9KTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlVGFibGUoJ3NlY29uZGFyeScsIHtcbiAgICAgIGZpZWxkczogW3tuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1dLFxuICAgICAgcm93czogW1sxXSwgWzNdXVxuICAgIH0pO1xuXG4gICAgbGV0IHN0YXRlID0gd2l0aFN5bmNlZEZpbHRlcihwcmltYXJ5LCBzZWNvbmRhcnksICd2YWx1ZScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5zZWNvbmRhcnkuZmlsdGVyUmVjb3JkPy5ncHUpLnRvSGF2ZUxlbmd0aCgxKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZGF0YUlkKS50b0VxdWFsKFsncHJpbWFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsndmFsdWUnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2Vjb25kYXJ5LmZpbHRlclJlY29yZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBkeW5hbWljRG9tYWluOiBbXSxcbiAgICAgIGZpeGVkRG9tYWluOiBbXSxcbiAgICAgIGNwdTogW10sXG4gICAgICBncHU6IFtdXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NoYW5naW5nIGEgc3luY2VkIHNlY29uZGFyeSBkYXRhc2V0IGRvZXMgbm90IHJlY29uY2lsZSB0aGUgcHJpbWFyeSBwbG90IGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFrZUV2ZW50cyA9IChpZDogc3RyaW5nKSA9PlxuICAgICAgbWFrZVRhYmxlKGlkLCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICAgIHtuYW1lOiAnYW1vdW50JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICAgIF0sXG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICBbMV83MDBfMDAwXzAwMCwgMTBdLFxuICAgICAgICAgIFsxXzcwMF8wMDBfMDIwLCAyMF1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJpbWFyeSA9IG1ha2VFdmVudHMoJ3ByaW1hcnknKTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlRXZlbnRzKCdzZWNvbmRhcnknKTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnksIHNlY29uZGFyeSwgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5wcmltYXJ5LmZpZWxkc1sxXX0pXG4gICAgKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICdhbW91bnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b01hdGNoT2JqZWN0KHtuYW1lOiAnYW1vdW50JywgdHlwZTogJ2ludGVnZXInfSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnbGluZUNoYXJ0Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RldGFjaGluZyBhIHN5bmNlZCBwcmltYXJ5IGRhdGFzZXQgcmVidWlsZHMgdGhlIHBsb3QgZm9yIHRoZSBuZXcgcHJpbWFyeScsICgpID0+IHtcbiAgICBjb25zdCBwcmltYXJ5ID0gbWFrZVRhYmxlKCdwcmltYXJ5Jywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2Ftb3VudCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtcbiAgICAgICAgWzFfNzAwXzAwMF8wMDAsIDEwXSxcbiAgICAgICAgWzFfNzAwXzAwMF8wMjAsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHNlY29uZGFyeSA9IG1ha2VUYWJsZSgnc2Vjb25kYXJ5Jywge1xuICAgICAgZmllbGRzOiBbe25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J31dLFxuICAgICAgcm93czogW1sxXzcwMF8wMDBfMDQwXSwgWzFfNzAwXzAwMF8wNjBdXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhTeW5jZWRGaWx0ZXIocHJpbWFyeSwgc2Vjb25kYXJ5LCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLnByaW1hcnkuZmllbGRzWzFdfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydCkudG9CZURlZmluZWQoKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3ByaW1hcnknLCAnc3RhcnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3NlY29uZGFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsnc3RhcnQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ueUF4aXMpLnRvQmVOdWxsKCk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnaGlzdG9ncmFtJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0KS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyb3VwZWQgdGltZWxpbmUgc2VyaWVzIHN1cnZpdmUgYSByZW5hbWUgYW5kIHJlYnVpbGQgd2hlbiBncm91cCB2YWx1ZXMgY29sbGFwc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgZXZlbnRzID0gbWFrZVRhYmxlKCdldmVudHMnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAnZ3JvdXAnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAnMDEnLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAnMScsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhldmVudHMpLCAnZXZlbnRzJywgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzJdfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJQbG90KDAsIHtcbiAgICAgICAgcGxvdFR5cGU6IHtncm91cEJ5OiB7ZmllbGROYW1lOiAnZ3JvdXAnLCBudW1Hcm91cHM6ICdBTEwnLCBncm91cE90aGVyczogZmFsc2V9fVxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHNlcmllc0JlZm9yZSA9IHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMgYXMge25hbWVzPzogc3RyaW5nW119O1xuICAgIGV4cGVjdChuZXcgU2V0KHNlcmllc0JlZm9yZS5uYW1lcykpLnRvRXF1YWwobmV3IFNldChbJzAxJywgJzEnXSkpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCdldmVudHMnLCAnZ3JvdXAnLCAnY2F0ZWdvcnknKSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMpLnRvRXF1YWwoc2VyaWVzQmVmb3JlKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5wbG90VHlwZS5ncm91cEJ5LmZpZWxkTmFtZSkudG9CZSgnY2F0ZWdvcnknKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuZXZlbnRzLmZpZWxkc1sxXS50eXBlKS50b0JlKEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnZXZlbnRzJywgJ2NhdGVnb3J5JywgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIpO1xuXG4gICAgY29uc3QgbmFtZXNBZnRlciA9IChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydD8uc2VyaWVzIGFzIHtuYW1lcz86IHN0cmluZ1tdfSkubmFtZXM7XG4gICAgZXhwZWN0KG5ldyBTZXQobmFtZXNBZnRlcikpLnRvRXF1YWwobmV3IFNldChbJzEnXSkpO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBjbGVhcnMgYW4gaW50ZXJ2YWwgZW5kIGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIGEgdGltZXN0YW1wJywgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50cyA9IG1ha2VUYWJsZSgnZXZlbnRzJywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2VuZCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAxXzcwMF8wODZfNDAwLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAxXzcwMF8xNzJfODAwLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoVGFibGVzKGV2ZW50cyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZENoYXJ0KHtcbiAgICAgICAgaWQ6ICdldmVudHMtY2hhcnQnLFxuICAgICAgICB0aXRsZTogJ0V2ZW50cycsXG4gICAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICAgIGRhdGFJZDogJ2V2ZW50cycsXG4gICAgICAgIGFwcGx5RmlsdGVyczogdHJ1ZSxcbiAgICAgICAgZGlzcGxheToge30sXG4gICAgICAgIGNoYXJ0RGlzcGxheToge30sXG4gICAgICAgIHhBeGlzOiB7XG4gICAgICAgICAgZmllbGQ6IHtuYW1lOiAnZW5kJywgdHlwZTogJ3RpbWVzdGFtcCd9LFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAndGltZUJpbicsXG4gICAgICAgICAgaW50ZXJ2YWw6ICdkYXknLFxuICAgICAgICAgIHRpdGxlOiAnZW5kJ1xuICAgICAgICB9LFxuICAgICAgICB5QXhpczoge2ZpZWxkOiB7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ2ludGVnZXInfSwgYWdncmVnYXRpb246ICdzdW0nLCB0aXRsZTogJ3ZhbHVlJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHdpdGhGaWx0ZXIoc3RhdGUsICdldmVudHMnLCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICdlbmROYW1lJywgJ2VuZCcsIDApKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLmV2ZW50cy5maWVsZHNbMl19KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9FcXVhbChbJ2VuZCddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS55QXhpcz8ubmFtZSkudG9CZSgndmFsdWUnKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnBsb3RUeXBlLnR5cGUpLnRvQmUoJ2hpc3RvZ3JhbScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZE5hbWUpLnRvRXF1YWwoWydlbmQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICd2YWx1ZScsIHR5cGU6ICdzdHJpbmcnfSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJ1xuICAgIH0pO1xuICAgIGxldCB0aW1lRmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSB0aW1lRmlsdGVyLnBsb3RUeXBlLmludGVydmFsO1xuICAgIGNvbnN0IGludGVydmFsQmlucyA9IHRpbWVGaWx0ZXIudGltZUJpbnM/LmV2ZW50cz8uW2ludGVydmFsXTtcbiAgICBleHBlY3QoaW50ZXJ2YWxCaW5zPy5yZWR1Y2UoKHN1bSwgYmluKSA9PiBzdW0gKyBiaW4uY291bnQsIDApKS50b0JlR3JlYXRlclRoYW4oMik7XG5cbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdldmVudHMnLCAnZW5kJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZEZpZWxkSWR4KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgdGltZUZpbHRlciA9IHN0YXRlLmZpbHRlcnNbMF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IGJpbnMgPSB0aW1lRmlsdGVyLnRpbWVCaW5zPy5ldmVudHM/LltpbnRlcnZhbF07XG4gICAgZXhwZWN0KGJpbnM/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICdlbmQnLCB0eXBlOiAnc3RyaW5nJ30sXG4gICAgICBhZ2dyZWdhdGlvbjogJ3VuaXF1ZUJpbidcbiAgICB9KTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnhBeGlzPy5pbnRlcnZhbCkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCdpbnZhbGlkIHR5cGUgY2hhbmdlIGlzIGF0b21pYyBhbmQgc2NoZWR1bGVzIGEgcHJlY2lzZSBlcnJvcicsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCBuZXh0ID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdyZWdpb24nLCBBTExfRklFTERfVFlQRVMuaW50ZWdlcik7XG5cbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMpLnRvQmUoc3RhdGUuZGF0YXNldHMuY2l0aWVzKTtcbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3JlZ2lvbicpPy50eXBlKS50b0JlKFxuICAgICAgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ1xuICAgICk7XG4gICAgZXhwZWN0KG5leHQuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSgwKVsyXSkudG9CZSgnd2VzdCcpO1xuXG4gICAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICAgIGV4cGVjdCh0YXNrcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2tzWzBdLCB1bmRlZmluZWQpO1xuICAgIGV4cGVjdChub3RpZmljYXRpb24ucGF5bG9hZC5tZXNzYWdlKS50b0NvbnRhaW4oXG4gICAgICAnQ2Fubm90IGNoYW5nZSDigJxyZWdpb27igJ0gdG8gaW50ZWdlcjogcm93IDEgdmFsdWUg4oCcd2VzdOKAnSBpcyBub3QgYSBzYWZlIGludGVnZXInXG4gICAgKTtcbiAgICBleHBlY3Qobm90aWZpY2F0aW9uLnBheWxvYWQubWVzc2FnZSkudG9Db250YWluKCdObyB2YWx1ZXMgd2VyZSBjaGFuZ2VkLicpO1xuICB9KTtcblxuICB0ZXN0KCdsYXRlIGNvbHVtbiBzdGF0aXN0aWNzIGNhbm5vdCBvdmVyd3JpdGUgYSBjaGFuZ2VkIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmxvYWRDb2x1bW5TdGF0cygnY2l0aWVzJywgJ3BvcCcpKTtcbiAgICBjb25zdCByZXF1ZXN0UmV2aXNpb24gPSBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uO1xuICAgIGNvbnN0IFt0YXNrXSA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gICAgY29uc3QgcmVzdWx0ID0ge3R5cGU6ICdudW1lcmljJywgbWVhbjogMjV9O1xuICAgIGNvbnN0IHN0YWxlU3VjY2VzcyA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2ssIHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIGZpbHRlclByb3BzOiB7dHlwZTogRklMVEVSX1RZUEVTLnJhbmdlfVxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFsZVN1Y2Nlc3MpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZmllbGRUeXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlclxuICAgIH0pO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uKS50b0JlKHJlcXVlc3RSZXZpc2lvbiArIDEpO1xuICAgIGNvbnN0IGNoYW5nZWRTdGF0ZSA9IHN0YXRlO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgc3RhbGVTdWNjZXNzKTtcblxuICAgIGV4cGVjdChzdGF0ZSkudG9CZShjaGFuZ2VkU3RhdGUpO1xuICAgIGNvbnN0IGNoYW5nZWRGaWVsZCA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lID09PSAncG9wJyk7XG4gICAgZXhwZWN0KGNoYW5nZWRGaWVsZCkudG9NYXRjaE9iamVjdCh7dHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30pO1xuICAgIGV4cGVjdChjaGFuZ2VkRmllbGQpLm5vdC50b0hhdmVQcm9wZXJ0eSgnaXNMb2FkaW5nU3RhdHMnKTtcbiAgICBleHBlY3QoXG4gICAgICBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3BvcCcpPy5maWx0ZXJQcm9wcz8uY29sdW1uU3RhdHNcbiAgICApLm5vdC50b0JlKHJlc3VsdCk7XG4gIH0pO1xuXG4gIHRlc3QuZWFjaChbJ3JlZnJlc2gnLCAnYXBwZW5kJ10pKCdwZW5kaW5nIHN0YXRpc3RpY3MgY29tcGxldGUgYWZ0ZXIgYSBub3JtYWwgJXMnLCB1cGRhdGUgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCB0eXBlcyA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLnR5cGUpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5sb2FkQ29sdW1uU3RhdHMoJ2NpdGllcycsICdwb3AnKSk7XG4gICAgY29uc3QgW3Rhc2tdID0gZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucGluVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nKSk7XG4gICAgY29uc3Qgcm93ID0gWzQxLCAtNzUsICdub3J0aCcsIDUwXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICB1cGRhdGUgPT09ICdyZWZyZXNoJ1xuICAgICAgICA/IFZpc1N0YXRlQWN0aW9ucy5yZWZyZXNoRGF0YXNldFN1Y2Nlc3MoJ2NpdGllcycsIHtcbiAgICAgICAgICAgIG5vdE1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGE6IHtmaWVsZHM6IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMsIHJvd3M6IFtyb3ddfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogVmlzU3RhdGVBY3Rpb25zLmFkZFRvRGF0YXNldCgnY2l0aWVzJywgW3Jvd10pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt0eXBlOiAnbnVtZXJpYycsIG1lYW46IDI1fTtcbiAgICBjb25zdCBzdWNjZXNzU3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgc3VjY2VlZFRhc2tJblRlc3QodGFzaywge3Jlc3VsdCwgZmlsdGVyUHJvcHM6IHt0eXBlOiBGSUxURVJfVFlQRVMucmFuZ2V9fSlcbiAgICApO1xuICAgIGNvbnN0IGxvZ0Vycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCAnZXJyb3InKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlcnJvclN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIGVycm9yVGFza0luVGVzdCh0YXNrLCBuZXcgRXJyb3IoJ3N0YXRzIGZhaWxlZCcpKSk7XG4gICAgbG9nRXJyb3IubW9ja1Jlc3RvcmUoKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC50eXBlKSkudG9FcXVhbCh0eXBlcyk7XG4gICAgZXhwZWN0KHN1Y2Nlc3NTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGlzTG9hZGluZ1N0YXRzOiBmYWxzZSxcbiAgICAgIGZpbHRlclByb3BzOiB7Y29sdW1uU3RhdHM6IHJlc3VsdH1cbiAgICB9KTtcbiAgICBleHBlY3QoZXJyb3JTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdLmlzTG9hZGluZ1N0YXRzKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSh1cGRhdGUgPT09ICdyZWZyZXNoJyA/IDAgOiAyKSkudG9FcXVhbChcbiAgICAgIHJvd1xuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2R1cGxpY2F0ZSByZW5hbWUgYW5kIG5vbi10YWJ1bGFyIGRhdGFzZXRzIGFyZSBpZ25vcmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gd2l0aENpdGllcygpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMucmVuYW1lVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nLCAncG9wJylcbiAgICApO1xuICAgIGV4cGVjdChkdXBsaWNhdGUpLnRvQmUoc3RhdGUpO1xuXG4gICAgY29uc3QgdGlsZXMgPSBuZXcgS2VwbGVyVGFibGUoe1xuICAgICAgaW5mbzoge2lkOiAndGlsZXMnLCBsYWJlbDogJ3RpbGVzJywgdHlwZTogJ3ZlY3Rvci10aWxlJ30sXG4gICAgICBjb2xvcjogWzAsIDAsIDBdXG4gICAgfSk7XG4gICAgdGlsZXMudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnLCAxXV1cbiAgICB9KTtcbiAgICBjb25zdCB0aWxlZDogVmlzU3RhdGUgPSB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7dGlsZXN9fTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHRpbGVkLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCd0aWxlcycsICdyZWdpb24nLCAnYXJlYScpXG4gICAgKTtcbiAgICBleHBlY3QodW5jaGFuZ2VkKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUodGlsZWQsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigndGlsZXMnLCAncG9wJykpKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QoY2hhbmdlVHlwZSh0aWxlZCwgJ3RpbGVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpKS50b0JlKHRpbGVkKTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZXJuYWxseSBob3N0ZWQgZGF0YXNldHMgaWdub3JlIHJlbmFtZSBhbmQgZGVsZXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlbW90ZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgICBpbmZvOiB7aWQ6ICdyZW1vdGUnLCBsYWJlbDogJ3JlbW90ZScsIHR5cGU6ICdleHRlcm5hbGx5LWhvc3RlZCd9LFxuICAgICAgY29sb3I6IFswLCAwLCAwXVxuICAgIH0pO1xuICAgIHJlbW90ZS51cGRhdGVTY2hlbWEoe1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZywgZGlzcGxheU5hbWU6ICdSZWdpb24nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbWyd3ZXN0JywgMV1dXG4gICAgfSk7XG4gICAgY29uc3Qgc3RhdGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge3JlbW90ZX19O1xuXG4gICAgZXhwZWN0KFxuICAgICAgcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3JlZ2lvbicsICdhcmVhJykpXG4gICAgKS50b0JlKHN0YXRlKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3BvcCcpKSkudG9CZShzdGF0ZSk7XG4gICAgZXhwZWN0KGNoYW5nZVR5cGUoc3RhdGUsICdyZW1vdGUnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZykpLnRvQmUoc3RhdGUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5yZW1vdGUuZmllbGRzWzBdLmRpc3BsYXlOYW1lKS50b0JlKCdSZWdpb24nKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBT0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBR0EsSUFBQU0sU0FBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQUF1RCxTQUFBUSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9B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