@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4

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 (114) hide show
  1. package/CHANGELOG.md +18 -30
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,927 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
6
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
- var _react = _interopRequireDefault(require("react"));
8
- var _testUtils = require("@pie-lib/test-utils");
9
- var _utils = require("./utils");
10
- var _graph = _interopRequireWildcard(require("../graph"));
11
- var _tools = require("../tools");
12
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
- 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; }
14
- 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; }
15
- describe('removeBuildingToolIfCurrentToolDiffers', function () {
16
- var marks = [{
17
- type: 'point',
18
- x: 2,
19
- y: 2,
20
- label: 'Point',
21
- showLabel: true
22
- }, {
23
- type: 'line',
24
- from: {
25
- x: 0,
26
- y: 0
27
- },
28
- to: {
29
- x: 1,
30
- y: 1
31
- },
32
- label: 'Line',
33
- building: true
34
- }];
35
- it('keeps all marks if currentTool is the same', function () {
36
- expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
37
- marks: marks,
38
- currentTool: {
39
- type: 'line'
40
- }
41
- })).toEqual(marks);
42
- });
43
- it('removes building marks if currentTool is different', function () {
44
- expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
45
- marks: marks,
46
- currentTool: {
47
- type: 'different'
48
- }
49
- })).toEqual([marks[0]]);
50
- });
51
- });
52
- describe('Graph', function () {
53
- var onChangeMarks = jest.fn();
54
- var defaultProps = _objectSpread({
55
- className: 'className',
56
- onChangeMarks: onChangeMarks,
57
- tools: _tools.toolsArr,
58
- domain: {
59
- min: 0,
60
- max: 1,
61
- step: 1
62
- },
63
- range: {
64
- min: 0,
65
- max: 1,
66
- step: 1
67
- },
68
- size: {
69
- width: 400,
70
- height: 400
71
- },
72
- marks: [{
73
- type: 'point',
74
- x: 2,
75
- y: 2,
76
- label: 'Point',
77
- showLabel: true
78
- }, {
79
- type: 'line',
80
- from: {
81
- x: 0,
82
- y: 0
83
- },
84
- to: {
85
- x: 1,
86
- y: 1
87
- },
88
- label: 'Line'
89
- }]
90
- }, (0, _utils.graphProps)());
91
- beforeEach(function () {
92
- onChangeMarks.mockClear();
93
- });
94
- describe('rendering', function () {
95
- it('renders without crashing', function () {
96
- var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
97
- container = _render.container;
98
- expect(container.firstChild).toBeInTheDocument();
99
- });
100
- it('renders with currentTool', function () {
101
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
102
- currentTool: _tools.toolsArr[0]
103
- });
104
- var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
105
- container = _render2.container;
106
- expect(container.firstChild).toBeInTheDocument();
107
- });
108
- it('renders with marks', function () {
109
- var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
110
- container = _render3.container;
111
- expect(container.firstChild).toBeInTheDocument();
112
- });
113
- it('renders with empty marks array', function () {
114
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
115
- marks: []
116
- });
117
- var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
118
- container = _render4.container;
119
- expect(container.firstChild).toBeInTheDocument();
120
- });
121
- it('renders with labelModeEnabled', function () {
122
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
123
- labelModeEnabled: true
124
- });
125
- var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
126
- container = _render5.container;
127
- expect(container.firstChild).toBeInTheDocument();
128
- });
129
- });
130
- describe('props handling', function () {
131
- it('calls onChangeMarks when marks prop changes', function () {
132
- var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
133
- rerender = _render6.rerender;
134
- var newMarks = [{
135
- type: 'point',
136
- x: 3,
137
- y: 3,
138
- label: 'New Point',
139
- showLabel: true
140
- }];
141
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
142
- marks: newMarks
143
- })));
144
-
145
- // Component should render with new marks
146
- // Note: onChangeMarks is called internally when marks are changed through user interaction,
147
- // not when props change, so we just verify the component renders correctly
148
- expect(onChangeMarks).not.toHaveBeenCalled();
149
- });
150
- it('handles undefined onChangeMarks gracefully', function () {
151
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
152
- onChangeMarks: undefined
153
- });
154
- var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
155
- container = _render7.container;
156
- expect(container.firstChild).toBeInTheDocument();
157
- });
158
- });
159
- describe('removeBuildingToolIfCurrentToolDiffers integration', function () {
160
- it('removes building marks when currentTool changes', function () {
161
- var marksWithBuilding = [{
162
- type: 'point',
163
- x: 2,
164
- y: 2,
165
- label: 'Point',
166
- showLabel: true
167
- }, {
168
- type: 'line',
169
- from: {
170
- x: 0,
171
- y: 0
172
- },
173
- to: {
174
- x: 1,
175
- y: 1
176
- },
177
- building: true
178
- }];
179
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
180
- marks: marksWithBuilding,
181
- currentTool: {
182
- type: 'point'
183
- } // Different from building mark type
184
- });
185
- var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
186
- container = _render8.container;
187
- expect(container.firstChild).toBeInTheDocument();
188
- });
189
- });
190
- describe('updateMarks method', function () {
191
- it('updates an existing mark', function () {
192
- var wrapper = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps));
193
- var rerender = wrapper.rerender;
194
- var updatedMarks = [{
195
- type: 'point',
196
- x: 3,
197
- y: 3,
198
- label: 'Updated Point',
199
- showLabel: true
200
- }, {
201
- type: 'line',
202
- from: {
203
- x: 0,
204
- y: 0
205
- },
206
- to: {
207
- x: 1,
208
- y: 1
209
- },
210
- label: 'Line'
211
- }];
212
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
213
- marks: updatedMarks
214
- })));
215
-
216
- // Component should render with updated marks
217
- expect(wrapper.container.firstChild).toBeInTheDocument();
218
- });
219
- it('does not update if mark is duplicated', function () {
220
- var duplicatedMarks = [{
221
- type: 'point',
222
- x: 2,
223
- y: 2,
224
- label: 'Point',
225
- showLabel: true
226
- }, {
227
- type: 'point',
228
- x: 2,
229
- y: 2,
230
- label: 'Point',
231
- showLabel: true
232
- }];
233
- var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
234
- marks: duplicatedMarks
235
- }))),
236
- container = _render9.container;
237
- expect(container.firstChild).toBeInTheDocument();
238
- });
239
- it('adds mark if addIfMissing is true and mark does not exist', function () {
240
- var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
241
- container = _render0.container;
242
-
243
- // The component should handle adding new marks through user interaction
244
- expect(container.firstChild).toBeInTheDocument();
245
- });
246
- it('does not update if mark has no building flag and is duplicated', function () {
247
- var marks = [{
248
- type: 'point',
249
- x: 2,
250
- y: 2,
251
- label: 'Point',
252
- showLabel: true
253
- }];
254
- var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
255
- marks: marks
256
- }))),
257
- container = _render1.container;
258
- expect(container.firstChild).toBeInTheDocument();
259
- });
260
- it('handles building marks correctly', function () {
261
- var marksWithBuilding = [{
262
- type: 'line',
263
- from: {
264
- x: 0,
265
- y: 0
266
- },
267
- building: true
268
- }];
269
- var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
270
- marks: marksWithBuilding
271
- }))),
272
- container = _render10.container;
273
- expect(container.firstChild).toBeInTheDocument();
274
- });
275
- it('updates building mark to completed mark', function () {
276
- var marksWithBuilding = [{
277
- type: 'line',
278
- from: {
279
- x: 0,
280
- y: 0
281
- },
282
- building: true
283
- }];
284
- var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
285
- marks: marksWithBuilding
286
- }))),
287
- rerender = _render11.rerender,
288
- container = _render11.container;
289
- var completedMarks = [{
290
- type: 'line',
291
- from: {
292
- x: 0,
293
- y: 0
294
- },
295
- to: {
296
- x: 1,
297
- y: 1
298
- },
299
- building: false
300
- }];
301
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
302
- marks: completedMarks
303
- })));
304
- expect(container.firstChild).toBeInTheDocument();
305
- });
306
- it('does not call onChangeMarks if update is undefined', function () {
307
- var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
308
- container = _render12.container;
309
-
310
- // If update is undefined, onChangeMarks should not be called
311
- // This is handled internally by the component
312
- expect(container.firstChild).toBeInTheDocument();
313
- });
314
- it('does not add mark if existing is not found and addIfMissing is false', function () {
315
- var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
316
- container = _render13.container;
317
-
318
- // By default, marks are not added if they don't exist and addIfMissing is false
319
- expect(container.firstChild).toBeInTheDocument();
320
- });
321
- it('calls onChangeMarks with correct marks when updating', function () {
322
- var marks = [{
323
- type: 'point',
324
- x: 2,
325
- y: 2,
326
- label: 'Point',
327
- showLabel: true
328
- }];
329
- var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
330
- marks: marks
331
- }))),
332
- rerender = _render14.rerender;
333
- var updatedMarks = [{
334
- type: 'point',
335
- x: 3,
336
- y: 3,
337
- label: 'Updated Point',
338
- showLabel: true
339
- }];
340
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
341
- marks: updatedMarks
342
- })));
343
-
344
- // The component handles mark updates internally
345
- // onChangeMarks is called through user interactions
346
- });
347
- it('preserves other marks when updating a specific mark', function () {
348
- var marks = [{
349
- type: 'point',
350
- x: 2,
351
- y: 2,
352
- label: 'Point 1',
353
- showLabel: true
354
- }, {
355
- type: 'point',
356
- x: 3,
357
- y: 3,
358
- label: 'Point 2',
359
- showLabel: true
360
- }];
361
- var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
362
- marks: marks
363
- }))),
364
- container = _render15.container;
365
- expect(container.firstChild).toBeInTheDocument();
366
- });
367
- });
368
- describe('getComponent method', function () {
369
- it('returns null if mark is null', function () {
370
- var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
371
- container = _render16.container;
372
-
373
- // getComponent returns null for null marks
374
- // This is tested by rendering with undefined marks
375
- var propsWithoutMarks = _objectSpread(_objectSpread({}, defaultProps), {}, {
376
- marks: []
377
- });
378
- var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], propsWithoutMarks)),
379
- emptyContainer = _render17.container;
380
- expect(emptyContainer.firstChild).toBeInTheDocument();
381
- });
382
- it('returns null if mark is undefined', function () {
383
- var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
384
- container = _render18.container;
385
- expect(container.firstChild).toBeInTheDocument();
386
- });
387
- it('returns null if tools is undefined', function () {
388
- var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
389
- tools: undefined
390
- });
391
- var graphInstance = new _graph["default"](propsWithUndefinedTools);
392
- var mark = {
393
- type: 'point',
394
- x: 1,
395
- y: 1
396
- };
397
- var component = graphInstance.getComponent(mark);
398
- expect(component).toBeNull();
399
- });
400
- it('returns null if tools is empty array', function () {
401
- var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
402
- tools: []
403
- });
404
- var graphInstance = new _graph["default"](propsWithEmptyTools);
405
- var mark = {
406
- type: 'point',
407
- x: 1,
408
- y: 1
409
- };
410
- var component = graphInstance.getComponent(mark);
411
- expect(component).toBeNull();
412
- });
413
- it('returns null if mark type is not found in tools', function () {
414
- var graphInstance = new _graph["default"](defaultProps);
415
- var mark = {
416
- type: 'nonexistent-type',
417
- x: 1,
418
- y: 1
419
- };
420
- var component = graphInstance.getComponent(mark);
421
- expect(component).toBeNull();
422
- });
423
- it('returns component if tool has no Component property', function () {
424
- var toolWithoutComponent = [{
425
- type: 'custom',
426
- label: 'Custom'
427
- }];
428
- var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
429
- tools: toolWithoutComponent
430
- });
431
- var graphInstance = new _graph["default"](propsWithCustomTool);
432
- var mark = {
433
- type: 'custom',
434
- x: 1,
435
- y: 1
436
- };
437
- var component = graphInstance.getComponent(mark);
438
- expect(component).toBeNull();
439
- });
440
- it('returns correct component for point mark', function () {
441
- var graphInstance = new _graph["default"](defaultProps);
442
- var mark = {
443
- type: 'point',
444
- x: 1,
445
- y: 1
446
- };
447
- var component = graphInstance.getComponent(mark);
448
- expect(component).toBeTruthy();
449
- });
450
- it('returns correct component for line mark', function () {
451
- var graphInstance = new _graph["default"](defaultProps);
452
- var mark = {
453
- type: 'line',
454
- from: {
455
- x: 0,
456
- y: 0
457
- },
458
- to: {
459
- x: 1,
460
- y: 1
461
- }
462
- };
463
- var component = graphInstance.getComponent(mark);
464
- expect(component).toBeTruthy();
465
- });
466
- it('returns correct component for different mark types', function () {
467
- var graphInstance = new _graph["default"](defaultProps);
468
- var pointMark = {
469
- type: 'point',
470
- x: 1,
471
- y: 1
472
- };
473
- var lineMark = {
474
- type: 'line',
475
- from: {
476
- x: 0,
477
- y: 0
478
- },
479
- to: {
480
- x: 1,
481
- y: 1
482
- }
483
- };
484
- var circleMark = {
485
- type: 'circle',
486
- center: {
487
- x: 0,
488
- y: 0
489
- },
490
- edge: {
491
- x: 1,
492
- y: 1
493
- }
494
- };
495
- var pointComponent = graphInstance.getComponent(pointMark);
496
- var lineComponent = graphInstance.getComponent(lineMark);
497
- var circleComponent = graphInstance.getComponent(circleMark);
498
- expect(pointComponent).toBeTruthy();
499
- expect(lineComponent).toBeTruthy();
500
- expect(circleComponent).toBeTruthy();
501
- });
502
- });
503
- describe('getComponent method - unit tests', function () {
504
- it('returns null if mark is null', function () {
505
- var graphInstance = new _graph["default"](defaultProps);
506
- var component = graphInstance.getComponent(null);
507
- expect(component).toBeNull();
508
- });
509
- it('returns null if mark is undefined', function () {
510
- var graphInstance = new _graph["default"](defaultProps);
511
- var component = graphInstance.getComponent(undefined);
512
- expect(component).toBeNull();
513
- });
514
- it('returns null if tools is undefined', function () {
515
- var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
516
- tools: undefined
517
- });
518
- var graphInstance = new _graph["default"](propsWithUndefinedTools);
519
- var mark = {
520
- type: 'point',
521
- x: 1,
522
- y: 1
523
- };
524
- var component = graphInstance.getComponent(mark);
525
- expect(component).toBeNull();
526
- });
527
- it('returns null if tools is empty array', function () {
528
- var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
529
- tools: []
530
- });
531
- var graphInstance = new _graph["default"](propsWithEmptyTools);
532
- var mark = {
533
- type: 'point',
534
- x: 1,
535
- y: 1
536
- };
537
- var component = graphInstance.getComponent(mark);
538
- expect(component).toBeNull();
539
- });
540
- it('returns null if mark type is not found in tools', function () {
541
- var graphInstance = new _graph["default"](defaultProps);
542
- var mark = {
543
- type: 'nonexistent-type',
544
- x: 1,
545
- y: 1
546
- };
547
- var component = graphInstance.getComponent(mark);
548
- expect(component).toBeNull();
549
- });
550
- it('returns component if tool has no Component property', function () {
551
- var toolWithoutComponent = [{
552
- type: 'custom',
553
- label: 'Custom'
554
- }];
555
- var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
556
- tools: toolWithoutComponent
557
- });
558
- var graphInstance = new _graph["default"](propsWithCustomTool);
559
- var mark = {
560
- type: 'custom',
561
- x: 1,
562
- y: 1
563
- };
564
- var component = graphInstance.getComponent(mark);
565
- expect(component).toBeNull();
566
- });
567
- it('returns correct component for point mark', function () {
568
- var graphInstance = new _graph["default"](defaultProps);
569
- var mark = {
570
- type: 'point',
571
- x: 1,
572
- y: 1
573
- };
574
- var component = graphInstance.getComponent(mark);
575
- expect(component).toBeTruthy();
576
- });
577
- it('returns correct component for line mark', function () {
578
- var graphInstance = new _graph["default"](defaultProps);
579
- var mark = {
580
- type: 'line',
581
- from: {
582
- x: 0,
583
- y: 0
584
- },
585
- to: {
586
- x: 1,
587
- y: 1
588
- }
589
- };
590
- var component = graphInstance.getComponent(mark);
591
- expect(component).toBeTruthy();
592
- });
593
- it('returns correct component for different mark types', function () {
594
- var graphInstance = new _graph["default"](defaultProps);
595
- var pointMark = {
596
- type: 'point',
597
- x: 1,
598
- y: 1
599
- };
600
- var lineMark = {
601
- type: 'line',
602
- from: {
603
- x: 0,
604
- y: 0
605
- },
606
- to: {
607
- x: 1,
608
- y: 1
609
- }
610
- };
611
- var circleMark = {
612
- type: 'circle',
613
- center: {
614
- x: 0,
615
- y: 0
616
- },
617
- edge: {
618
- x: 1,
619
- y: 1
620
- }
621
- };
622
- var pointComponent = graphInstance.getComponent(pointMark);
623
- var lineComponent = graphInstance.getComponent(lineMark);
624
- var circleComponent = graphInstance.getComponent(circleMark);
625
- expect(pointComponent).toBeTruthy();
626
- expect(lineComponent).toBeTruthy();
627
- expect(circleComponent).toBeTruthy();
628
- });
629
- });
630
- describe('updateMarks method - unit tests', function () {
631
- it('does not update if update parameter is null', function () {
632
- var onChangeMarks = jest.fn();
633
- var marks = [{
634
- type: 'point',
635
- x: 1,
636
- y: 1
637
- }];
638
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
639
- onChangeMarks: onChangeMarks,
640
- marks: marks
641
- });
642
- var graphInstance = new _graph["default"](props);
643
- var existing = marks[0];
644
- graphInstance.updateMarks(existing, null);
645
- expect(onChangeMarks).not.toHaveBeenCalled();
646
- });
647
- it('does not update if update parameter is undefined', function () {
648
- var onChangeMarks = jest.fn();
649
- var marks = [{
650
- type: 'point',
651
- x: 1,
652
- y: 1
653
- }];
654
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
655
- onChangeMarks: onChangeMarks,
656
- marks: marks
657
- });
658
- var graphInstance = new _graph["default"](props);
659
- var existing = marks[0];
660
- graphInstance.updateMarks(existing, undefined);
661
- expect(onChangeMarks).not.toHaveBeenCalled();
662
- });
663
- it('updates existing mark when found', function () {
664
- var onChangeMarks = jest.fn();
665
- var marks = [{
666
- type: 'point',
667
- x: 1,
668
- y: 1
669
- }, {
670
- type: 'point',
671
- x: 2,
672
- y: 2
673
- }];
674
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
675
- onChangeMarks: onChangeMarks,
676
- marks: marks
677
- });
678
- var graphInstance = new _graph["default"](props);
679
- var existing = marks[0];
680
- var updated = {
681
- type: 'point',
682
- x: 1,
683
- y: 3
684
- };
685
- graphInstance.updateMarks(existing, updated);
686
- expect(onChangeMarks).toHaveBeenCalledTimes(1);
687
- var updatedMarks = onChangeMarks.mock.calls[0][0];
688
- expect(updatedMarks[0]).toEqual(updated);
689
- expect(updatedMarks[1]).toEqual(marks[1]);
690
- });
691
- it('adds mark if addIfMissing is true and mark not found', function () {
692
- var onChangeMarks = jest.fn();
693
- var marks = [{
694
- type: 'point',
695
- x: 1,
696
- y: 1
697
- }];
698
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
699
- onChangeMarks: onChangeMarks,
700
- marks: marks
701
- });
702
- var graphInstance = new _graph["default"](props);
703
- var existing = {
704
- type: 'point',
705
- x: 5,
706
- y: 5
707
- };
708
- var updated = {
709
- type: 'point',
710
- x: 2,
711
- y: 2
712
- };
713
- graphInstance.updateMarks(existing, updated, true);
714
- expect(onChangeMarks).toHaveBeenCalledTimes(1);
715
- var updatedMarks = onChangeMarks.mock.calls[0][0];
716
- expect(updatedMarks.length).toBe(2);
717
- expect(updatedMarks[1]).toEqual(updated);
718
- });
719
- it('does not add mark if addIfMissing is false and mark not found', function () {
720
- var onChangeMarks = jest.fn();
721
- var marks = [{
722
- type: 'point',
723
- x: 1,
724
- y: 1
725
- }];
726
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
727
- onChangeMarks: onChangeMarks,
728
- marks: marks
729
- });
730
- var graphInstance = new _graph["default"](props);
731
- var existing = {
732
- type: 'point',
733
- x: 5,
734
- y: 5
735
- };
736
- var updated = {
737
- type: 'point',
738
- x: 2,
739
- y: 2
740
- };
741
- graphInstance.updateMarks(existing, updated, false);
742
- expect(onChangeMarks).not.toHaveBeenCalled();
743
- });
744
- it('does not update if mark is still building', function () {
745
- var onChangeMarks = jest.fn();
746
- var marks = [{
747
- type: 'point',
748
- x: 1,
749
- y: 1,
750
- building: true
751
- }];
752
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
753
- onChangeMarks: onChangeMarks,
754
- marks: marks
755
- });
756
- var graphInstance = new _graph["default"](props);
757
- var existing = marks[0];
758
- var updated = {
759
- type: 'point',
760
- x: 2,
761
- y: 2
762
- };
763
- graphInstance.updateMarks(existing, updated);
764
- expect(onChangeMarks).toHaveBeenCalled();
765
- });
766
- it('preserves mark order when updating', function () {
767
- var onChangeMarks = jest.fn();
768
- var marks = [{
769
- type: 'point',
770
- x: 1,
771
- y: 1
772
- }, {
773
- type: 'point',
774
- x: 2,
775
- y: 2
776
- }, {
777
- type: 'point',
778
- x: 3,
779
- y: 3
780
- }];
781
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
782
- onChangeMarks: onChangeMarks,
783
- marks: marks
784
- });
785
- var graphInstance = new _graph["default"](props);
786
- var existing = marks[1];
787
- var updated = {
788
- type: 'point',
789
- x: 2,
790
- y: 5
791
- };
792
- graphInstance.updateMarks(existing, updated);
793
- var updatedMarks = onChangeMarks.mock.calls[0][0];
794
- expect(updatedMarks[0]).toEqual(marks[0]);
795
- expect(updatedMarks[1]).toEqual(updated);
796
- expect(updatedMarks[2]).toEqual(marks[2]);
797
- });
798
- it('handles empty marks array', function () {
799
- var onChangeMarks = jest.fn();
800
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
801
- onChangeMarks: onChangeMarks,
802
- marks: []
803
- });
804
- var graphInstance = new _graph["default"](props);
805
- var existing = {
806
- type: 'point',
807
- x: 1,
808
- y: 1
809
- };
810
- var updated = {
811
- type: 'point',
812
- x: 2,
813
- y: 2
814
- };
815
- graphInstance.updateMarks(existing, updated, true);
816
- expect(onChangeMarks).toHaveBeenCalledTimes(1);
817
- var updatedMarks = onChangeMarks.mock.calls[0][0];
818
- expect(updatedMarks.length).toBe(1);
819
- expect(updatedMarks[0]).toEqual(updated);
820
- });
821
- });
822
- describe('updateMarks and getComponent integration', function () {
823
- it('updates marks and renders with correct components', function () {
824
- var initialMarks = [{
825
- type: 'point',
826
- x: 2,
827
- y: 2,
828
- label: 'Point',
829
- showLabel: true
830
- }];
831
- var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
832
- marks: initialMarks
833
- }))),
834
- rerender = _render19.rerender,
835
- container = _render19.container;
836
- var updatedMarks = [{
837
- type: 'line',
838
- from: {
839
- x: 0,
840
- y: 0
841
- },
842
- to: {
843
- x: 1,
844
- y: 1
845
- },
846
- label: 'Line'
847
- }];
848
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
849
- marks: updatedMarks
850
- })));
851
- expect(container.querySelector('#marks')).toBeInTheDocument();
852
- });
853
- it('handles adding new marks with different types', function () {
854
- var initialMarks = [{
855
- type: 'point',
856
- x: 2,
857
- y: 2,
858
- label: 'Point',
859
- showLabel: true
860
- }];
861
- var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
862
- marks: initialMarks
863
- }))),
864
- rerender = _render20.rerender,
865
- container = _render20.container;
866
- var updatedMarks = [{
867
- type: 'point',
868
- x: 2,
869
- y: 2,
870
- label: 'Point',
871
- showLabel: true
872
- }, {
873
- type: 'line',
874
- from: {
875
- x: 0,
876
- y: 0
877
- },
878
- to: {
879
- x: 1,
880
- y: 1
881
- },
882
- label: 'Line'
883
- }];
884
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
885
- marks: updatedMarks
886
- })));
887
- expect(container.querySelector('#marks')).toBeInTheDocument();
888
- });
889
- it('handles removing marks', function () {
890
- var initialMarks = [{
891
- type: 'point',
892
- x: 2,
893
- y: 2,
894
- label: 'Point',
895
- showLabel: true
896
- }, {
897
- type: 'line',
898
- from: {
899
- x: 0,
900
- y: 0
901
- },
902
- to: {
903
- x: 1,
904
- y: 1
905
- },
906
- label: 'Line'
907
- }];
908
- var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
909
- marks: initialMarks
910
- }))),
911
- rerender = _render21.rerender,
912
- container = _render21.container;
913
- var updatedMarks = [{
914
- type: 'point',
915
- x: 2,
916
- y: 2,
917
- label: 'Point',
918
- showLabel: true
919
- }];
920
- rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
921
- marks: updatedMarks
922
- })));
923
- expect(container.querySelector('#marks')).toBeInTheDocument();
924
- });
925
- });
926
- });
927
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfdXRpbHMiLCJfZ3JhcGgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl90b29scyIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZXNjcmliZSIsIm1hcmtzIiwidHlwZSIsIngiLCJ5IiwibGFiZWwiLCJzaG93TGFiZWwiLCJmcm9tIiwidG8iLCJidWlsZGluZyIsIml0IiwiZXhwZWN0IiwicmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMiLCJjdXJyZW50VG9vbCIsInRvRXF1YWwiLCJvbkNoYW5nZU1hcmtzIiwiamVzdCIsImZuIiwiZGVmYXVsdFByb3BzIiwiY2xhc3NOYW1lIiwidG9vbHMiLCJ0b29sc0FyciIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImdyYXBoUHJvcHMiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJwcm9wcyIsIl9yZW5kZXIyIiwiX3JlbmRlcjMiLCJfcmVuZGVyNCIsImxhYmVsTW9kZUVuYWJsZWQiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwicmVyZW5kZXIiLCJuZXdNYXJrcyIsIl9leHRlbmRzMiIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyNyIsIm1hcmtzV2l0aEJ1aWxkaW5nIiwiX3JlbmRlcjgiLCJ3cmFwcGVyIiwidXBkYXRlZE1hcmtzIiwiZHVwbGljYXRlZE1hcmtzIiwiX3JlbmRlcjkiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiX3JlbmRlcjEwIiwiX3JlbmRlcjExIiwiY29tcGxldGVkTWFya3MiLCJfcmVuZGVyMTIiLCJfcmVuZGVyMTMiLCJfcmVuZGVyMTQiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJwcm9wc1dpdGhvdXRNYXJrcyIsIl9yZW5kZXIxNyIsImVtcHR5Q29udGFpbmVyIiwiX3JlbmRlcjE4IiwicHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMiLCJncmFwaEluc3RhbmNlIiwiR3JhcGgiLCJtYXJrIiwiY29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwidG9CZU51bGwiLCJwcm9wc1dpdGhFbXB0eVRvb2xzIiwidG9vbFdpdGhvdXRDb21wb25lbnQiLCJwcm9wc1dpdGhDdXN0b21Ub29sIiwidG9CZVRydXRoeSIsInBvaW50TWFyayIsImxpbmVNYXJrIiwiY2lyY2xlTWFyayIsImNlbnRlciIsImVkZ2UiLCJwb2ludENvbXBvbmVudCIsImxpbmVDb21wb25lbnQiLCJjaXJjbGVDb21wb25lbnQiLCJleGlzdGluZyIsInVwZGF0ZU1hcmtzIiwidXBkYXRlZCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIm1vY2siLCJjYWxscyIsInRvQmUiLCJpbml0aWFsTWFya3MiLCJfcmVuZGVyMTkiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjIwIiwiX3JlbmRlcjIxIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9ncmFwaC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgR3JhcGgsIHsgcmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMgfSBmcm9tICcuLi9ncmFwaCc7XG5pbXBvcnQgeyB0b29sc0FyciB9IGZyb20gJy4uL3Rvb2xzJztcblxuZGVzY3JpYmUoJ3JlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzJywgKCkgPT4ge1xuICBsZXQgbWFya3MgPSBbXG4gICAge1xuICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgIHg6IDIsXG4gICAgICB5OiAyLFxuICAgICAgbGFiZWw6ICdQb2ludCcsXG4gICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbGluZScsXG4gICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICB9LFxuICBdO1xuXG4gIGl0KCdrZWVwcyBhbGwgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgdGhlIHNhbWUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzKHsgbWFya3MsIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdsaW5lJyB9IH0pKS50b0VxdWFsKG1hcmtzKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbW92ZXMgYnVpbGRpbmcgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgZGlmZmVyZW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyh7IG1hcmtzLCBjdXJyZW50VG9vbDogeyB0eXBlOiAnZGlmZmVyZW50JyB9IH0pKS50b0VxdWFsKFttYXJrc1swXV0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnR3JhcGgnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjbGFzc05hbWU6ICdjbGFzc05hbWUnLFxuICAgIG9uQ2hhbmdlTWFya3MsXG4gICAgdG9vbHM6IHRvb2xzQXJyLFxuICAgIGRvbWFpbjogeyBtaW46IDAsIG1heDogMSwgc3RlcDogMSB9LFxuICAgIHJhbmdlOiB7IG1pbjogMCwgbWF4OiAxLCBzdGVwOiAxIH0sXG4gICAgc2l6ZTogeyB3aWR0aDogNDAwLCBoZWlnaHQ6IDQwMCB9LFxuICAgIG1hcmtzOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDIsXG4gICAgICAgIHk6IDIsXG4gICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICB9LFxuICAgIF0sXG4gICAgLi4uZ3JhcGhQcm9wcygpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlTWFya3MubW9ja0NsZWFyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY3VycmVudFRvb2wnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBjdXJyZW50VG9vbDogdG9vbHNBcnJbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIG1hcmtzOiBbXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VNYXJrcyB3aGVuIG1hcmtzIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMyxcbiAgICAgICAgICB5OiAzLFxuICAgICAgICAgIGxhYmVsOiAnTmV3IFBvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e25ld01hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggbmV3IG1hcmtzXG4gICAgICAvLyBOb3RlOiBvbkNoYW5nZU1hcmtzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gbWFya3MgYXJlIGNoYW5nZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uLFxuICAgICAgLy8gbm90IHdoZW4gcHJvcHMgY2hhbmdlLCBzbyB3ZSBqdXN0IHZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcnMgY29ycmVjdGx5XG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHVuZGVmaW5lZCBvbkNoYW5nZU1hcmtzIGdyYWNlZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBvbkNoYW5nZU1hcmtzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVtb3ZlcyBidWlsZGluZyBtYXJrcyB3aGVuIGN1cnJlbnRUb29sIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrc1dpdGhCdWlsZGluZyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBtYXJrczogbWFya3NXaXRoQnVpbGRpbmcsXG4gICAgICAgIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdwb2ludCcgfSwgLy8gRGlmZmVyZW50IGZyb20gYnVpbGRpbmcgbWFyayB0eXBlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyBhbiBleGlzdGluZyBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSB3cmFwcGVyO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggdXBkYXRlZCBtYXJrc1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdXBkYXRlIGlmIG1hcmsgaXMgZHVwbGljYXRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXtkdXBsaWNhdGVkTWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGRzIG1hcmsgaWYgYWRkSWZNaXNzaW5nIGlzIHRydWUgYW5kIG1hcmsgZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgc2hvdWxkIGhhbmRsZSBhZGRpbmcgbmV3IG1hcmtzIHRocm91Z2ggdXNlciBpbnRlcmFjdGlvblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGhhcyBubyBidWlsZGluZyBmbGFnIGFuZCBpcyBkdXBsaWNhdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17bWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJ1aWxkaW5nIG1hcmtzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzV2l0aEJ1aWxkaW5nID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyBidWlsZGluZyBtYXJrIHRvIGNvbXBsZXRlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3NXaXRoQnVpbGRpbmcgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZE1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2NvbXBsZXRlZE1hcmtzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkNoYW5nZU1hcmtzIGlmIHVwZGF0ZSBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIElmIHVwZGF0ZSBpcyB1bmRlZmluZWQsIG9uQ2hhbmdlTWFya3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21wb25lbnRcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhZGQgbWFyayBpZiBleGlzdGluZyBpcyBub3QgZm91bmQgYW5kIGFkZElmTWlzc2luZyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gQnkgZGVmYXVsdCwgbWFya3MgYXJlIG5vdCBhZGRlZCBpZiB0aGV5IGRvbid0IGV4aXN0IGFuZCBhZGRJZk1pc3NpbmcgaXMgZmFsc2VcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZU1hcmtzIHdpdGggY29ycmVjdCBtYXJrcyB3aGVuIHVwZGF0aW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgaGFuZGxlcyBtYXJrIHVwZGF0ZXMgaW50ZXJuYWxseVxuICAgICAgLy8gb25DaGFuZ2VNYXJrcyBpcyBjYWxsZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uc1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBvdGhlciBtYXJrcyB3aGVuIHVwZGF0aW5nIGEgc3BlY2lmaWMgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICB4OiAyLFxuICAgICAgICAgIHk6IDIsXG4gICAgICAgICAgbGFiZWw6ICdQb2ludCAxJyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1BvaW50IDInLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gZ2V0Q29tcG9uZW50IHJldHVybnMgbnVsbCBmb3IgbnVsbCBtYXJrc1xuICAgICAgLy8gVGhpcyBpcyB0ZXN0ZWQgYnkgcmVuZGVyaW5nIHdpdGggdW5kZWZpbmVkIG1hcmtzXG4gICAgICBjb25zdCBwcm9wc1dpdGhvdXRNYXJrcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyOiBlbXB0eUNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHNXaXRob3V0TWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChlbXB0eUNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgdG9vbHMgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IHVuZGVmaW5lZCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhVbmRlZmluZWRUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoRW1wdHlUb29scyA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoRW1wdHlUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgdHlwZSBpcyBub3QgZm91bmQgaW4gdG9vbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbm9uZXhpc3RlbnQtdHlwZScsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvbXBvbmVudCBpZiB0b29sIGhhcyBubyBDb21wb25lbnQgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0b29sV2l0aG91dENvbXBvbmVudCA9IFt7IHR5cGU6ICdjdXN0b20nLCBsYWJlbDogJ0N1c3RvbScgfV07XG4gICAgICBjb25zdCBwcm9wc1dpdGhDdXN0b21Ub29sID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB0b29sV2l0aG91dENvbXBvbmVudCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhDdXN0b21Ub29sKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdjdXN0b20nLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgcG9pbnQgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGxpbmUgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgZGlmZmVyZW50IG1hcmsgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IHBvaW50TWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgbGluZU1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY2lyY2xlTWFyayA9IHsgdHlwZTogJ2NpcmNsZScsIGNlbnRlcjogeyB4OiAwLCB5OiAwIH0sIGVkZ2U6IHsgeDogMSwgeTogMSB9IH07XG5cbiAgICAgIGNvbnN0IHBvaW50Q29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQocG9pbnRNYXJrKTtcbiAgICAgIGNvbnN0IGxpbmVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChsaW5lTWFyayk7XG4gICAgICBjb25zdCBjaXJjbGVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChjaXJjbGVNYXJrKTtcblxuICAgICAgZXhwZWN0KHBvaW50Q29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QobGluZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGNpcmNsZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChudWxsKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aFVuZGVmaW5lZFRvb2xzID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB1bmRlZmluZWQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiB0b29scyBpcyBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aEVtcHR5VG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IFtdIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzV2l0aEVtcHR5VG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIHR5cGUgaXMgbm90IGZvdW5kIGluIHRvb2xzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ25vbmV4aXN0ZW50LXR5cGUnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb21wb25lbnQgaWYgdG9vbCBoYXMgbm8gQ29tcG9uZW50IHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbFdpdGhvdXRDb21wb25lbnQgPSBbeyB0eXBlOiAnY3VzdG9tJywgbGFiZWw6ICdDdXN0b20nIH1dO1xuICAgICAgY29uc3QgcHJvcHNXaXRoQ3VzdG9tVG9vbCA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogdG9vbFdpdGhvdXRDb21wb25lbnQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoQ3VzdG9tVG9vbCk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnY3VzdG9tJywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIHBvaW50IG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgY29tcG9uZW50IGZvciBsaW5lIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGRpZmZlcmVudCBtYXJrIHR5cGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuXG4gICAgICBjb25zdCBwb2ludE1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGxpbmVNYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNpcmNsZU1hcmsgPSB7IHR5cGU6ICdjaXJjbGUnLCBjZW50ZXI6IHsgeDogMCwgeTogMCB9LCBlZGdlOiB7IHg6IDEsIHk6IDEgfSB9O1xuXG4gICAgICBjb25zdCBwb2ludENvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KHBvaW50TWFyayk7XG4gICAgICBjb25zdCBsaW5lQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobGluZU1hcmspO1xuICAgICAgY29uc3QgY2lyY2xlQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQoY2lyY2xlTWFyayk7XG5cbiAgICAgIGV4cGVjdChwb2ludENvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChjaXJjbGVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzBdO1xuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgbnVsbCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1bmRlZmluZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGV4aXN0aW5nIG1hcmsgd2hlbiBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFtcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH0sXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uQ2hhbmdlTWFya3MsIG1hcmtzIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXJrc1swXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDMgfTtcblxuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgdXBkYXRlZCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBvbkNoYW5nZU1hcmtzLm1vY2suY2FsbHNbMF1bMF07XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzBdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1sxXSkudG9FcXVhbChtYXJrc1sxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWRkcyBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyB0cnVlIGFuZCBtYXJrIG5vdCBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0geyB0eXBlOiAncG9pbnQnLCB4OiA1LCB5OiA1IH07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQsIHRydWUpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrcy5sZW5ndGgpLnRvQmUoMik7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFkZCBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyBmYWxzZSBhbmQgbWFyayBub3QgZm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogNSwgeTogNSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGlzIHN0aWxsIGJ1aWxkaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSwgYnVpbGRpbmc6IHRydWUgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBtYXJrIG9yZGVyIHdoZW4gdXBkYXRpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9LFxuICAgICAgICB7IHR5cGU6ICdwb2ludCcsIHg6IDIsIHk6IDIgfSxcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAzLCB5OiAzIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzFdO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogNSB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkKTtcblxuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbChtYXJrc1swXSk7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1syXSkudG9FcXVhbChtYXJrc1syXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlTWFya3MpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IG9uQ2hhbmdlTWFya3MubW9jay5jYWxsc1swXVswXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkTWFya3MubGVuZ3RoKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbCh1cGRhdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIGFuZCBnZXRDb21wb25lbnQgaW50ZWdyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3VwZGF0ZXMgbWFya3MgYW5kIHJlbmRlcnMgd2l0aCBjb3JyZWN0IGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2luaXRpYWxNYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgdG86IHsgeDogMSwgeTogMSB9LFxuICAgICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e3VwZGF0ZWRNYXJrc30gLz4pO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNtYXJrcycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgYWRkaW5nIG5ldyBtYXJrcyB3aXRoIGRpZmZlcmVudCB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyByZW1vdmluZyBtYXJrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFvQyxTQUFBSSx3QkFBQUUsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUosdUJBQUEsWUFBQUEsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEs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