@pie-lib/graphing-solution-set 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.
- package/lib/__tests__/bg.test.js +282 -0
- package/lib/__tests__/coordinates-label.test.js +276 -0
- package/lib/__tests__/graph-with-controls.test.js +256 -0
- package/lib/__tests__/graph.test.js +113 -0
- package/lib/__tests__/grid-setup.test.js +729 -0
- package/lib/__tests__/grid.test.js +29 -0
- package/lib/__tests__/labels.test.js +45 -0
- package/lib/__tests__/mark-label.test.js +133 -0
- package/lib/__tests__/toggle-bar.test.js +146 -0
- package/lib/__tests__/tool-menu.test.js +540 -0
- package/lib/__tests__/undo-redo.test.js +31 -0
- package/lib/__tests__/use-debounce.test.js +24 -0
- package/lib/__tests__/utils.js +70 -0
- package/lib/__tests__/utils.test.js +123 -0
- package/lib/axis/__tests__/arrow.test.js +60 -0
- package/lib/axis/__tests__/axes.test.js +160 -0
- package/lib/axis/arrow.js +1 -1
- package/lib/axis/axes.js +1 -1
- package/lib/axis/index.js +1 -1
- package/lib/bg.js +1 -1
- package/lib/container/__tests__/actions.test.js +108 -0
- package/lib/container/__tests__/index.test.js +346 -0
- package/lib/container/__tests__/marks.test.js +259 -0
- package/lib/container/__tests__/middleware.test.js +244 -0
- package/lib/container/__tests__/reducer.test.js +450 -0
- package/lib/container/actions.js +1 -1
- package/lib/container/index.js +1 -1
- package/lib/container/marks.js +1 -1
- package/lib/container/middleware.js +1 -1
- package/lib/container/reducer.js +1 -1
- package/lib/coordinates-label.js +1 -1
- package/lib/graph-with-controls.js +1 -1
- package/lib/graph.js +1 -1
- package/lib/grid-setup.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/labels.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/toggle-bar.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/line/__tests__/component.test.js +45 -0
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/polygon/__tests__/component.test.js +501 -0
- package/lib/tools/polygon/__tests__/index.test.js +92 -0
- package/lib/tools/polygon/__tests__/line.test.js +30 -0
- package/lib/tools/polygon/__tests__/polygon.test.js +61 -0
- package/lib/tools/polygon/component.js +1 -1
- package/lib/tools/polygon/index.js +1 -1
- package/lib/tools/polygon/line.js +1 -1
- package/lib/tools/polygon/polygon.js +1 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
- package/lib/tools/shared/arrow-head.js +1 -1
- package/lib/tools/shared/line/__tests__/index.test.js +725 -0
- package/lib/tools/shared/line/__tests__/line-path.test.js +64 -0
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +618 -0
- package/lib/tools/shared/line/index.js +1 -1
- package/lib/tools/shared/line/line-path.js +1 -1
- package/lib/tools/shared/line/with-root-edge.js +1 -1
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
- package/lib/tools/shared/point/__tests__/arrow.test.js +619 -0
- package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
- package/lib/tools/shared/point/arrow-point.js +1 -1
- package/lib/tools/shared/point/arrow.js +1 -1
- package/lib/tools/shared/point/base-point.js +1 -1
- package/lib/tools/shared/point/index.js +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/undo-redo.js +1 -1
- package/lib/use-debounce.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +10 -13
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
5
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
6
|
+
var _testUtils = require("@pie-lib/test-utils");
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _toolMenu = _interopRequireDefault(require("../tool-menu"));
|
|
9
|
+
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; }
|
|
10
|
+
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; }
|
|
11
|
+
describe('ToolMenu', function () {
|
|
12
|
+
var onChange;
|
|
13
|
+
var tools = ['one', 'two'];
|
|
14
|
+
beforeEach(function () {
|
|
15
|
+
onChange = jest.fn();
|
|
16
|
+
});
|
|
17
|
+
var renderComponent = function renderComponent(extras) {
|
|
18
|
+
var defaults = {
|
|
19
|
+
classes: {},
|
|
20
|
+
className: 'className',
|
|
21
|
+
onChange: onChange,
|
|
22
|
+
currentTool: tools[0],
|
|
23
|
+
tools: tools,
|
|
24
|
+
gssLineData: {
|
|
25
|
+
selectedTool: 'lineA',
|
|
26
|
+
numberOfLines: 2,
|
|
27
|
+
lineA: {
|
|
28
|
+
lineType: 'Solid'
|
|
29
|
+
},
|
|
30
|
+
lineB: {
|
|
31
|
+
lineType: 'Solid'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
36
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_toolMenu["default"], props));
|
|
37
|
+
};
|
|
38
|
+
describe('rendering', function () {
|
|
39
|
+
it('renders without crashing', function () {
|
|
40
|
+
var _renderComponent = renderComponent(),
|
|
41
|
+
container = _renderComponent.container;
|
|
42
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
it('renders Line A radio button', function () {
|
|
45
|
+
var _renderComponent2 = renderComponent(),
|
|
46
|
+
getByText = _renderComponent2.getByText;
|
|
47
|
+
expect(getByText('Line A')).toBeInTheDocument();
|
|
48
|
+
});
|
|
49
|
+
it('renders Line B radio button when numberOfLines is 2', function () {
|
|
50
|
+
var _renderComponent3 = renderComponent(),
|
|
51
|
+
getByText = _renderComponent3.getByText;
|
|
52
|
+
expect(getByText('Line B')).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
it('does not render Line B radio button when numberOfLines is 1', function () {
|
|
55
|
+
var _renderComponent4 = renderComponent({
|
|
56
|
+
gssLineData: {
|
|
57
|
+
selectedTool: 'lineA',
|
|
58
|
+
numberOfLines: 1,
|
|
59
|
+
lineA: {
|
|
60
|
+
lineType: 'Solid'
|
|
61
|
+
},
|
|
62
|
+
lineB: {
|
|
63
|
+
lineType: 'Solid'
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}),
|
|
67
|
+
queryByText = _renderComponent4.queryByText;
|
|
68
|
+
expect(queryByText('Line B')).not.toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
it('renders Solution Set radio button', function () {
|
|
71
|
+
var _renderComponent5 = renderComponent(),
|
|
72
|
+
getByText = _renderComponent5.getByText;
|
|
73
|
+
expect(getByText('Solution Set')).toBeInTheDocument();
|
|
74
|
+
});
|
|
75
|
+
it('renders Solid and Dashed buttons for Line A', function () {
|
|
76
|
+
var _renderComponent6 = renderComponent(),
|
|
77
|
+
getAllByText = _renderComponent6.getAllByText;
|
|
78
|
+
var solidButtons = getAllByText(/Solid/);
|
|
79
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
80
|
+
expect(solidButtons.length).toBeGreaterThan(0);
|
|
81
|
+
expect(dashedButtons.length).toBeGreaterThan(0);
|
|
82
|
+
});
|
|
83
|
+
it('shows checkmark on selected line type for Line A', function () {
|
|
84
|
+
var _renderComponent7 = renderComponent({
|
|
85
|
+
gssLineData: {
|
|
86
|
+
selectedTool: 'lineA',
|
|
87
|
+
numberOfLines: 2,
|
|
88
|
+
lineA: {
|
|
89
|
+
lineType: 'Solid'
|
|
90
|
+
},
|
|
91
|
+
lineB: {
|
|
92
|
+
lineType: 'Dashed'
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}),
|
|
96
|
+
getAllByText = _renderComponent7.getAllByText;
|
|
97
|
+
var solidButtons = getAllByText(/✔ Solid/);
|
|
98
|
+
expect(solidButtons.length).toBeGreaterThan(0);
|
|
99
|
+
});
|
|
100
|
+
it('disables all controls when disabled prop is true', function () {
|
|
101
|
+
var _renderComponent8 = renderComponent({
|
|
102
|
+
disabled: true
|
|
103
|
+
}),
|
|
104
|
+
getAllByRole = _renderComponent8.getAllByRole;
|
|
105
|
+
var radios = getAllByRole('radio');
|
|
106
|
+
var buttons = getAllByRole('button');
|
|
107
|
+
radios.forEach(function (radio) {
|
|
108
|
+
expect(radio).toBeDisabled();
|
|
109
|
+
});
|
|
110
|
+
buttons.forEach(function (button) {
|
|
111
|
+
expect(button).toBeDisabled();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('onChangeRadioValue', function () {
|
|
116
|
+
it('calls onChange with updated selectedTool when lineA radio is clicked', function () {
|
|
117
|
+
var _renderComponent9 = renderComponent({
|
|
118
|
+
gssLineData: {
|
|
119
|
+
selectedTool: 'solutionSet',
|
|
120
|
+
numberOfLines: 2,
|
|
121
|
+
lineA: {
|
|
122
|
+
lineType: 'Solid'
|
|
123
|
+
},
|
|
124
|
+
lineB: {
|
|
125
|
+
lineType: 'Solid'
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}),
|
|
129
|
+
getAllByRole = _renderComponent9.getAllByRole;
|
|
130
|
+
var radios = getAllByRole('radio');
|
|
131
|
+
var lineARadio = radios.find(function (r) {
|
|
132
|
+
return r.value === 'lineA';
|
|
133
|
+
});
|
|
134
|
+
_testUtils.fireEvent.click(lineARadio);
|
|
135
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
136
|
+
var _onChange$mock$calls$ = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
137
|
+
updatedData = _onChange$mock$calls$[0],
|
|
138
|
+
oldSelectedTool = _onChange$mock$calls$[1];
|
|
139
|
+
expect(updatedData.selectedTool).toBe('lineA');
|
|
140
|
+
expect(oldSelectedTool).toBe('solutionSet');
|
|
141
|
+
});
|
|
142
|
+
it('calls onChange with updated selectedTool when lineB radio is clicked', function () {
|
|
143
|
+
var _renderComponent0 = renderComponent({
|
|
144
|
+
gssLineData: {
|
|
145
|
+
selectedTool: 'lineA',
|
|
146
|
+
numberOfLines: 2,
|
|
147
|
+
lineA: {
|
|
148
|
+
lineType: 'Solid'
|
|
149
|
+
},
|
|
150
|
+
lineB: {
|
|
151
|
+
lineType: 'Solid'
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}),
|
|
155
|
+
getAllByRole = _renderComponent0.getAllByRole;
|
|
156
|
+
var radios = getAllByRole('radio');
|
|
157
|
+
var lineBRadio = radios.find(function (r) {
|
|
158
|
+
return r.value === 'lineB';
|
|
159
|
+
});
|
|
160
|
+
_testUtils.fireEvent.click(lineBRadio);
|
|
161
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
162
|
+
var _onChange$mock$calls$2 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
163
|
+
updatedData = _onChange$mock$calls$2[0],
|
|
164
|
+
oldSelectedTool = _onChange$mock$calls$2[1];
|
|
165
|
+
expect(updatedData.selectedTool).toBe('lineB');
|
|
166
|
+
expect(oldSelectedTool).toBe('lineA');
|
|
167
|
+
});
|
|
168
|
+
it('calls onChange with updated selectedTool when solutionSet radio is clicked', function () {
|
|
169
|
+
var _renderComponent1 = renderComponent({
|
|
170
|
+
gssLineData: {
|
|
171
|
+
selectedTool: 'lineA',
|
|
172
|
+
numberOfLines: 2,
|
|
173
|
+
lineA: {
|
|
174
|
+
lineType: 'Solid'
|
|
175
|
+
},
|
|
176
|
+
lineB: {
|
|
177
|
+
lineType: 'Solid'
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}),
|
|
181
|
+
getAllByRole = _renderComponent1.getAllByRole;
|
|
182
|
+
var radios = getAllByRole('radio');
|
|
183
|
+
var solutionSetRadio = radios.find(function (r) {
|
|
184
|
+
return r.value === 'solutionSet';
|
|
185
|
+
});
|
|
186
|
+
_testUtils.fireEvent.click(solutionSetRadio);
|
|
187
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
188
|
+
var _onChange$mock$calls$3 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
189
|
+
updatedData = _onChange$mock$calls$3[0],
|
|
190
|
+
oldSelectedTool = _onChange$mock$calls$3[1];
|
|
191
|
+
expect(updatedData.selectedTool).toBe('solutionSet');
|
|
192
|
+
expect(oldSelectedTool).toBe('lineA');
|
|
193
|
+
});
|
|
194
|
+
it('preserves other gssLineData properties when changing selectedTool', function () {
|
|
195
|
+
var _renderComponent10 = renderComponent({
|
|
196
|
+
gssLineData: {
|
|
197
|
+
selectedTool: 'lineA',
|
|
198
|
+
numberOfLines: 2,
|
|
199
|
+
lineA: {
|
|
200
|
+
lineType: 'Dashed'
|
|
201
|
+
},
|
|
202
|
+
lineB: {
|
|
203
|
+
lineType: 'Solid'
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}),
|
|
207
|
+
getAllByRole = _renderComponent10.getAllByRole;
|
|
208
|
+
var radios = getAllByRole('radio');
|
|
209
|
+
var lineBRadio = radios.find(function (r) {
|
|
210
|
+
return r.value === 'lineB';
|
|
211
|
+
});
|
|
212
|
+
_testUtils.fireEvent.click(lineBRadio);
|
|
213
|
+
var _onChange$mock$calls$4 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
214
|
+
updatedData = _onChange$mock$calls$4[0];
|
|
215
|
+
expect(updatedData.lineA.lineType).toBe('Dashed');
|
|
216
|
+
expect(updatedData.lineB.lineType).toBe('Solid');
|
|
217
|
+
expect(updatedData.numberOfLines).toBe(2);
|
|
218
|
+
});
|
|
219
|
+
it('does not call onChange when disabled', function () {
|
|
220
|
+
var _renderComponent11 = renderComponent({
|
|
221
|
+
disabled: true,
|
|
222
|
+
gssLineData: {
|
|
223
|
+
selectedTool: 'lineA',
|
|
224
|
+
numberOfLines: 2,
|
|
225
|
+
lineA: {
|
|
226
|
+
lineType: 'Solid'
|
|
227
|
+
},
|
|
228
|
+
lineB: {
|
|
229
|
+
lineType: 'Solid'
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}),
|
|
233
|
+
getAllByRole = _renderComponent11.getAllByRole;
|
|
234
|
+
var radios = getAllByRole('radio');
|
|
235
|
+
var lineBRadio = radios.find(function (r) {
|
|
236
|
+
return r.value === 'lineB';
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// Disabled radios should not fire change events
|
|
240
|
+
expect(lineBRadio).toBeDisabled();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('lineTypeChange', function () {
|
|
244
|
+
it('calls onChange with updated lineType for Line A when Solid button is clicked', function () {
|
|
245
|
+
var _renderComponent12 = renderComponent({
|
|
246
|
+
gssLineData: {
|
|
247
|
+
selectedTool: 'lineA',
|
|
248
|
+
numberOfLines: 2,
|
|
249
|
+
lineA: {
|
|
250
|
+
lineType: 'Dashed'
|
|
251
|
+
},
|
|
252
|
+
lineB: {
|
|
253
|
+
lineType: 'Solid'
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}),
|
|
257
|
+
getAllByText = _renderComponent12.getAllByText;
|
|
258
|
+
var solidButtons = getAllByText(/Solid/);
|
|
259
|
+
// First solid button should be for Line A
|
|
260
|
+
_testUtils.fireEvent.click(solidButtons[0]);
|
|
261
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
262
|
+
var _onChange$mock$calls$5 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
263
|
+
updatedData = _onChange$mock$calls$5[0],
|
|
264
|
+
oldSelectedTool = _onChange$mock$calls$5[1];
|
|
265
|
+
expect(updatedData.lineA.lineType).toBe('Solid');
|
|
266
|
+
expect(oldSelectedTool).toBe('lineA');
|
|
267
|
+
});
|
|
268
|
+
it('calls onChange with updated lineType for Line A when Dashed button is clicked', function () {
|
|
269
|
+
var _renderComponent13 = renderComponent({
|
|
270
|
+
gssLineData: {
|
|
271
|
+
selectedTool: 'lineA',
|
|
272
|
+
numberOfLines: 2,
|
|
273
|
+
lineA: {
|
|
274
|
+
lineType: 'Solid'
|
|
275
|
+
},
|
|
276
|
+
lineB: {
|
|
277
|
+
lineType: 'Solid'
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}),
|
|
281
|
+
getAllByText = _renderComponent13.getAllByText;
|
|
282
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
283
|
+
// First dashed button should be for Line A
|
|
284
|
+
_testUtils.fireEvent.click(dashedButtons[0]);
|
|
285
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
286
|
+
var _onChange$mock$calls$6 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
287
|
+
updatedData = _onChange$mock$calls$6[0],
|
|
288
|
+
oldSelectedTool = _onChange$mock$calls$6[1];
|
|
289
|
+
expect(updatedData.lineA.lineType).toBe('Dashed');
|
|
290
|
+
expect(oldSelectedTool).toBe('lineA');
|
|
291
|
+
});
|
|
292
|
+
it('calls onChange with updated lineType for Line B when Solid button is clicked', function () {
|
|
293
|
+
var _renderComponent14 = renderComponent({
|
|
294
|
+
gssLineData: {
|
|
295
|
+
selectedTool: 'lineB',
|
|
296
|
+
numberOfLines: 2,
|
|
297
|
+
lineA: {
|
|
298
|
+
lineType: 'Solid'
|
|
299
|
+
},
|
|
300
|
+
lineB: {
|
|
301
|
+
lineType: 'Dashed'
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
getAllByText = _renderComponent14.getAllByText;
|
|
306
|
+
var solidButtons = getAllByText(/Solid/);
|
|
307
|
+
// Second solid button should be for Line B
|
|
308
|
+
_testUtils.fireEvent.click(solidButtons[1]);
|
|
309
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
310
|
+
var _onChange$mock$calls$7 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
311
|
+
updatedData = _onChange$mock$calls$7[0],
|
|
312
|
+
oldSelectedTool = _onChange$mock$calls$7[1];
|
|
313
|
+
expect(updatedData.lineB.lineType).toBe('Solid');
|
|
314
|
+
expect(oldSelectedTool).toBe('lineB');
|
|
315
|
+
});
|
|
316
|
+
it('calls onChange with updated lineType for Line B when Dashed button is clicked', function () {
|
|
317
|
+
var _renderComponent15 = renderComponent({
|
|
318
|
+
gssLineData: {
|
|
319
|
+
selectedTool: 'lineB',
|
|
320
|
+
numberOfLines: 2,
|
|
321
|
+
lineA: {
|
|
322
|
+
lineType: 'Solid'
|
|
323
|
+
},
|
|
324
|
+
lineB: {
|
|
325
|
+
lineType: 'Solid'
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}),
|
|
329
|
+
getAllByText = _renderComponent15.getAllByText;
|
|
330
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
331
|
+
// Second dashed button should be for Line B
|
|
332
|
+
_testUtils.fireEvent.click(dashedButtons[1]);
|
|
333
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
334
|
+
var _onChange$mock$calls$8 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
|
|
335
|
+
updatedData = _onChange$mock$calls$8[0],
|
|
336
|
+
oldSelectedTool = _onChange$mock$calls$8[1];
|
|
337
|
+
expect(updatedData.lineB.lineType).toBe('Dashed');
|
|
338
|
+
expect(oldSelectedTool).toBe('lineB');
|
|
339
|
+
});
|
|
340
|
+
it('preserves other line properties when changing Line A lineType', function () {
|
|
341
|
+
var _renderComponent16 = renderComponent({
|
|
342
|
+
gssLineData: {
|
|
343
|
+
selectedTool: 'lineA',
|
|
344
|
+
numberOfLines: 2,
|
|
345
|
+
lineA: {
|
|
346
|
+
lineType: 'Solid'
|
|
347
|
+
},
|
|
348
|
+
lineB: {
|
|
349
|
+
lineType: 'Dashed'
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}),
|
|
353
|
+
getAllByText = _renderComponent16.getAllByText;
|
|
354
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
355
|
+
_testUtils.fireEvent.click(dashedButtons[0]);
|
|
356
|
+
var _onChange$mock$calls$9 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
357
|
+
updatedData = _onChange$mock$calls$9[0];
|
|
358
|
+
expect(updatedData.lineA.lineType).toBe('Dashed');
|
|
359
|
+
expect(updatedData.lineB.lineType).toBe('Dashed');
|
|
360
|
+
expect(updatedData.selectedTool).toBe('lineA');
|
|
361
|
+
expect(updatedData.numberOfLines).toBe(2);
|
|
362
|
+
});
|
|
363
|
+
it('preserves other line properties when changing Line B lineType', function () {
|
|
364
|
+
var _renderComponent17 = renderComponent({
|
|
365
|
+
gssLineData: {
|
|
366
|
+
selectedTool: 'lineB',
|
|
367
|
+
numberOfLines: 2,
|
|
368
|
+
lineA: {
|
|
369
|
+
lineType: 'Dashed'
|
|
370
|
+
},
|
|
371
|
+
lineB: {
|
|
372
|
+
lineType: 'Solid'
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}),
|
|
376
|
+
getAllByText = _renderComponent17.getAllByText;
|
|
377
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
378
|
+
_testUtils.fireEvent.click(dashedButtons[1]);
|
|
379
|
+
var _onChange$mock$calls$0 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
380
|
+
updatedData = _onChange$mock$calls$0[0];
|
|
381
|
+
expect(updatedData.lineA.lineType).toBe('Dashed');
|
|
382
|
+
expect(updatedData.lineB.lineType).toBe('Dashed');
|
|
383
|
+
expect(updatedData.selectedTool).toBe('lineB');
|
|
384
|
+
expect(updatedData.numberOfLines).toBe(2);
|
|
385
|
+
});
|
|
386
|
+
it('handles multiple line type changes correctly', function () {
|
|
387
|
+
var _renderComponent18 = renderComponent({
|
|
388
|
+
gssLineData: {
|
|
389
|
+
selectedTool: 'lineA',
|
|
390
|
+
numberOfLines: 2,
|
|
391
|
+
lineA: {
|
|
392
|
+
lineType: 'Solid'
|
|
393
|
+
},
|
|
394
|
+
lineB: {
|
|
395
|
+
lineType: 'Solid'
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}),
|
|
399
|
+
getAllByText = _renderComponent18.getAllByText;
|
|
400
|
+
|
|
401
|
+
// Change Line A to Dashed
|
|
402
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
403
|
+
_testUtils.fireEvent.click(dashedButtons[0]);
|
|
404
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
405
|
+
var _onChange$mock$calls$1 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
406
|
+
updatedData = _onChange$mock$calls$1[0];
|
|
407
|
+
expect(updatedData.lineA.lineType).toBe('Dashed');
|
|
408
|
+
|
|
409
|
+
// Change Line B to Dashed
|
|
410
|
+
dashedButtons = getAllByText(/Dashed/);
|
|
411
|
+
_testUtils.fireEvent.click(dashedButtons[1]);
|
|
412
|
+
expect(onChange).toHaveBeenCalledTimes(2);
|
|
413
|
+
var _onChange$mock$calls$10 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
|
|
414
|
+
updatedData = _onChange$mock$calls$10[0];
|
|
415
|
+
expect(updatedData.lineB.lineType).toBe('Dashed');
|
|
416
|
+
});
|
|
417
|
+
it('does not call onChange when line type button is disabled', function () {
|
|
418
|
+
var _renderComponent19 = renderComponent({
|
|
419
|
+
disabled: true,
|
|
420
|
+
gssLineData: {
|
|
421
|
+
selectedTool: 'lineA',
|
|
422
|
+
numberOfLines: 2,
|
|
423
|
+
lineA: {
|
|
424
|
+
lineType: 'Solid'
|
|
425
|
+
},
|
|
426
|
+
lineB: {
|
|
427
|
+
lineType: 'Solid'
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}),
|
|
431
|
+
getAllByRole = _renderComponent19.getAllByRole;
|
|
432
|
+
var buttons = getAllByRole('button');
|
|
433
|
+
buttons.forEach(function (button) {
|
|
434
|
+
expect(button).toBeDisabled();
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
it('maintains correct state when clicking same line type that is already selected', function () {
|
|
438
|
+
var _renderComponent20 = renderComponent({
|
|
439
|
+
gssLineData: {
|
|
440
|
+
selectedTool: 'lineA',
|
|
441
|
+
numberOfLines: 2,
|
|
442
|
+
lineA: {
|
|
443
|
+
lineType: 'Solid'
|
|
444
|
+
},
|
|
445
|
+
lineB: {
|
|
446
|
+
lineType: 'Solid'
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}),
|
|
450
|
+
getAllByText = _renderComponent20.getAllByText;
|
|
451
|
+
var solidButtons = getAllByText(/Solid/);
|
|
452
|
+
_testUtils.fireEvent.click(solidButtons[0]); // Click Solid when already Solid
|
|
453
|
+
|
|
454
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
455
|
+
var _onChange$mock$calls$11 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
456
|
+
updatedData = _onChange$mock$calls$11[0];
|
|
457
|
+
expect(updatedData.lineA.lineType).toBe('Solid');
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
describe('integration tests', function () {
|
|
461
|
+
it('allows switching selected tool and changing line type in sequence', function () {
|
|
462
|
+
var _renderComponent21 = renderComponent({
|
|
463
|
+
gssLineData: {
|
|
464
|
+
selectedTool: 'lineA',
|
|
465
|
+
numberOfLines: 2,
|
|
466
|
+
lineA: {
|
|
467
|
+
lineType: 'Solid'
|
|
468
|
+
},
|
|
469
|
+
lineB: {
|
|
470
|
+
lineType: 'Solid'
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}),
|
|
474
|
+
getAllByRole = _renderComponent21.getAllByRole,
|
|
475
|
+
getAllByText = _renderComponent21.getAllByText;
|
|
476
|
+
|
|
477
|
+
// Switch to Line B
|
|
478
|
+
var radios = getAllByRole('radio');
|
|
479
|
+
var lineBRadio = radios.find(function (r) {
|
|
480
|
+
return r.value === 'lineB';
|
|
481
|
+
});
|
|
482
|
+
_testUtils.fireEvent.click(lineBRadio);
|
|
483
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
484
|
+
var _onChange$mock$calls$12 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
|
|
485
|
+
updatedData = _onChange$mock$calls$12[0];
|
|
486
|
+
expect(updatedData.selectedTool).toBe('lineB');
|
|
487
|
+
|
|
488
|
+
// Change Line B to Dashed
|
|
489
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
490
|
+
_testUtils.fireEvent.click(dashedButtons[1]);
|
|
491
|
+
expect(onChange).toHaveBeenCalledTimes(2);
|
|
492
|
+
var _onChange$mock$calls$13 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
|
|
493
|
+
updatedData = _onChange$mock$calls$13[0];
|
|
494
|
+
expect(updatedData.lineB.lineType).toBe('Dashed');
|
|
495
|
+
});
|
|
496
|
+
it('handles complete workflow of switching between all tools and changing line types', function () {
|
|
497
|
+
var _renderComponent22 = renderComponent({
|
|
498
|
+
gssLineData: {
|
|
499
|
+
selectedTool: 'lineA',
|
|
500
|
+
numberOfLines: 2,
|
|
501
|
+
lineA: {
|
|
502
|
+
lineType: 'Solid'
|
|
503
|
+
},
|
|
504
|
+
lineB: {
|
|
505
|
+
lineType: 'Solid'
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}),
|
|
509
|
+
getAllByRole = _renderComponent22.getAllByRole,
|
|
510
|
+
getAllByText = _renderComponent22.getAllByText;
|
|
511
|
+
|
|
512
|
+
// Change Line A to Dashed
|
|
513
|
+
var dashedButtons = getAllByText(/Dashed/);
|
|
514
|
+
_testUtils.fireEvent.click(dashedButtons[0]);
|
|
515
|
+
expect(onChange.mock.calls[0][0].lineA.lineType).toBe('Dashed');
|
|
516
|
+
|
|
517
|
+
// Switch to Line B
|
|
518
|
+
var radios = getAllByRole('radio');
|
|
519
|
+
var lineBRadio = radios.find(function (r) {
|
|
520
|
+
return r.value === 'lineB';
|
|
521
|
+
});
|
|
522
|
+
_testUtils.fireEvent.click(lineBRadio);
|
|
523
|
+
expect(onChange.mock.calls[1][0].selectedTool).toBe('lineB');
|
|
524
|
+
|
|
525
|
+
// Change Line B to Dashed
|
|
526
|
+
dashedButtons = getAllByText(/Dashed/);
|
|
527
|
+
_testUtils.fireEvent.click(dashedButtons[1]);
|
|
528
|
+
expect(onChange.mock.calls[2][0].lineB.lineType).toBe('Dashed');
|
|
529
|
+
|
|
530
|
+
// Switch to Solution Set
|
|
531
|
+
var solutionSetRadio = radios.find(function (r) {
|
|
532
|
+
return r.value === 'solutionSet';
|
|
533
|
+
});
|
|
534
|
+
_testUtils.fireEvent.click(solutionSetRadio);
|
|
535
|
+
expect(onChange.mock.calls[3][0].selectedTool).toBe('solutionSet');
|
|
536
|
+
expect(onChange).toHaveBeenCalledTimes(4);
|
|
537
|
+
});
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdG9vbE1lbnUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJ0b29scyIsImJlZm9yZUVhY2giLCJqZXN0IiwiZm4iLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJjdXJyZW50VG9vbCIsImdzc0xpbmVEYXRhIiwic2VsZWN0ZWRUb29sIiwibnVtYmVyT2ZMaW5lcyIsImxpbmVBIiwibGluZVR5cGUiLCJsaW5lQiIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlckNvbXBvbmVudDMiLCJfcmVuZGVyQ29tcG9uZW50NCIsInF1ZXJ5QnlUZXh0Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsImdldEFsbEJ5VGV4dCIsInNvbGlkQnV0dG9ucyIsImRhc2hlZEJ1dHRvbnMiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyQ29tcG9uZW50NyIsIl9yZW5kZXJDb21wb25lbnQ4IiwiZGlzYWJsZWQiLCJnZXRBbGxCeVJvbGUiLCJyYWRpb3MiLCJidXR0b25zIiwicmFkaW8iLCJ0b0JlRGlzYWJsZWQiLCJidXR0b24iLCJfcmVuZGVyQ29tcG9uZW50OSIsImxpbmVBUmFkaW8iLCJmaW5kIiwidmFsdWUiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJCIsIl9zbGljZWRUb0FycmF5MiIsIm1vY2siLCJjYWxscyIsInVwZGF0ZWREYXRhIiwib2xkU2VsZWN0ZWRUb29sIiwidG9CZSIsIl9yZW5kZXJDb21wb25lbnQwIiwibGluZUJSYWRpbyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDIiLCJfcmVuZGVyQ29tcG9uZW50MSIsInNvbHV0aW9uU2V0UmFkaW8iLCJfb25DaGFuZ2UkbW9jayRjYWxscyQzIiwiX3JlbmRlckNvbXBvbmVudDEwIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNCIsIl9yZW5kZXJDb21wb25lbnQxMSIsIl9yZW5kZXJDb21wb25lbnQxMiIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDUiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ2IiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNyIsIl9yZW5kZXJDb21wb25lbnQxNSIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDgiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ5IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMCIsIl9yZW5kZXJDb21wb25lbnQxOCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDEiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMCIsIl9yZW5kZXJDb21wb25lbnQxOSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDExIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMTIiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMyIsIl9yZW5kZXJDb21wb25lbnQyMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdG9vbC1tZW51LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgVG9vbE1lbnUgZnJvbSAnLi4vdG9vbC1tZW51JztcblxuZGVzY3JpYmUoJ1Rvb2xNZW51JywgKCkgPT4ge1xuICBsZXQgb25DaGFuZ2U7XG4gIGNvbnN0IHRvb2xzID0gWydvbmUnLCAndHdvJ107XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgY3VycmVudFRvb2w6IHRvb2xzWzBdLFxuICAgICAgdG9vbHMsXG4gICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKDxUb29sTWVudSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEEgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBBJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEIgcmFkaW8gYnV0dG9uIHdoZW4gbnVtYmVyT2ZMaW5lcyBpcyAyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBCJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIExpbmUgQiByYWRpbyBidXR0b24gd2hlbiBudW1iZXJPZkxpbmVzIGlzIDEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAxLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdMaW5lIEInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2x1dGlvbiBTZXQgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnU29sdXRpb24gU2V0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2xpZCBhbmQgRGFzaGVkIGJ1dHRvbnMgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZXhwZWN0KHNvbGlkQnV0dG9ucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgIGV4cGVjdChkYXNoZWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3dzIGNoZWNrbWFyayBvbiBzZWxlY3RlZCBsaW5lIHR5cGUgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgv4pyUIFNvbGlkLyk7XG4gICAgICBleHBlY3Qoc29saWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGFsbCBjb250cm9scyB3aGVuIGRpc2FibGVkIHByb3AgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBnZXRBbGxCeVJvbGUoJ2J1dHRvbicpO1xuXG4gICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgZXhwZWN0KHJhZGlvKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBleHBlY3QoYnV0dG9uKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25DaGFuZ2VSYWRpb1ZhbHVlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIHVwZGF0ZWQgc2VsZWN0ZWRUb29sIHdoZW4gbGluZUEgcmFkaW8gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ3NvbHV0aW9uU2V0JyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQVJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluZUFSYWRpbyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBzZWxlY3RlZFRvb2wgd2hlbiBsaW5lQiByYWRpbyBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhsaW5lQlJhZGlvKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLnNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUInKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIHNlbGVjdGVkVG9vbCB3aGVuIHNvbHV0aW9uU2V0IHJhZGlvIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3Qgc29sdXRpb25TZXRSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnc29sdXRpb25TZXQnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbHV0aW9uU2V0UmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgICAgZXhwZWN0KG9sZFNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgb3RoZXIgZ3NzTGluZURhdGEgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIHNlbGVjdGVkVG9vbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3QgbGluZUJSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnbGluZUInKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBjb25zdCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubnVtYmVyT2ZMaW5lcykudG9CZSgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2hhbmdlIHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIC8vIERpc2FibGVkIHJhZGlvcyBzaG91bGQgbm90IGZpcmUgY2hhbmdlIGV2ZW50c1xuICAgICAgZXhwZWN0KGxpbmVCUmFkaW8pLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGluZVR5cGVDaGFuZ2UnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBBIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ0Rhc2hlZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIEZpcnN0IHNvbGlkIGJ1dHRvbiBzaG91bGQgYmUgZm9yIExpbmUgQVxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbGlkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnU29saWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIGxpbmVUeXBlIGZvciBMaW5lIEEgd2hlbiBEYXNoZWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICAvLyBGaXJzdCBkYXNoZWQgYnV0dG9uIHNob3VsZCBiZSBmb3IgTGluZSBBXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQicsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIFNlY29uZCBzb2xpZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhzb2xpZEJ1dHRvbnNbMV0pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gRGFzaGVkIGJ1dHRvbiBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUInLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgLy8gU2Vjb25kIGRhc2hlZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVCLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQSBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQiBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVCJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtdWx0aXBsZSBsaW5lIHR5cGUgY2hhbmdlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hhbmdlIExpbmUgQSB0byBEYXNoZWRcbiAgICAgIGxldCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzBdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBsZXQgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMV07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNhbGwgb25DaGFuZ2Ugd2hlbiBsaW5lIHR5cGUgYnV0dG9uIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBidXR0b25zID0gZ2V0QWxsQnlSb2xlKCdidXR0b24nKTtcblxuICAgICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgZXhwZWN0KGJ1dHRvbikudG9CZURpc2FibGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgY29ycmVjdCBzdGF0ZSB3aGVuIGNsaWNraW5nIHNhbWUgbGluZSB0eXBlIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb2xpZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL1NvbGlkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29saWRCdXR0b25zWzBdKTsgLy8gQ2xpY2sgU29saWQgd2hlbiBhbHJlYWR5IFNvbGlkXG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnYWxsb3dzIHN3aXRjaGluZyBzZWxlY3RlZCB0b29sIGFuZCBjaGFuZ2luZyBsaW5lIHR5cGUgaW4gc2VxdWVuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGxldCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG5cbiAgICAgIC8vIENoYW5nZSBMaW5lIEIgdG8gRGFzaGVkXG4gICAgICBjb25zdCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgICBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1sxXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBjb21wbGV0ZSB3b3JrZmxvdyBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBhbGwgdG9vbHMgYW5kIGNoYW5naW5nIGxpbmUgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBBIHRvIERhc2hlZFxuICAgICAgbGV0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGRhc2hlZEJ1dHRvbnNbMF0pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMF1bMF0ubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMV1bMF0uc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1syXVswXS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG5cbiAgICAgIC8vIFN3aXRjaCB0byBTb2x1dGlvbiBTZXRcbiAgICAgIGNvbnN0IHNvbHV0aW9uU2V0UmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ3NvbHV0aW9uU2V0Jyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29sdXRpb25TZXRSYWRpbyk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1szXVswXS5zZWxlY3RlZFRvb2wpLnRvQmUoJ3NvbHV0aW9uU2V0Jyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5n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
|