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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/lib/__tests__/bg.test.js +282 -0
  2. package/lib/__tests__/coordinates-label.test.js +276 -0
  3. package/lib/__tests__/graph-with-controls.test.js +275 -0
  4. package/lib/__tests__/graph.test.js +927 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/key-legend.test.js +321 -0
  8. package/lib/__tests__/label-svg-icon.test.js +373 -0
  9. package/lib/__tests__/labels.test.js +61 -0
  10. package/lib/__tests__/mark-label.test.js +133 -0
  11. package/lib/__tests__/toggle-bar.test.js +197 -0
  12. package/lib/__tests__/tool-menu.test.js +151 -0
  13. package/lib/__tests__/undo-redo.test.js +31 -0
  14. package/lib/__tests__/use-debounce.test.js +24 -0
  15. package/lib/__tests__/utils.js +70 -0
  16. package/lib/__tests__/utils.test.js +123 -0
  17. package/lib/axis/__tests__/arrow.test.js +60 -0
  18. package/lib/axis/__tests__/axes.test.js +195 -0
  19. package/lib/axis/arrow.js +1 -1
  20. package/lib/axis/axes.js +1 -1
  21. package/lib/axis/index.js +1 -1
  22. package/lib/bg.js +1 -1
  23. package/lib/container/__tests__/actions.test.js +108 -0
  24. package/lib/container/__tests__/index.test.js +503 -0
  25. package/lib/container/__tests__/marks.test.js +259 -0
  26. package/lib/container/__tests__/middleware.test.js +244 -0
  27. package/lib/container/__tests__/reducer.test.js +450 -0
  28. package/lib/container/actions.js +1 -1
  29. package/lib/container/index.js +1 -1
  30. package/lib/container/marks.js +1 -1
  31. package/lib/container/middleware.js +1 -1
  32. package/lib/container/reducer.js +1 -1
  33. package/lib/coordinates-label.js +1 -1
  34. package/lib/graph-with-controls.js +1 -1
  35. package/lib/graph.js +1 -1
  36. package/lib/grid-setup.js +1 -1
  37. package/lib/grid.js +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/key-legend.js +1 -1
  40. package/lib/label-svg-icon.js +1 -1
  41. package/lib/labels.js +1 -1
  42. package/lib/mark-label.js +1 -1
  43. package/lib/toggle-bar.js +1 -1
  44. package/lib/tool-menu.js +1 -1
  45. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  46. package/lib/tools/absolute/component.js +1 -1
  47. package/lib/tools/absolute/index.js +1 -1
  48. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  49. package/lib/tools/circle/__tests__/component.test.js +615 -0
  50. package/lib/tools/circle/__tests__/index.test.js +576 -0
  51. package/lib/tools/circle/bg-circle.js +1 -1
  52. package/lib/tools/circle/component.js +1 -1
  53. package/lib/tools/circle/index.js +1 -1
  54. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  55. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  56. package/lib/tools/exponential/component.js +1 -1
  57. package/lib/tools/exponential/index.js +1 -1
  58. package/lib/tools/index.js +1 -1
  59. package/lib/tools/line/__tests__/component.test.js +45 -0
  60. package/lib/tools/line/component.js +1 -1
  61. package/lib/tools/line/index.js +1 -1
  62. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  63. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  64. package/lib/tools/parabola/component.js +1 -1
  65. package/lib/tools/parabola/index.js +1 -1
  66. package/lib/tools/point/__tests__/component.test.js +434 -0
  67. package/lib/tools/point/__tests__/index.test.js +262 -0
  68. package/lib/tools/point/component.js +1 -1
  69. package/lib/tools/point/index.js +1 -1
  70. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  71. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  72. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  73. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  74. package/lib/tools/polygon/component.js +1 -1
  75. package/lib/tools/polygon/index.js +1 -1
  76. package/lib/tools/polygon/line.js +1 -1
  77. package/lib/tools/polygon/polygon.js +1 -1
  78. package/lib/tools/ray/__tests__/component.test.js +35 -0
  79. package/lib/tools/ray/component.js +1 -1
  80. package/lib/tools/ray/index.js +1 -1
  81. package/lib/tools/segment/__tests__/component.test.js +35 -0
  82. package/lib/tools/segment/component.js +1 -1
  83. package/lib/tools/segment/index.js +1 -1
  84. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  85. package/lib/tools/shared/arrow-head.js +1 -1
  86. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  87. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  88. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  89. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  90. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  91. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  92. package/lib/tools/shared/line/index.js +1 -1
  93. package/lib/tools/shared/line/line-path.js +1 -1
  94. package/lib/tools/shared/line/with-root-edge.js +1 -1
  95. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  96. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  97. package/lib/tools/shared/point/arrow-point.js +1 -1
  98. package/lib/tools/shared/point/arrow.js +1 -1
  99. package/lib/tools/shared/point/base-point.js +1 -1
  100. package/lib/tools/shared/point/index.js +1 -1
  101. package/lib/tools/shared/styles.js +1 -1
  102. package/lib/tools/shared/types.js +1 -1
  103. package/lib/tools/sine/__tests__/component.test.js +72 -0
  104. package/lib/tools/sine/component.js +1 -1
  105. package/lib/tools/sine/index.js +1 -1
  106. package/lib/tools/vector/__tests__/component.test.js +32 -0
  107. package/lib/tools/vector/component.js +1 -1
  108. package/lib/tools/vector/index.js +1 -1
  109. package/lib/undo-redo.js +1 -1
  110. package/lib/use-debounce.js +1 -1
  111. package/lib/utils.js +1 -1
  112. package/package.json +9 -12
  113. package/LICENSE.md +0 -5
@@ -0,0 +1,729 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
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 _gridSetup = _interopRequireDefault(require("../grid-setup"));
10
+ 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; }
11
+ 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; }
12
+ var mockOnChange = jest.fn();
13
+ var mockOnChangeView = jest.fn();
14
+ var defaultProps = {
15
+ domain: {
16
+ min: -5,
17
+ max: 5,
18
+ step: 1,
19
+ labelStep: 1,
20
+ axisLabel: 'x'
21
+ },
22
+ range: {
23
+ min: -5,
24
+ max: 5,
25
+ step: 1,
26
+ labelStep: 1,
27
+ axisLabel: 'y'
28
+ },
29
+ size: {
30
+ width: 480,
31
+ height: 480
32
+ },
33
+ sizeConstraints: {
34
+ min: 300,
35
+ max: 900,
36
+ step: 10
37
+ },
38
+ includeAxes: true,
39
+ standardGrid: false,
40
+ displayedFields: {
41
+ axisLabel: {
42
+ enabled: true,
43
+ label: 'Axis Label'
44
+ },
45
+ min: {
46
+ enabled: true,
47
+ label: 'Min'
48
+ },
49
+ max: {
50
+ enabled: true,
51
+ label: 'Max'
52
+ },
53
+ step: {
54
+ enabled: true,
55
+ label: 'Interval'
56
+ },
57
+ labelStep: {
58
+ enabled: true,
59
+ label: 'Label Interval'
60
+ },
61
+ dimensionsEnabled: true,
62
+ includeAxesEnabled: true,
63
+ standardGridEnabled: true
64
+ },
65
+ gridValues: {
66
+ domain: [1, 2, 5, 10],
67
+ range: [1, 2, 5, 10]
68
+ },
69
+ labelValues: {
70
+ domain: [0, 1, 2],
71
+ range: [0, 1, 2]
72
+ },
73
+ onChange: mockOnChange,
74
+ onChangeView: mockOnChangeView
75
+ };
76
+ describe('GridSetup', function () {
77
+ beforeEach(function () {
78
+ jest.clearAllMocks();
79
+ });
80
+ describe('rendering', function () {
81
+ it('renders without crashing', function () {
82
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
83
+ container = _render.container;
84
+ expect(container).toBeTruthy();
85
+ });
86
+ it('renders accordion with title', function () {
87
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
88
+ getByText = _render2.getByText;
89
+ expect(getByText('Customize Grid Setup')).toBeTruthy();
90
+ });
91
+ it('renders Include axes toggle when enabled', function () {
92
+ var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
93
+ getByText = _render3.getByText;
94
+ expect(getByText('Include axes and labels?')).toBeTruthy();
95
+ });
96
+ it('does not render Include axes toggle when disabled', function () {
97
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
98
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
99
+ includeAxesEnabled: false
100
+ })
101
+ });
102
+ var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
103
+ queryByText = _render4.queryByText;
104
+ expect(queryByText('Include axes and labels?')).toBeFalsy();
105
+ });
106
+ it('renders standard grid toggle when enabled', function () {
107
+ var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
108
+ getByText = _render5.getByText;
109
+ expect(getByText('Constrain to standard coordinate grid?')).toBeTruthy();
110
+ });
111
+ it('does not render standard grid toggle when disabled', function () {
112
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
113
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
114
+ standardGridEnabled: false
115
+ })
116
+ });
117
+ var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
118
+ queryByText = _render6.queryByText;
119
+ expect(queryByText('Constrain to standard coordinate grid?')).toBeFalsy();
120
+ });
121
+ it('renders dimensions section when enabled', function () {
122
+ var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
123
+ getByText = _render7.getByText;
124
+ expect(getByText('Dimensions(px)')).toBeTruthy();
125
+ expect(getByText(/Min 300, Max 900/)).toBeTruthy();
126
+ });
127
+ it('does not render dimensions section when disabled', function () {
128
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
129
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
130
+ dimensionsEnabled: false
131
+ })
132
+ });
133
+ var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
134
+ queryByText = _render8.queryByText;
135
+ expect(queryByText('Dimensions(px)')).toBeFalsy();
136
+ });
137
+ });
138
+ describe('axes configuration', function () {
139
+ it('renders axis headers when includeAxes is true', function () {
140
+ var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
141
+ container = _render9.container;
142
+ var xAxisHeader = container.querySelector('i');
143
+ expect(xAxisHeader === null || xAxisHeader === void 0 ? void 0 : xAxisHeader.textContent).toBe('x');
144
+ });
145
+ it('renders min/max fields when enabled', function () {
146
+ var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
147
+ getAllByLabelText = _render0.getAllByLabelText;
148
+ var minFields = getAllByLabelText('Min');
149
+ var maxFields = getAllByLabelText('Max');
150
+ expect(minFields.length).toBe(2); // domain and range
151
+ expect(maxFields.length).toBe(2); // domain and range
152
+ });
153
+ it('does not render min/max fields when disabled', function () {
154
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
155
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
156
+ min: {
157
+ enabled: false
158
+ },
159
+ max: {
160
+ enabled: false
161
+ }
162
+ })
163
+ });
164
+ var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
165
+ queryByLabelText = _render1.queryByLabelText;
166
+ expect(queryByLabelText('Min')).toBeFalsy();
167
+ expect(queryByLabelText('Max')).toBeFalsy();
168
+ });
169
+ it('renders axis label fields when enabled', function () {
170
+ var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
171
+ getAllByText = _render10.getAllByText;
172
+ var axisLabelFields = getAllByText('Axis Label');
173
+ expect(axisLabelFields.length).toBe(2); // domain and range
174
+ });
175
+ it('does not render axis label fields when disabled', function () {
176
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
177
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
178
+ axisLabel: {
179
+ enabled: false
180
+ }
181
+ })
182
+ });
183
+ var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
184
+ queryByText = _render11.queryByText;
185
+ expect(queryByText('Axis Label')).toBeFalsy();
186
+ });
187
+ it('renders step and labelStep fields when enabled', function () {
188
+ var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
189
+ getAllByLabelText = _render12.getAllByLabelText;
190
+ var intervalFields = getAllByLabelText('Interval');
191
+ var labelIntervalFields = getAllByLabelText('Label Interval');
192
+ expect(intervalFields.length).toBe(2); // domain and range
193
+ expect(labelIntervalFields.length).toBe(2); // domain and range
194
+ });
195
+ it('does not render step fields when disabled', function () {
196
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
197
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
198
+ step: {
199
+ enabled: false
200
+ }
201
+ })
202
+ });
203
+ var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
204
+ queryByLabelText = _render13.queryByLabelText;
205
+ expect(queryByLabelText('Interval')).toBeFalsy();
206
+ });
207
+ it('does not render labelStep fields when disabled', function () {
208
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
209
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
210
+ labelStep: {
211
+ enabled: false
212
+ }
213
+ })
214
+ });
215
+ var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
216
+ queryByLabelText = _render14.queryByLabelText;
217
+ expect(queryByLabelText('Label Interval')).toBeFalsy();
218
+ });
219
+ it('displays axis visibility hint when min/max enabled', function () {
220
+ var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
221
+ getByText = _render15.getByText;
222
+ expect(getByText('If you want the axis to be visible, use a zero or negative Min Value, and a positive Max Value')).toBeTruthy();
223
+ });
224
+ it('displays unnumbered gridlines hint when labelStep enabled', function () {
225
+ var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
226
+ getByText = _render16.getByText;
227
+ expect(getByText('For unnumbered gridlines, enter a label interval of 0')).toBeTruthy();
228
+ });
229
+ });
230
+ describe('gridlines configuration', function () {
231
+ it('renders gridlines config when includeAxes is false', function () {
232
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
233
+ includeAxes: false
234
+ });
235
+ var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
236
+ getByLabelText = _render17.getByLabelText;
237
+ expect(getByLabelText('Number of Vertical Gridlines')).toBeTruthy();
238
+ expect(getByLabelText('Number of Horizontal Gridlines')).toBeTruthy();
239
+ });
240
+ it('does not render axes config when includeAxes is false', function () {
241
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
242
+ includeAxes: false
243
+ });
244
+ var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
245
+ queryByText = _render18.queryByText;
246
+ expect(queryByText('Axis Label')).toBeFalsy();
247
+ });
248
+ it('does not render gridlines config when max is disabled', function () {
249
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
250
+ includeAxes: false,
251
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
252
+ max: {
253
+ enabled: false
254
+ }
255
+ })
256
+ });
257
+ var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
258
+ queryByLabelText = _render19.queryByLabelText;
259
+ expect(queryByLabelText('Number of Vertical Gridlines')).toBeFalsy();
260
+ expect(queryByLabelText('Number of Horizontal Gridlines')).toBeFalsy();
261
+ });
262
+ });
263
+ describe('user interactions', function () {
264
+ it('calls onChange when includeAxes toggle is clicked', function () {
265
+ var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
266
+ container = _render20.container;
267
+ var toggleInput = container.querySelector('input[type="checkbox"]');
268
+ _testUtils.fireEvent.click(toggleInput);
269
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
270
+ includeAxes: false
271
+ }));
272
+ });
273
+ it('calls onChange with proper config when includeAxes is disabled', function () {
274
+ var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
275
+ container = _render21.container;
276
+ var toggleInput = container.querySelector('input[type="checkbox"]');
277
+ _testUtils.fireEvent.click(toggleInput);
278
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
279
+ includeAxes: false,
280
+ domain: expect.objectContaining({
281
+ min: 1,
282
+ max: 5,
283
+ step: 1,
284
+ labelStep: 0
285
+ }),
286
+ range: expect.objectContaining({
287
+ min: 1,
288
+ max: 5,
289
+ step: 1,
290
+ labelStep: 0
291
+ })
292
+ }));
293
+ });
294
+ it('calls onChange with proper config when includeAxes is enabled', function () {
295
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
296
+ includeAxes: false
297
+ });
298
+ var _render22 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
299
+ container = _render22.container;
300
+ var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
301
+ var includeAxesToggle = toggleInputs[0]; // First toggle is includeAxes
302
+
303
+ _testUtils.fireEvent.click(includeAxesToggle);
304
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
305
+ includeAxes: true,
306
+ domain: expect.objectContaining({
307
+ labelStep: 1
308
+ }),
309
+ range: expect.objectContaining({
310
+ labelStep: 1
311
+ })
312
+ }));
313
+ });
314
+ it('calls onChange when standardGrid toggle is clicked', function () {
315
+ var _render23 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
316
+ container = _render23.container;
317
+ var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
318
+ var standardGridToggle = toggleInputs[1]; // Second toggle is standardGrid
319
+
320
+ _testUtils.fireEvent.click(standardGridToggle);
321
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
322
+ standardGrid: true,
323
+ graph: expect.objectContaining({
324
+ width: 480,
325
+ height: 480
326
+ })
327
+ }));
328
+ });
329
+ it('calls onChange when width is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
330
+ var _render24, getAllByLabelText, widthInput;
331
+ return _regenerator["default"].wrap(function (_context) {
332
+ while (1) switch (_context.prev = _context.next) {
333
+ case 0:
334
+ _render24 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render24.getAllByLabelText;
335
+ widthInput = getAllByLabelText('Width')[0];
336
+ _testUtils.fireEvent.change(widthInput, {
337
+ target: {
338
+ value: '500'
339
+ }
340
+ });
341
+ _testUtils.fireEvent.blur(widthInput);
342
+ _context.next = 1;
343
+ return (0, _testUtils.waitFor)(function () {
344
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
345
+ graph: expect.objectContaining({
346
+ width: 500
347
+ })
348
+ }));
349
+ });
350
+ case 1:
351
+ case "end":
352
+ return _context.stop();
353
+ }
354
+ }, _callee);
355
+ })));
356
+ it('calls onChange when height is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
357
+ var _render25, getAllByLabelText, heightInput;
358
+ return _regenerator["default"].wrap(function (_context2) {
359
+ while (1) switch (_context2.prev = _context2.next) {
360
+ case 0:
361
+ _render25 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render25.getAllByLabelText;
362
+ heightInput = getAllByLabelText('Height')[0];
363
+ _testUtils.fireEvent.change(heightInput, {
364
+ target: {
365
+ value: '520'
366
+ }
367
+ });
368
+ _testUtils.fireEvent.blur(heightInput);
369
+ _context2.next = 1;
370
+ return (0, _testUtils.waitFor)(function () {
371
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
372
+ graph: expect.objectContaining({
373
+ height: 520
374
+ })
375
+ }));
376
+ });
377
+ case 1:
378
+ case "end":
379
+ return _context2.stop();
380
+ }
381
+ }, _callee2);
382
+ })));
383
+ it('updates both width and height when standardGrid is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
384
+ var props, _render26, getAllByLabelText, widthInput;
385
+ return _regenerator["default"].wrap(function (_context3) {
386
+ while (1) switch (_context3.prev = _context3.next) {
387
+ case 0:
388
+ props = _objectSpread(_objectSpread({}, defaultProps), {}, {
389
+ standardGrid: true
390
+ });
391
+ _render26 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render26.getAllByLabelText;
392
+ widthInput = getAllByLabelText('Width')[0];
393
+ _testUtils.fireEvent.change(widthInput, {
394
+ target: {
395
+ value: '600'
396
+ }
397
+ });
398
+ _testUtils.fireEvent.blur(widthInput);
399
+ _context3.next = 1;
400
+ return (0, _testUtils.waitFor)(function () {
401
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
402
+ graph: expect.objectContaining({
403
+ width: 600,
404
+ height: 600
405
+ })
406
+ }));
407
+ });
408
+ case 1:
409
+ case "end":
410
+ return _context3.stop();
411
+ }
412
+ }, _callee3);
413
+ })));
414
+ it('calls onChange when domain min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
415
+ var _render27, getAllByLabelText, minInputs, domainMinInput;
416
+ return _regenerator["default"].wrap(function (_context4) {
417
+ while (1) switch (_context4.prev = _context4.next) {
418
+ case 0:
419
+ _render27 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render27.getAllByLabelText;
420
+ minInputs = getAllByLabelText('Min');
421
+ domainMinInput = minInputs[0];
422
+ _testUtils.fireEvent.change(domainMinInput, {
423
+ target: {
424
+ value: '-10'
425
+ }
426
+ });
427
+ _testUtils.fireEvent.blur(domainMinInput);
428
+ _context4.next = 1;
429
+ return (0, _testUtils.waitFor)(function () {
430
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
431
+ domain: expect.objectContaining({
432
+ min: -10
433
+ })
434
+ }));
435
+ });
436
+ case 1:
437
+ case "end":
438
+ return _context4.stop();
439
+ }
440
+ }, _callee4);
441
+ })));
442
+ it('calls onChange when domain max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
443
+ var _render28, getAllByLabelText, maxInputs, domainMaxInput;
444
+ return _regenerator["default"].wrap(function (_context5) {
445
+ while (1) switch (_context5.prev = _context5.next) {
446
+ case 0:
447
+ _render28 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render28.getAllByLabelText;
448
+ maxInputs = getAllByLabelText('Max');
449
+ domainMaxInput = maxInputs[0];
450
+ _testUtils.fireEvent.change(domainMaxInput, {
451
+ target: {
452
+ value: '10'
453
+ }
454
+ });
455
+ _testUtils.fireEvent.blur(domainMaxInput);
456
+ _context5.next = 1;
457
+ return (0, _testUtils.waitFor)(function () {
458
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
459
+ domain: expect.objectContaining({
460
+ max: 10
461
+ })
462
+ }));
463
+ });
464
+ case 1:
465
+ case "end":
466
+ return _context5.stop();
467
+ }
468
+ }, _callee5);
469
+ })));
470
+ it('calls onChange when range min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
471
+ var _render29, getAllByLabelText, minInputs, rangeMinInput;
472
+ return _regenerator["default"].wrap(function (_context6) {
473
+ while (1) switch (_context6.prev = _context6.next) {
474
+ case 0:
475
+ _render29 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render29.getAllByLabelText;
476
+ minInputs = getAllByLabelText('Min');
477
+ rangeMinInput = minInputs[1];
478
+ _testUtils.fireEvent.change(rangeMinInput, {
479
+ target: {
480
+ value: '-8'
481
+ }
482
+ });
483
+ _testUtils.fireEvent.blur(rangeMinInput);
484
+ _context6.next = 1;
485
+ return (0, _testUtils.waitFor)(function () {
486
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
487
+ range: expect.objectContaining({
488
+ min: -8
489
+ })
490
+ }));
491
+ });
492
+ case 1:
493
+ case "end":
494
+ return _context6.stop();
495
+ }
496
+ }, _callee6);
497
+ })));
498
+ it('calls onChange when range max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
499
+ var _render30, getAllByLabelText, maxInputs, rangeMaxInput;
500
+ return _regenerator["default"].wrap(function (_context7) {
501
+ while (1) switch (_context7.prev = _context7.next) {
502
+ case 0:
503
+ _render30 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render30.getAllByLabelText;
504
+ maxInputs = getAllByLabelText('Max');
505
+ rangeMaxInput = maxInputs[1];
506
+ _testUtils.fireEvent.change(rangeMaxInput, {
507
+ target: {
508
+ value: '12'
509
+ }
510
+ });
511
+ _testUtils.fireEvent.blur(rangeMaxInput);
512
+ _context7.next = 1;
513
+ return (0, _testUtils.waitFor)(function () {
514
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
515
+ range: expect.objectContaining({
516
+ max: 12
517
+ })
518
+ }));
519
+ });
520
+ case 1:
521
+ case "end":
522
+ return _context7.stop();
523
+ }
524
+ }, _callee7);
525
+ })));
526
+ it('updates both domain and range when standardGrid is true and domain changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
527
+ var props, _render31, getAllByLabelText, minInputs, domainMinInput;
528
+ return _regenerator["default"].wrap(function (_context8) {
529
+ while (1) switch (_context8.prev = _context8.next) {
530
+ case 0:
531
+ props = _objectSpread(_objectSpread({}, defaultProps), {}, {
532
+ standardGrid: true
533
+ });
534
+ _render31 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render31.getAllByLabelText;
535
+ minInputs = getAllByLabelText('Min');
536
+ domainMinInput = minInputs[0];
537
+ _testUtils.fireEvent.change(domainMinInput, {
538
+ target: {
539
+ value: '-15'
540
+ }
541
+ });
542
+ _testUtils.fireEvent.blur(domainMinInput);
543
+ _context8.next = 1;
544
+ return (0, _testUtils.waitFor)(function () {
545
+ expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
546
+ domain: expect.objectContaining({
547
+ min: -15
548
+ }),
549
+ range: expect.objectContaining({
550
+ min: -15
551
+ })
552
+ }));
553
+ });
554
+ case 1:
555
+ case "end":
556
+ return _context8.stop();
557
+ }
558
+ }, _callee8);
559
+ })));
560
+ it('does not update range when domain axisLabel changes with standardGrid', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
561
+ var props, _render32, container, axisLabelInputs;
562
+ return _regenerator["default"].wrap(function (_context9) {
563
+ while (1) switch (_context9.prev = _context9.next) {
564
+ case 0:
565
+ props = _objectSpread(_objectSpread({}, defaultProps), {}, {
566
+ standardGrid: true
567
+ });
568
+ _render32 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), container = _render32.container; // EditableHTML change is harder to trigger, but we can test the handler directly
569
+ // by verifying the range doesn't get the axisLabel value from domain
570
+ axisLabelInputs = container.querySelectorAll('[contenteditable="true"]');
571
+ if (!(axisLabelInputs.length > 0)) {
572
+ _context9.next = 1;
573
+ break;
574
+ }
575
+ _testUtils.fireEvent.input(axisLabelInputs[0], {
576
+ target: {
577
+ innerHTML: 'X-Axis'
578
+ }
579
+ });
580
+ _context9.next = 1;
581
+ return (0, _testUtils.waitFor)(function () {
582
+ if (mockOnChange.mock.calls.length > 0) {
583
+ var _lastCall$range;
584
+ var lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
585
+ // range.axisLabel should not be 'X-Axis', it should keep its original value
586
+ expect((_lastCall$range = lastCall.range) === null || _lastCall$range === void 0 ? void 0 : _lastCall$range.axisLabel).not.toBe('X-Axis');
587
+ }
588
+ });
589
+ case 1:
590
+ case "end":
591
+ return _context9.stop();
592
+ }
593
+ }, _callee9);
594
+ })));
595
+ it('calls onChangeView when accordion is toggled', function () {
596
+ var _render33 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
597
+ container = _render33.container;
598
+ var accordionSummary = container.querySelector('[aria-expanded]');
599
+ _testUtils.fireEvent.click(accordionSummary);
600
+ expect(mockOnChangeView).toHaveBeenCalled();
601
+ });
602
+ });
603
+ describe('disabled states', function () {
604
+ it('disables range fields when standardGrid is true', function () {
605
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
606
+ standardGrid: true
607
+ });
608
+ var _render34 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
609
+ getAllByLabelText = _render34.getAllByLabelText;
610
+ var minInputs = getAllByLabelText('Min');
611
+ var rangeMinInput = minInputs[1];
612
+ expect(rangeMinInput).toBeDisabled();
613
+ });
614
+ it('disables height field when standardGrid is true', function () {
615
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
616
+ standardGrid: true
617
+ });
618
+ var _render35 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
619
+ getAllByLabelText = _render35.getAllByLabelText;
620
+ var heightInput = getAllByLabelText('Height')[0];
621
+ expect(heightInput).toBeDisabled();
622
+ });
623
+ it('disables horizontal gridlines field when standardGrid is true and includeAxes is false', function () {
624
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
625
+ includeAxes: false,
626
+ standardGrid: true
627
+ });
628
+ var _render36 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
629
+ getByLabelText = _render36.getByLabelText;
630
+ var horizontalGridlinesInput = getByLabelText('Number of Horizontal Gridlines');
631
+ expect(horizontalGridlinesInput).toBeDisabled();
632
+ });
633
+ });
634
+ describe('GridConfig component', function () {
635
+ it('renders step field when enabled', function () {
636
+ var _render37 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
637
+ getAllByLabelText = _render37.getAllByLabelText;
638
+ var intervalFields = getAllByLabelText('Interval');
639
+ expect(intervalFields.length).toBeGreaterThan(0);
640
+ });
641
+ it('renders labelStep field when enabled', function () {
642
+ var _render38 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
643
+ getAllByLabelText = _render38.getAllByLabelText;
644
+ var labelIntervalFields = getAllByLabelText('Label Interval');
645
+ expect(labelIntervalFields.length).toBeGreaterThan(0);
646
+ });
647
+ it('does not render when both step and labelStep are disabled', function () {
648
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
649
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
650
+ step: {
651
+ enabled: false
652
+ },
653
+ labelStep: {
654
+ enabled: false
655
+ }
656
+ })
657
+ });
658
+ var _render39 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
659
+ queryByLabelText = _render39.queryByLabelText;
660
+ expect(queryByLabelText('Interval')).toBeFalsy();
661
+ expect(queryByLabelText('Label Interval')).toBeFalsy();
662
+ });
663
+ });
664
+ describe('AxisConfig component', function () {
665
+ it('renders x-axis header', function () {
666
+ var _render40 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
667
+ container = _render40.container;
668
+ var headers = container.querySelectorAll('i');
669
+ var xAxisHeader = Array.from(headers).find(function (h) {
670
+ return h.textContent === 'x';
671
+ });
672
+ expect(xAxisHeader).toBeTruthy();
673
+ });
674
+ it('renders y-axis header', function () {
675
+ var _render41 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
676
+ container = _render41.container;
677
+ var headers = container.querySelectorAll('i');
678
+ var yAxisHeader = Array.from(headers).find(function (h) {
679
+ return h.textContent === 'y';
680
+ });
681
+ expect(yAxisHeader).toBeTruthy();
682
+ });
683
+ it('does not render headers when all fields are disabled', function () {
684
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
685
+ displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
686
+ min: {
687
+ enabled: false
688
+ },
689
+ max: {
690
+ enabled: false
691
+ },
692
+ axisLabel: {
693
+ enabled: false
694
+ },
695
+ step: {
696
+ enabled: false
697
+ },
698
+ labelStep: {
699
+ enabled: false
700
+ }
701
+ })
702
+ });
703
+ var _render42 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
704
+ container = _render42.container;
705
+ var headers = container.querySelectorAll('i');
706
+ var axisHeaders = Array.from(headers).filter(function (h) {
707
+ return h.textContent === 'x' || h.textContent === 'y';
708
+ });
709
+ expect(axisHeaders.length).toBe(0);
710
+ });
711
+ });
712
+ describe('Accordion behavior', function () {
713
+ it('renders with correct transition props', function () {
714
+ var _render43 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
715
+ container = _render43.container;
716
+ var accordion = container.querySelector('.MuiAccordion-root');
717
+ expect(accordion).toBeTruthy();
718
+ });
719
+ it('expands and collapses accordion', function () {
720
+ var _render44 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
721
+ container = _render44.container;
722
+ var accordionSummary = container.querySelector('[aria-expanded]');
723
+ expect(accordionSummary.getAttribute('aria-expanded')).toBe('false');
724
+ _testUtils.fireEvent.click(accordionSummary);
725
+ expect(mockOnChangeView).toHaveBeenCalled();
726
+ });
727
+ });
728
+ });
729
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfZ3JpZFNldHVwIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtb2NrT25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJtb2NrT25DaGFuZ2VWaWV3IiwiZGVmYXVsdFByb3BzIiwiZG9tYWluIiwibWluIiwibWF4Iiwic3RlcCIsImxhYmVsU3RlcCIsImF4aXNMYWJlbCIsInJhbmdlIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwic2l6ZUNvbnN0cmFpbnRzIiwiaW5jbHVkZUF4ZXMiLCJzdGFuZGFyZEdyaWQiLCJkaXNwbGF5ZWRGaWVsZHMiLCJlbmFibGVkIiwibGFiZWwiLCJkaW1lbnNpb25zRW5hYmxlZCIsImluY2x1ZGVBeGVzRW5hYmxlZCIsInN0YW5kYXJkR3JpZEVuYWJsZWQiLCJncmlkVmFsdWVzIiwibGFiZWxWYWx1ZXMiLCJvbkNoYW5nZSIsIm9uQ2hhbmdlVmlldyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZVRydXRoeSIsIl9yZW5kZXIyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlcjMiLCJwcm9wcyIsIl9yZW5kZXI0IiwicXVlcnlCeVRleHQiLCJ0b0JlRmFsc3kiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJfcmVuZGVyOCIsIl9yZW5kZXI5IiwieEF4aXNIZWFkZXIiLCJxdWVyeVNlbGVjdG9yIiwidGV4dENvbnRlbnQiLCJ0b0JlIiwiX3JlbmRlcjAiLCJnZXRBbGxCeUxhYmVsVGV4dCIsIm1pbkZpZWxkcyIsIm1heEZpZWxkcyIsIl9yZW5kZXIxIiwicXVlcnlCeUxhYmVsVGV4dCIsIl9yZW5kZXIxMCIsImdldEFsbEJ5VGV4dCIsImF4aXNMYWJlbEZpZWxkcyIsIl9yZW5kZXIxMSIsIl9yZW5kZXIxMiIsImludGVydmFsRmllbGRzIiwibGFiZWxJbnRlcnZhbEZpZWxkcyIsIl9yZW5kZXIxMyIsIl9yZW5kZXIxNCIsIl9yZW5kZXIxNSIsIl9yZW5kZXIxNiIsIl9yZW5kZXIxNyIsImdldEJ5TGFiZWxUZXh0IiwiX3JlbmRlcjE4IiwiX3JlbmRlcjE5IiwiX3JlbmRlcjIwIiwidG9nZ2xlSW5wdXQiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsIl9yZW5kZXIyMSIsIl9yZW5kZXIyMiIsInRvZ2dsZUlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpbmNsdWRlQXhlc1RvZ2dsZSIsIl9yZW5kZXIyMyIsInN0YW5kYXJkR3JpZFRvZ2dsZSIsImdyYXBoIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVuZGVyMjQiLCJ3aWR0aElucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJjaGFuZ2UiLCJ0YXJnZXQiLCJ2YWx1ZSIsImJsdXIiLCJ3YWl0Rm9yIiwic3RvcCIsIl9jYWxsZWUyIiwiX3JlbmRlcjI1IiwiaGVpZ2h0SW5wdXQiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9yZW5kZXIyNiIsIl9jb250ZXh0MyIsIl9jYWxsZWU0IiwiX3JlbmRlcjI3IiwibWluSW5wdXRzIiwiZG9tYWluTWluSW5wdXQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9yZW5kZXIyOCIsIm1heElucHV0cyIsImRvbWFpbk1heElucHV0IiwiX2NvbnRleHQ1IiwiX2NhbGxlZTYiLCJfcmVuZGVyMjkiLCJyYW5nZU1pbklucHV0IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfcmVuZGVyMzAiLCJyYW5nZU1heElucHV0IiwiX2NvbnRleHQ3IiwiX2NhbGxlZTgiLCJfcmVuZGVyMzEiLCJfY29udGV4dDgiLCJfY2FsbGVlOSIsIl9yZW5kZXIzMiIsImF4aXNMYWJlbElucHV0cyIsIl9jb250ZXh0OSIsImlucHV0IiwiaW5uZXJIVE1MIiwibW9jayIsImNhbGxzIiwiX2xhc3RDYWxsJHJhbmdlIiwibGFzdENhbGwiLCJub3QiLCJfcmVuZGVyMzMiLCJhY2NvcmRpb25TdW1tYXJ5IiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXIzNCIsInRvQmVEaXNhYmxlZCIsIl9yZW5kZXIzNSIsIl9yZW5kZXIzNiIsImhvcml6b250YWxHcmlkbGluZXNJbnB1dCIsIl9yZW5kZXIzNyIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXIzOCIsIl9yZW5kZXIzOSIsIl9yZW5kZXI0MCIsImhlYWRlcnMiLCJBcnJheSIsImZyb20iLCJmaW5kIiwiaCIsIl9yZW5kZXI0MSIsInlBeGlzSGVhZGVyIiwiX3JlbmRlcjQyIiwiYXhpc0hlYWRlcnMiLCJfcmVuZGVyNDMiLCJhY2NvcmRpb24iLCJfcmVuZGVyNDQiLCJnZXRBdHRyaWJ1dGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2dyaWQtc2V0dXAudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyLCB3YWl0Rm9yIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgR3JpZFNldHVwIGZyb20gJy4uL2dyaWQtc2V0dXAnO1xuXG5jb25zdCBtb2NrT25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5jb25zdCBtb2NrT25DaGFuZ2VWaWV3ID0gamVzdC5mbigpO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGRvbWFpbjoge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3gnLFxuICB9LFxuICByYW5nZToge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3knLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDQ4MCxcbiAgICBoZWlnaHQ6IDQ4MCxcbiAgfSxcbiAgc2l6ZUNvbnN0cmFpbnRzOiB7XG4gICAgbWluOiAzMDAsXG4gICAgbWF4OiA5MDAsXG4gICAgc3RlcDogMTAsXG4gIH0sXG4gIGluY2x1ZGVBeGVzOiB0cnVlLFxuICBzdGFuZGFyZEdyaWQ6IGZhbHNlLFxuICBkaXNwbGF5ZWRGaWVsZHM6IHtcbiAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdBeGlzIExhYmVsJyB9LFxuICAgIG1pbjogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ01pbicgfSxcbiAgICBtYXg6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdNYXgnIH0sXG4gICAgc3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0ludGVydmFsJyB9LFxuICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0xhYmVsIEludGVydmFsJyB9LFxuICAgIGRpbWVuc2lvbnNFbmFibGVkOiB0cnVlLFxuICAgIGluY2x1ZGVBeGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiB0cnVlLFxuICB9LFxuICBncmlkVmFsdWVzOiB7XG4gICAgZG9tYWluOiBbMSwgMiwgNSwgMTBdLFxuICAgIHJhbmdlOiBbMSwgMiwgNSwgMTBdLFxuICB9LFxuICBsYWJlbFZhbHVlczoge1xuICAgIGRvbWFpbjogWzAsIDEsIDJdLFxuICAgIHJhbmdlOiBbMCwgMSwgMl0sXG4gIH0sXG4gIG9uQ2hhbmdlOiBtb2NrT25DaGFuZ2UsXG4gIG9uQ2hhbmdlVmlldzogbW9ja09uQ2hhbmdlVmlldyxcbn07XG5cbmRlc2NyaWJlKCdHcmlkU2V0dXAnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYWNjb3JkaW9uIHdpdGggdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ3VzdG9taXplIEdyaWQgU2V0dXAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnSW5jbHVkZSBheGVzIGFuZCBsYWJlbHM/JykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBpbmNsdWRlQXhlc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdJbmNsdWRlIGF4ZXMgYW5kIGxhYmVscz8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoJ0RpbWVuc2lvbnMocHgpJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoL01pbiAzMDAsIE1heCA5MDAvKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgZGltZW5zaW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdEaW1lbnNpb25zKHB4KScpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F4ZXMgY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBheGlzIGhlYWRlcnMgd2hlbiBpbmNsdWRlQXhlcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHhBeGlzSGVhZGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2knKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcj8udGV4dENvbnRlbnQpLnRvQmUoJ3gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIG1pbi9tYXggZmllbGRzIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbkZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IG1heEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNYXgnKTtcbiAgICAgIGV4cGVjdChtaW5GaWVsZHMubGVuZ3RoKS50b0JlKDIpOyAvLyBkb21haW4gYW5kIHJhbmdlXG4gICAgICBleHBlY3QobWF4RmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBtaW4vbWF4IGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtaW46IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ01pbicpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdNYXgnKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgYXhpc0xhYmVsRmllbGRzID0gZ2V0QWxsQnlUZXh0KCdBeGlzIExhYmVsJyk7XG4gICAgICBleHBlY3QoYXhpc0xhYmVsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHN0ZXAgYW5kIGxhYmVsU3RlcCBmaWVsZHMgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSW50ZXJ2YWwnKTtcbiAgICAgIGNvbnN0IGxhYmVsSW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTGFiZWwgSW50ZXJ2YWwnKTtcbiAgICAgIGV4cGVjdChpbnRlcnZhbEZpZWxkcy5sZW5ndGgpLnRvQmUoMik7IC8vIGRvbWFpbiBhbmQgcmFuZ2VcbiAgICAgIGV4cGVjdChsYWJlbEludGVydmFsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgbGFiZWxTdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBsYWJlbFN0ZXA6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ0xhYmVsIEludGVydmFsJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIGF4aXMgdmlzaWJpbGl0eSBoaW50IHdoZW4gbWluL21heCBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZ2V0QnlUZXh0KCdJZiB5b3Ugd2FudCB0aGUgYXhpcyB0byBiZSB2aXNpYmxlLCB1c2UgYSB6ZXJvIG9yIG5lZ2F0aXZlIE1pbiBWYWx1ZSwgYW5kIGEgcG9zaXRpdmUgTWF4IFZhbHVlJyksXG4gICAgICApLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB1bm51bWJlcmVkIGdyaWRsaW5lcyBoaW50IHdoZW4gbGFiZWxTdGVwIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnRm9yIHVubnVtYmVyZWQgZ3JpZGxpbmVzLCBlbnRlciBhIGxhYmVsIGludGVydmFsIG9mIDAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ3JpZGxpbmVzIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgVmVydGljYWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgYXhlcyBjb25maWcgd2hlbiBpbmNsdWRlQXhlcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIG1heCBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ051bWJlciBvZiBWZXJ0aWNhbCBHcmlkbGluZXMnKSkudG9CZUZhbHN5KCk7XG4gICAgICBleHBlY3QocXVlcnlCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdoZW4gaW5jbHVkZUF4ZXMgdG9nZ2xlIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCBwcm9wZXIgY29uZmlnIHdoZW4gaW5jbHVkZUF4ZXMgaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggcHJvcGVyIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgY29uc3QgaW5jbHVkZUF4ZXNUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMF07IC8vIEZpcnN0IHRvZ2dsZSBpcyBpbmNsdWRlQXhlc1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soaW5jbHVkZUF4ZXNUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGluY2x1ZGVBeGVzOiB0cnVlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbGFiZWxTdGVwOiAxLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHJhbmdlOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBsYWJlbFN0ZXA6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCB0b2dnbGUgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCB0b2dnbGVJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBjb25zdCBzdGFuZGFyZEdyaWRUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMV07IC8vIFNlY29uZCB0b2dnbGUgaXMgc3RhbmRhcmRHcmlkXG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzdGFuZGFyZEdyaWRUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiB3aWR0aCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IGdldEFsbEJ5TGFiZWxUZXh0KCdXaWR0aCcpWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKHdpZHRoSW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTAwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGhlaWdodCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaGVpZ2h0SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTIwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tPbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZ3JhcGg6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiA1MjAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IHdoZW4gc3RhbmRhcmRHcmlkIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBzdGFuZGFyZEdyaWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gZ2V0QWxsQnlMYWJlbFRleHQoJ1dpZHRoJylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2Uod2lkdGhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICc2MDAnIH0gfSk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGdyYXBoOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIHdpZHRoOiA2MDAsXG4gICAgICAgICAgICAgIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGRvbWFpbiBtaW4gaXMgY2hhbmdlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xMCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBkb21haW4gbWF4IGlzIGNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBtYXhJbnB1dHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTWF4Jyk7XG4gICAgICBjb25zdCBkb21haW5NYXhJbnB1dCA9IG1heElucHV0c1swXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShkb21haW5NYXhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICcxMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1heElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1pbiBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy04JyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNaW5JbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC04LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1heCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWF4SW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01heCcpO1xuICAgICAgY29uc3QgcmFuZ2VNYXhJbnB1dCA9IG1heElucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1heElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJzEyJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNYXhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGJvdGggZG9tYWluIGFuZCByYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlIGFuZCBkb21haW4gY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xNScgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xNSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmFuZ2U6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgbWluOiAtMTUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSByYW5nZSB3aGVuIGRvbWFpbiBheGlzTGFiZWwgY2hhbmdlcyB3aXRoIHN0YW5kYXJkR3JpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgIC8vIEVkaXRhYmxlSFRNTCBjaGFuZ2UgaXMgaGFyZGVyIHRvIHRyaWdnZXIsIGJ1dCB3ZSBjYW4gdGVzdCB0aGUgaGFuZGxlciBkaXJlY3RseVxuICAgICAgLy8gYnkgdmVyaWZ5aW5nIHRoZSByYW5nZSBkb2Vzbid0IGdldCB0aGUgYXhpc0xhYmVsIHZhbHVlIGZyb20gZG9tYWluXG4gICAgICBjb25zdCBheGlzTGFiZWxJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcblxuICAgICAgaWYgKGF4aXNMYWJlbElucHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpcmVFdmVudC5pbnB1dChheGlzTGFiZWxJbnB1dHNbMF0sIHsgdGFyZ2V0OiB7IGlubmVySFRNTDogJ1gtQXhpcycgfSB9KTtcblxuICAgICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgICBpZiAobW9ja09uQ2hhbmdlLm1vY2suY2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdENhbGwgPSBtb2NrT25DaGFuZ2UubW9jay5jYWxsc1ttb2NrT25DaGFuZ2UubW9jay5jYWxscy5sZW5ndGggLSAxXVswXTtcbiAgICAgICAgICAgIC8vIHJhbmdlLmF4aXNMYWJlbCBzaG91bGQgbm90IGJlICdYLUF4aXMnLCBpdCBzaG91bGQga2VlcCBpdHMgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAgIGV4cGVjdChsYXN0Q2FsbC5yYW5nZT8uYXhpc0xhYmVsKS5ub3QudG9CZSgnWC1BeGlzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZVZpZXcgd2hlbiBhY2NvcmRpb24gaXMgdG9nZ2xlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBhY2NvcmRpb25TdW1tYXJ5ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLWV4cGFuZGVkXScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaXNhYmxlZCBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc2FibGVzIHJhbmdlIGZpZWxkcyB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZXhwZWN0KHJhbmdlTWluSW5wdXQpLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGhlaWdodCBmaWVsZCB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgaG9yaXpvbnRhbCBncmlkbGluZXMgZmllbGQgd2hlbiBzdGFuZGFyZEdyaWQgaXMgdHJ1ZSBhbmQgaW5jbHVkZUF4ZXMgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhvcml6b250YWxHcmlkbGluZXNJbnB1dCA9IGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgSG9yaXpvbnRhbCBHcmlkbGluZXMnKTtcblxuICAgICAgZXhwZWN0KGhvcml6b250YWxHcmlkbGluZXNJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHcmlkQ29uZmlnIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBzdGVwIGZpZWxkIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGludGVydmFsRmllbGRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ0ludGVydmFsJyk7XG4gICAgICBleHBlY3QoaW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbFN0ZXAgZmllbGQgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbGFiZWxJbnRlcnZhbEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpO1xuICAgICAgZXhwZWN0KGxhYmVsSW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gYm90aCBzdGVwIGFuZCBsYWJlbFN0ZXAgYXJlIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbGFiZWxTdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0F4aXNDb25maWcgY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHgtYXhpcyBoZWFkZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpJyk7XG4gICAgICBjb25zdCB4QXhpc0hlYWRlciA9IEFycmF5LmZyb20oaGVhZGVycykuZmluZCgoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgeS1heGlzIGhlYWRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBoZWFkZXJzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2knKTtcbiAgICAgIGNvbnN0IHlBeGlzSGVhZGVyID0gQXJyYXkuZnJvbShoZWFkZXJzKS5maW5kKChoKSA9PiBoLnRleHRDb250ZW50ID09PSAneScpO1xuICAgICAgZXhwZWN0KHlBeGlzSGVhZGVyKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGhlYWRlcnMgd2hlbiBhbGwgZmllbGRzIGFyZSBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgbWluOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbWF4OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgYXhpc0xhYmVsOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgc3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaScpO1xuICAgICAgY29uc3QgYXhpc0hlYWRlcnMgPSBBcnJheS5mcm9tKGhlYWRlcnMpLmZpbHRlcigoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnIHx8IGgudGV4dENvbnRlbnQgPT09ICd5Jyk7XG4gICAgICBleHBlY3QoYXhpc0hlYWRlcnMubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWNjb3JkaW9uIGJlaGF2aW9yJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdCB0cmFuc2l0aW9uIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuTXVpQWNjb3JkaW9uLXJvb3QnKTtcbiAgICAgIGV4cGVjdChhY2NvcmRpb24pLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBhbmRzIGFuZCBjb2xsYXBzZXMgYWNjb3JkaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvblN1bW1hcnkgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2FyaWEtZXhwYW5kZWRdJyk7XG5cbiAgICAgIGV4cGVjdChhY2NvcmRpb25TdW1tYXJ5LmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpKS50b0JlKCdmYWxzZScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUFzQyxTQUFB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