@pie-lib/config-ui 12.0.0-next.0 → 12.1.0-next.0
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__/alert-dialog.test.js +262 -0
- package/lib/__tests__/checkbox.test.js +227 -0
- package/lib/__tests__/choice-utils.test.js +14 -0
- package/lib/__tests__/form-section.test.js +252 -0
- package/lib/__tests__/help.test.js +270 -0
- package/lib/__tests__/input.test.js +268 -0
- package/lib/__tests__/langs.test.js +541 -0
- package/lib/__tests__/number-text-field-custom.test.js +362 -0
- package/lib/__tests__/number-text-field.test.js +421 -0
- package/lib/__tests__/radio-with-label.test.js +233 -0
- package/lib/__tests__/settings-panel.test.js +184 -0
- package/lib/__tests__/settings.test.js +653 -0
- package/lib/__tests__/tabs.test.js +211 -0
- package/lib/__tests__/two-choice.test.js +124 -0
- package/lib/__tests__/with-stateful-model.test.js +221 -0
- package/lib/alert-dialog.js +1 -1
- package/lib/checkbox.js +1 -1
- package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
- package/lib/choice-configuration/__tests__/index.test.js +253 -0
- package/lib/choice-configuration/feedback-menu.js +1 -1
- package/lib/choice-configuration/index.js +3 -3
- package/lib/choice-configuration/index.js.map +1 -1
- package/lib/choice-utils.js +1 -1
- package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
- package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
- package/lib/feedback-config/feedback-selector.js +3 -3
- package/lib/feedback-config/feedback-selector.js.map +1 -1
- package/lib/feedback-config/group.js +1 -1
- package/lib/feedback-config/index.js +1 -1
- package/lib/form-section.js +1 -1
- package/lib/help.js +1 -1
- package/lib/index.js +1 -1
- package/lib/input.js +1 -1
- package/lib/inputs.js +1 -1
- package/lib/langs.js +1 -1
- package/lib/layout/__tests__/config.layout.test.js +70 -0
- package/lib/layout/__tests__/layout-content.test.js +6 -0
- package/lib/layout/config-layout.js +1 -1
- package/lib/layout/index.js +1 -1
- package/lib/layout/layout-contents.js +1 -1
- package/lib/layout/settings-box.js +1 -1
- package/lib/mui-box/index.js +1 -1
- package/lib/number-text-field-custom.js +1 -1
- package/lib/number-text-field.js +1 -1
- package/lib/radio-with-label.js +1 -1
- package/lib/settings/display-size.js +1 -1
- package/lib/settings/index.js +1 -1
- package/lib/settings/panel.js +1 -1
- package/lib/settings/settings-radio-label.js +1 -1
- package/lib/settings/toggle.js +1 -1
- package/lib/tabs/index.js +1 -1
- package/lib/tags-input/__tests__/index.test.js +183 -0
- package/lib/tags-input/index.js +1 -1
- package/lib/two-choice.js +1 -1
- package/lib/with-stateful-model.js +1 -1
- package/package.json +5 -13
- package/src/choice-configuration/__tests__/index.test.jsx +1 -1
- package/src/choice-configuration/index.jsx +68 -75
- package/src/feedback-config/__tests__/feedback-selector.test.jsx +3 -13
- package/src/feedback-config/feedback-selector.jsx +3 -7
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _react2 = require("@testing-library/react");
|
|
9
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
10
|
+
var _toggle = _interopRequireDefault(require("../settings/toggle"));
|
|
11
|
+
var _displaySize = _interopRequireDefault(require("../settings/display-size"));
|
|
12
|
+
var _settingsRadioLabel = _interopRequireDefault(require("../settings/settings-radio-label"));
|
|
13
|
+
var _panel = require("../settings/panel");
|
|
14
|
+
describe('Settings Components', function () {
|
|
15
|
+
describe('Toggle', function () {
|
|
16
|
+
it('renders toggle with label', function () {
|
|
17
|
+
var toggle = jest.fn();
|
|
18
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toggle["default"], {
|
|
19
|
+
label: "Enable Feature",
|
|
20
|
+
checked: false,
|
|
21
|
+
toggle: toggle
|
|
22
|
+
}));
|
|
23
|
+
expect(_react2.screen.getByText('Enable Feature')).toBeInTheDocument();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('DisplaySize', function () {
|
|
27
|
+
var defaultProps = {
|
|
28
|
+
size: {
|
|
29
|
+
width: 500,
|
|
30
|
+
height: 400
|
|
31
|
+
},
|
|
32
|
+
label: 'Display Size',
|
|
33
|
+
onChange: jest.fn()
|
|
34
|
+
};
|
|
35
|
+
beforeEach(function () {
|
|
36
|
+
jest.clearAllMocks();
|
|
37
|
+
});
|
|
38
|
+
it('renders label and input fields', function () {
|
|
39
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
|
|
40
|
+
expect(_react2.screen.getByText('Display Size')).toBeInTheDocument();
|
|
41
|
+
expect(_react2.screen.getByLabelText('Width')).toBeInTheDocument();
|
|
42
|
+
expect(_react2.screen.getByLabelText('Height')).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
it('displays width and height values', function () {
|
|
45
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
|
|
46
|
+
var widthInput = _react2.screen.getByLabelText('Width');
|
|
47
|
+
var heightInput = _react2.screen.getByLabelText('Height');
|
|
48
|
+
expect(widthInput).toHaveValue(500);
|
|
49
|
+
expect(heightInput).toHaveValue(400);
|
|
50
|
+
});
|
|
51
|
+
it('calls onChange when width changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
52
|
+
var user, onChange, widthInput;
|
|
53
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
54
|
+
while (1) switch (_context.prev = _context.next) {
|
|
55
|
+
case 0:
|
|
56
|
+
user = _userEvent["default"].setup();
|
|
57
|
+
onChange = jest.fn();
|
|
58
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
59
|
+
onChange: onChange
|
|
60
|
+
})));
|
|
61
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
62
|
+
_context.next = 1;
|
|
63
|
+
return user.clear(widthInput);
|
|
64
|
+
case 1:
|
|
65
|
+
_context.next = 2;
|
|
66
|
+
return user.type(widthInput, '600');
|
|
67
|
+
case 2:
|
|
68
|
+
_react2.fireEvent.blur(widthInput);
|
|
69
|
+
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
70
|
+
width: 600
|
|
71
|
+
}));
|
|
72
|
+
case 3:
|
|
73
|
+
case "end":
|
|
74
|
+
return _context.stop();
|
|
75
|
+
}
|
|
76
|
+
}, _callee);
|
|
77
|
+
})));
|
|
78
|
+
it('calls onChange when height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
79
|
+
var user, onChange, heightInput;
|
|
80
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
81
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
82
|
+
case 0:
|
|
83
|
+
user = _userEvent["default"].setup();
|
|
84
|
+
onChange = jest.fn();
|
|
85
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
86
|
+
onChange: onChange
|
|
87
|
+
})));
|
|
88
|
+
heightInput = _react2.screen.getByLabelText('Height');
|
|
89
|
+
_context2.next = 1;
|
|
90
|
+
return user.clear(heightInput);
|
|
91
|
+
case 1:
|
|
92
|
+
_context2.next = 2;
|
|
93
|
+
return user.type(heightInput, '500');
|
|
94
|
+
case 2:
|
|
95
|
+
_react2.fireEvent.blur(heightInput);
|
|
96
|
+
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
97
|
+
height: 500
|
|
98
|
+
}));
|
|
99
|
+
case 3:
|
|
100
|
+
case "end":
|
|
101
|
+
return _context2.stop();
|
|
102
|
+
}
|
|
103
|
+
}, _callee2);
|
|
104
|
+
})));
|
|
105
|
+
it('maintains other dimension when one changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
106
|
+
var user, onChange, widthInput;
|
|
107
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
108
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
109
|
+
case 0:
|
|
110
|
+
user = _userEvent["default"].setup();
|
|
111
|
+
onChange = jest.fn();
|
|
112
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
113
|
+
onChange: onChange
|
|
114
|
+
})));
|
|
115
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
116
|
+
_context3.next = 1;
|
|
117
|
+
return user.clear(widthInput);
|
|
118
|
+
case 1:
|
|
119
|
+
_context3.next = 2;
|
|
120
|
+
return user.type(widthInput, '700');
|
|
121
|
+
case 2:
|
|
122
|
+
_react2.fireEvent.blur(widthInput);
|
|
123
|
+
expect(onChange).toHaveBeenCalledWith({
|
|
124
|
+
width: 700,
|
|
125
|
+
height: 400
|
|
126
|
+
});
|
|
127
|
+
case 3:
|
|
128
|
+
case "end":
|
|
129
|
+
return _context3.stop();
|
|
130
|
+
}
|
|
131
|
+
}, _callee3);
|
|
132
|
+
})));
|
|
133
|
+
it('enforces min value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
134
|
+
var user, onChange, widthInput;
|
|
135
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
136
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
137
|
+
case 0:
|
|
138
|
+
user = _userEvent["default"].setup();
|
|
139
|
+
onChange = jest.fn();
|
|
140
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
141
|
+
onChange: onChange
|
|
142
|
+
})));
|
|
143
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
144
|
+
_context4.next = 1;
|
|
145
|
+
return user.clear(widthInput);
|
|
146
|
+
case 1:
|
|
147
|
+
_context4.next = 2;
|
|
148
|
+
return user.type(widthInput, '100');
|
|
149
|
+
case 2:
|
|
150
|
+
_react2.fireEvent.blur(widthInput);
|
|
151
|
+
|
|
152
|
+
// Should clamp to minimum 150
|
|
153
|
+
expect(widthInput).toHaveValue(150);
|
|
154
|
+
case 3:
|
|
155
|
+
case "end":
|
|
156
|
+
return _context4.stop();
|
|
157
|
+
}
|
|
158
|
+
}, _callee4);
|
|
159
|
+
})));
|
|
160
|
+
it('enforces max value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
161
|
+
var user, onChange, widthInput;
|
|
162
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
163
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
164
|
+
case 0:
|
|
165
|
+
user = _userEvent["default"].setup();
|
|
166
|
+
onChange = jest.fn();
|
|
167
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
168
|
+
onChange: onChange
|
|
169
|
+
})));
|
|
170
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
171
|
+
_context5.next = 1;
|
|
172
|
+
return user.clear(widthInput);
|
|
173
|
+
case 1:
|
|
174
|
+
_context5.next = 2;
|
|
175
|
+
return user.type(widthInput, '2000');
|
|
176
|
+
case 2:
|
|
177
|
+
_react2.fireEvent.blur(widthInput);
|
|
178
|
+
|
|
179
|
+
// Should clamp to maximum 1000
|
|
180
|
+
expect(widthInput).toHaveValue(1000);
|
|
181
|
+
case 3:
|
|
182
|
+
case "end":
|
|
183
|
+
return _context5.stop();
|
|
184
|
+
}
|
|
185
|
+
}, _callee5);
|
|
186
|
+
})));
|
|
187
|
+
it('updates when size prop changes', function () {
|
|
188
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
|
|
189
|
+
rerender = _render.rerender;
|
|
190
|
+
var widthInput = _react2.screen.getByLabelText('Width');
|
|
191
|
+
expect(widthInput).toHaveValue(500);
|
|
192
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
193
|
+
size: {
|
|
194
|
+
width: 800,
|
|
195
|
+
height: 600
|
|
196
|
+
}
|
|
197
|
+
})));
|
|
198
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
199
|
+
expect(widthInput).toHaveValue(800);
|
|
200
|
+
});
|
|
201
|
+
it('handles boundary values at minimum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
202
|
+
var user, onChange, widthInput, heightInput;
|
|
203
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
204
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
205
|
+
case 0:
|
|
206
|
+
user = _userEvent["default"].setup();
|
|
207
|
+
onChange = jest.fn();
|
|
208
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
209
|
+
onChange: onChange
|
|
210
|
+
})));
|
|
211
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
212
|
+
heightInput = _react2.screen.getByLabelText('Height');
|
|
213
|
+
_context6.next = 1;
|
|
214
|
+
return user.clear(widthInput);
|
|
215
|
+
case 1:
|
|
216
|
+
_context6.next = 2;
|
|
217
|
+
return user.type(widthInput, '150');
|
|
218
|
+
case 2:
|
|
219
|
+
_react2.fireEvent.blur(widthInput);
|
|
220
|
+
_context6.next = 3;
|
|
221
|
+
return user.clear(heightInput);
|
|
222
|
+
case 3:
|
|
223
|
+
_context6.next = 4;
|
|
224
|
+
return user.type(heightInput, '150');
|
|
225
|
+
case 4:
|
|
226
|
+
_react2.fireEvent.blur(heightInput);
|
|
227
|
+
expect(widthInput).toHaveValue(150);
|
|
228
|
+
expect(heightInput).toHaveValue(150);
|
|
229
|
+
case 5:
|
|
230
|
+
case "end":
|
|
231
|
+
return _context6.stop();
|
|
232
|
+
}
|
|
233
|
+
}, _callee6);
|
|
234
|
+
})));
|
|
235
|
+
it('handles boundary values at maximum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
236
|
+
var user, onChange, widthInput, heightInput;
|
|
237
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
238
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
239
|
+
case 0:
|
|
240
|
+
user = _userEvent["default"].setup();
|
|
241
|
+
onChange = jest.fn();
|
|
242
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
243
|
+
onChange: onChange
|
|
244
|
+
})));
|
|
245
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
246
|
+
heightInput = _react2.screen.getByLabelText('Height');
|
|
247
|
+
_context7.next = 1;
|
|
248
|
+
return user.clear(widthInput);
|
|
249
|
+
case 1:
|
|
250
|
+
_context7.next = 2;
|
|
251
|
+
return user.type(widthInput, '1000');
|
|
252
|
+
case 2:
|
|
253
|
+
_react2.fireEvent.blur(widthInput);
|
|
254
|
+
_context7.next = 3;
|
|
255
|
+
return user.clear(heightInput);
|
|
256
|
+
case 3:
|
|
257
|
+
_context7.next = 4;
|
|
258
|
+
return user.type(heightInput, '1000');
|
|
259
|
+
case 4:
|
|
260
|
+
_react2.fireEvent.blur(heightInput);
|
|
261
|
+
expect(widthInput).toHaveValue(1000);
|
|
262
|
+
expect(heightInput).toHaveValue(1000);
|
|
263
|
+
case 5:
|
|
264
|
+
case "end":
|
|
265
|
+
return _context7.stop();
|
|
266
|
+
}
|
|
267
|
+
}, _callee7);
|
|
268
|
+
})));
|
|
269
|
+
it('handles decimal input values', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
270
|
+
var user, onChange, widthInput;
|
|
271
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
272
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
273
|
+
case 0:
|
|
274
|
+
user = _userEvent["default"].setup();
|
|
275
|
+
onChange = jest.fn();
|
|
276
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
277
|
+
onChange: onChange
|
|
278
|
+
})));
|
|
279
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
280
|
+
_context8.next = 1;
|
|
281
|
+
return user.clear(widthInput);
|
|
282
|
+
case 1:
|
|
283
|
+
_context8.next = 2;
|
|
284
|
+
return user.type(widthInput, '500.5');
|
|
285
|
+
case 2:
|
|
286
|
+
_react2.fireEvent.blur(widthInput);
|
|
287
|
+
expect(widthInput).toBeInTheDocument();
|
|
288
|
+
case 3:
|
|
289
|
+
case "end":
|
|
290
|
+
return _context8.stop();
|
|
291
|
+
}
|
|
292
|
+
}, _callee8);
|
|
293
|
+
})));
|
|
294
|
+
it('handles empty input and resets to min', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
295
|
+
var user, onChange, widthInput;
|
|
296
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
297
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
298
|
+
case 0:
|
|
299
|
+
user = _userEvent["default"].setup();
|
|
300
|
+
onChange = jest.fn();
|
|
301
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
302
|
+
onChange: onChange
|
|
303
|
+
})));
|
|
304
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
305
|
+
_context9.next = 1;
|
|
306
|
+
return user.clear(widthInput);
|
|
307
|
+
case 1:
|
|
308
|
+
_react2.fireEvent.blur(widthInput);
|
|
309
|
+
|
|
310
|
+
// Should reset to minimum value
|
|
311
|
+
expect(widthInput).toHaveValue(150);
|
|
312
|
+
case 2:
|
|
313
|
+
case "end":
|
|
314
|
+
return _context9.stop();
|
|
315
|
+
}
|
|
316
|
+
}, _callee9);
|
|
317
|
+
})));
|
|
318
|
+
it('handles rapid width and height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
319
|
+
var user, onChange, widthInput;
|
|
320
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
321
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
322
|
+
case 0:
|
|
323
|
+
user = _userEvent["default"].setup();
|
|
324
|
+
onChange = jest.fn();
|
|
325
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
326
|
+
onChange: onChange
|
|
327
|
+
})));
|
|
328
|
+
widthInput = _react2.screen.getByLabelText('Width');
|
|
329
|
+
_context0.next = 1;
|
|
330
|
+
return user.clear(widthInput);
|
|
331
|
+
case 1:
|
|
332
|
+
_context0.next = 2;
|
|
333
|
+
return user.type(widthInput, '6');
|
|
334
|
+
case 2:
|
|
335
|
+
_context0.next = 3;
|
|
336
|
+
return user.type(widthInput, '0');
|
|
337
|
+
case 3:
|
|
338
|
+
_context0.next = 4;
|
|
339
|
+
return user.type(widthInput, '0');
|
|
340
|
+
case 4:
|
|
341
|
+
_react2.fireEvent.blur(widthInput);
|
|
342
|
+
expect(onChange).toHaveBeenCalled();
|
|
343
|
+
case 5:
|
|
344
|
+
case "end":
|
|
345
|
+
return _context0.stop();
|
|
346
|
+
}
|
|
347
|
+
}, _callee0);
|
|
348
|
+
})));
|
|
349
|
+
it('clamps height at both boundaries', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
350
|
+
var user, onChange, heightInput;
|
|
351
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
352
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
353
|
+
case 0:
|
|
354
|
+
user = _userEvent["default"].setup();
|
|
355
|
+
onChange = jest.fn();
|
|
356
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
357
|
+
onChange: onChange
|
|
358
|
+
})));
|
|
359
|
+
heightInput = _react2.screen.getByLabelText('Height'); // Test below min
|
|
360
|
+
_context1.next = 1;
|
|
361
|
+
return user.clear(heightInput);
|
|
362
|
+
case 1:
|
|
363
|
+
_context1.next = 2;
|
|
364
|
+
return user.type(heightInput, '50');
|
|
365
|
+
case 2:
|
|
366
|
+
_react2.fireEvent.blur(heightInput);
|
|
367
|
+
expect(heightInput).toHaveValue(150);
|
|
368
|
+
|
|
369
|
+
// Test above max
|
|
370
|
+
_context1.next = 3;
|
|
371
|
+
return user.clear(heightInput);
|
|
372
|
+
case 3:
|
|
373
|
+
_context1.next = 4;
|
|
374
|
+
return user.type(heightInput, '2500');
|
|
375
|
+
case 4:
|
|
376
|
+
_react2.fireEvent.blur(heightInput);
|
|
377
|
+
expect(heightInput).toHaveValue(1000);
|
|
378
|
+
case 5:
|
|
379
|
+
case "end":
|
|
380
|
+
return _context1.stop();
|
|
381
|
+
}
|
|
382
|
+
}, _callee1);
|
|
383
|
+
})));
|
|
384
|
+
it('displays custom label text', function () {
|
|
385
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], {
|
|
386
|
+
size: {
|
|
387
|
+
width: 500,
|
|
388
|
+
height: 400
|
|
389
|
+
},
|
|
390
|
+
label: "Custom Size Settings",
|
|
391
|
+
onChange: jest.fn()
|
|
392
|
+
}));
|
|
393
|
+
expect(_react2.screen.getByText('Custom Size Settings')).toBeInTheDocument();
|
|
394
|
+
});
|
|
395
|
+
it('renders with variant outlined', function () {
|
|
396
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
|
|
397
|
+
container = _render2.container;
|
|
398
|
+
var inputs = container.querySelectorAll('input');
|
|
399
|
+
expect(inputs.length).toBe(2);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
describe('SettingsRadioLabel', function () {
|
|
403
|
+
it('renders radio label', function () {
|
|
404
|
+
var onChange = jest.fn();
|
|
405
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
406
|
+
label: "Option 1",
|
|
407
|
+
value: "option1",
|
|
408
|
+
checked: false,
|
|
409
|
+
onChange: onChange
|
|
410
|
+
}));
|
|
411
|
+
expect(_react2.screen.getByText('Option 1')).toBeInTheDocument();
|
|
412
|
+
expect(_react2.screen.getByRole('radio')).toBeInTheDocument();
|
|
413
|
+
});
|
|
414
|
+
it('renders checked state', function () {
|
|
415
|
+
var onChange = jest.fn();
|
|
416
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
417
|
+
label: "Option 1",
|
|
418
|
+
value: "option1",
|
|
419
|
+
checked: true,
|
|
420
|
+
onChange: onChange
|
|
421
|
+
}));
|
|
422
|
+
var radio = _react2.screen.getByRole('radio');
|
|
423
|
+
expect(radio).toBeChecked();
|
|
424
|
+
});
|
|
425
|
+
it('renders unchecked state', function () {
|
|
426
|
+
var onChange = jest.fn();
|
|
427
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
428
|
+
label: "Option 1",
|
|
429
|
+
value: "option1",
|
|
430
|
+
checked: false,
|
|
431
|
+
onChange: onChange
|
|
432
|
+
}));
|
|
433
|
+
var radio = _react2.screen.getByRole('radio');
|
|
434
|
+
expect(radio).not.toBeChecked();
|
|
435
|
+
});
|
|
436
|
+
it('calls onChange when radio is clicked', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
437
|
+
var user, onChange, radio;
|
|
438
|
+
return _regenerator["default"].wrap(function (_context10) {
|
|
439
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
440
|
+
case 0:
|
|
441
|
+
user = _userEvent["default"].setup();
|
|
442
|
+
onChange = jest.fn();
|
|
443
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
444
|
+
label: "Option 1",
|
|
445
|
+
value: "option1",
|
|
446
|
+
checked: false,
|
|
447
|
+
onChange: onChange
|
|
448
|
+
}));
|
|
449
|
+
radio = _react2.screen.getByRole('radio');
|
|
450
|
+
_context10.next = 1;
|
|
451
|
+
return user.click(radio);
|
|
452
|
+
case 1:
|
|
453
|
+
expect(onChange).toHaveBeenCalled();
|
|
454
|
+
case 2:
|
|
455
|
+
case "end":
|
|
456
|
+
return _context10.stop();
|
|
457
|
+
}
|
|
458
|
+
}, _callee10);
|
|
459
|
+
})));
|
|
460
|
+
it('displays label text correctly', function () {
|
|
461
|
+
var onChange = jest.fn();
|
|
462
|
+
var labelText = 'Custom Option Label';
|
|
463
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
464
|
+
label: labelText,
|
|
465
|
+
value: "custom",
|
|
466
|
+
checked: false,
|
|
467
|
+
onChange: onChange
|
|
468
|
+
}));
|
|
469
|
+
expect(_react2.screen.getByText(labelText)).toBeInTheDocument();
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
describe('Panel', function () {
|
|
473
|
+
var defaultProps = {
|
|
474
|
+
model: {
|
|
475
|
+
toggleSetting: true,
|
|
476
|
+
numberValue: 5
|
|
477
|
+
},
|
|
478
|
+
configuration: {
|
|
479
|
+
configValue: 'test'
|
|
480
|
+
},
|
|
481
|
+
groups: {
|
|
482
|
+
'General Settings': {
|
|
483
|
+
toggleSetting: {
|
|
484
|
+
type: 'toggle',
|
|
485
|
+
label: 'Enable Feature'
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
onChangeModel: jest.fn(),
|
|
490
|
+
onChangeConfiguration: jest.fn()
|
|
491
|
+
};
|
|
492
|
+
beforeEach(function () {
|
|
493
|
+
jest.clearAllMocks();
|
|
494
|
+
});
|
|
495
|
+
it('renders panel with group label', function () {
|
|
496
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, defaultProps));
|
|
497
|
+
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
498
|
+
});
|
|
499
|
+
it('renders empty when groups is undefined', function () {
|
|
500
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
501
|
+
groups: undefined
|
|
502
|
+
}))),
|
|
503
|
+
container = _render3.container;
|
|
504
|
+
expect(container.firstChild.children.length).toBe(0);
|
|
505
|
+
});
|
|
506
|
+
it('renders empty when groups is empty', function () {
|
|
507
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
508
|
+
groups: {}
|
|
509
|
+
}))),
|
|
510
|
+
container = _render4.container;
|
|
511
|
+
expect(container.firstChild.children.length).toBe(0);
|
|
512
|
+
});
|
|
513
|
+
it('calls onChangeModel when model changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
514
|
+
var user, onChangeModel, _render5, container, switchElement;
|
|
515
|
+
return _regenerator["default"].wrap(function (_context11) {
|
|
516
|
+
while (1) switch (_context11.prev = _context11.next) {
|
|
517
|
+
case 0:
|
|
518
|
+
user = _userEvent["default"].setup();
|
|
519
|
+
onChangeModel = jest.fn();
|
|
520
|
+
_render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
521
|
+
onChangeModel: onChangeModel
|
|
522
|
+
}))), container = _render5.container;
|
|
523
|
+
switchElement = container.querySelector('input[type="checkbox"]');
|
|
524
|
+
_context11.next = 1;
|
|
525
|
+
return user.click(switchElement);
|
|
526
|
+
case 1:
|
|
527
|
+
expect(onChangeModel).toHaveBeenCalled();
|
|
528
|
+
case 2:
|
|
529
|
+
case "end":
|
|
530
|
+
return _context11.stop();
|
|
531
|
+
}
|
|
532
|
+
}, _callee11);
|
|
533
|
+
})));
|
|
534
|
+
it('calls onChangeConfiguration when configuration changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
535
|
+
var user, onChangeConfiguration, _render6, container, switchElement;
|
|
536
|
+
return _regenerator["default"].wrap(function (_context12) {
|
|
537
|
+
while (1) switch (_context12.prev = _context12.next) {
|
|
538
|
+
case 0:
|
|
539
|
+
user = _userEvent["default"].setup();
|
|
540
|
+
onChangeConfiguration = jest.fn();
|
|
541
|
+
_render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
542
|
+
groups: {
|
|
543
|
+
'Config Group': {
|
|
544
|
+
configValue: {
|
|
545
|
+
type: 'toggle',
|
|
546
|
+
label: 'Config Toggle',
|
|
547
|
+
isConfigProperty: true
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
},
|
|
551
|
+
onChangeConfiguration: onChangeConfiguration
|
|
552
|
+
}))), container = _render6.container;
|
|
553
|
+
switchElement = container.querySelector('input[type="checkbox"]');
|
|
554
|
+
_context12.next = 1;
|
|
555
|
+
return user.click(switchElement);
|
|
556
|
+
case 1:
|
|
557
|
+
expect(onChangeConfiguration).toHaveBeenCalled();
|
|
558
|
+
case 2:
|
|
559
|
+
case "end":
|
|
560
|
+
return _context12.stop();
|
|
561
|
+
}
|
|
562
|
+
}, _callee12);
|
|
563
|
+
})));
|
|
564
|
+
it('renders with modal when provided', function () {
|
|
565
|
+
var modal = /*#__PURE__*/_react["default"].createElement("div", {
|
|
566
|
+
"data-testid": "test-modal"
|
|
567
|
+
}, "Modal Content");
|
|
568
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
569
|
+
modal: modal
|
|
570
|
+
})));
|
|
571
|
+
expect(_react2.screen.getByTestId('test-modal')).toBeInTheDocument();
|
|
572
|
+
expect(_react2.screen.getByText('Modal Content')).toBeInTheDocument();
|
|
573
|
+
});
|
|
574
|
+
it('renders multiple groups', function () {
|
|
575
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
576
|
+
groups: {
|
|
577
|
+
'Group One': {
|
|
578
|
+
setting1: {
|
|
579
|
+
type: 'toggle',
|
|
580
|
+
label: 'Setting One'
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
'Group Two': {
|
|
584
|
+
setting2: {
|
|
585
|
+
type: 'toggle',
|
|
586
|
+
label: 'Setting Two'
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
},
|
|
590
|
+
model: {
|
|
591
|
+
setting1: true,
|
|
592
|
+
setting2: false
|
|
593
|
+
}
|
|
594
|
+
})));
|
|
595
|
+
expect(_react2.screen.getByText('Group One')).toBeInTheDocument();
|
|
596
|
+
expect(_react2.screen.getByText('Group Two')).toBeInTheDocument();
|
|
597
|
+
});
|
|
598
|
+
it('uses default callbacks when not provided', function () {
|
|
599
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
|
|
600
|
+
model: {
|
|
601
|
+
test: true
|
|
602
|
+
},
|
|
603
|
+
groups: {
|
|
604
|
+
'Test Group': {
|
|
605
|
+
test: {
|
|
606
|
+
type: 'toggle',
|
|
607
|
+
label: 'Test'
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
})),
|
|
612
|
+
container = _render7.container;
|
|
613
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
614
|
+
});
|
|
615
|
+
it('filters out empty groups', function () {
|
|
616
|
+
var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
617
|
+
groups: {
|
|
618
|
+
'Empty Group': {},
|
|
619
|
+
'General Settings': {
|
|
620
|
+
toggleSetting: {
|
|
621
|
+
type: 'toggle',
|
|
622
|
+
label: 'Enable Feature'
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
model: {
|
|
627
|
+
toggleSetting: true
|
|
628
|
+
}
|
|
629
|
+
}))),
|
|
630
|
+
container = _render8.container;
|
|
631
|
+
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
632
|
+
expect(_react2.screen.queryByText('Empty Group')).not.toBeInTheDocument();
|
|
633
|
+
});
|
|
634
|
+
it('renders with null model', function () {
|
|
635
|
+
var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
|
|
636
|
+
model: null,
|
|
637
|
+
configuration: {},
|
|
638
|
+
groups: {
|
|
639
|
+
'General Settings': {
|
|
640
|
+
toggleSetting: {
|
|
641
|
+
type: 'toggle',
|
|
642
|
+
label: 'Enable Feature'
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
onChangeModel: jest.fn()
|
|
647
|
+
})),
|
|
648
|
+
container = _render9.container;
|
|
649
|
+
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
650
|
+
});
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX3RvZ2dsZSIsIl9kaXNwbGF5U2l6ZSIsIl9zZXR0aW5nc1JhZGlvTGFiZWwiLCJfcGFuZWwiLCJkZXNjcmliZSIsIml0IiwidG9nZ2xlIiwiamVzdCIsImZuIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImxhYmVsIiwiY2hlY2tlZCIsImV4cGVjdCIsInNjcmVlbiIsImdldEJ5VGV4dCIsInRvQmVJblRoZURvY3VtZW50IiwiZGVmYXVsdFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25DaGFuZ2UiLCJiZWZvcmVFYWNoIiwiY2xlYXJBbGxNb2NrcyIsImdldEJ5TGFiZWxUZXh0Iiwid2lkdGhJbnB1dCIsImhlaWdodElucHV0IiwidG9IYXZlVmFsdWUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiX2V4dGVuZHMyIiwiY2xlYXIiLCJ0eXBlIiwiZmlyZUV2ZW50IiwiYmx1ciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInN0b3AiLCJfY2FsbGVlMiIsIl9jb250ZXh0MiIsIl9jYWxsZWUzIiwiX2NvbnRleHQzIiwiX2NhbGxlZTQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIl9jYWxsZWU2IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfY29udGV4dDciLCJfY2FsbGVlOCIsIl9jb250ZXh0OCIsIl9jYWxsZWU5IiwiX2NvbnRleHQ5IiwiX2NhbGxlZTAiLCJfY29udGV4dDAiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX2NhbGxlZTEiLCJfY29udGV4dDEiLCJfcmVuZGVyMiIsImNvbnRhaW5lciIsImlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJ0b0JlIiwidmFsdWUiLCJnZXRCeVJvbGUiLCJyYWRpbyIsInRvQmVDaGVja2VkIiwibm90IiwiX2NhbGxlZTEwIiwiX2NvbnRleHQxMCIsImNsaWNrIiwibGFiZWxUZXh0IiwibW9kZWwiLCJ0b2dnbGVTZXR0aW5nIiwibnVtYmVyVmFsdWUiLCJjb25maWd1cmF0aW9uIiwiY29uZmlnVmFsdWUiLCJncm91cHMiLCJvbkNoYW5nZU1vZGVsIiwib25DaGFuZ2VDb25maWd1cmF0aW9uIiwiUGFuZWwiLCJfcmVuZGVyMyIsInVuZGVmaW5lZCIsImZpcnN0Q2hpbGQiLCJjaGlsZHJlbiIsIl9yZW5kZXI0IiwiX2NhbGxlZTExIiwiX3JlbmRlcjUiLCJzd2l0Y2hFbGVtZW50IiwiX2NvbnRleHQxMSIsInF1ZXJ5U2VsZWN0b3IiLCJfY2FsbGVlMTIiLCJfcmVuZGVyNiIsIl9jb250ZXh0MTIiLCJpc0NvbmZpZ1Byb3BlcnR5IiwibW9kYWwiLCJnZXRCeVRlc3RJZCIsInNldHRpbmcxIiwic2V0dGluZzIiLCJfcmVuZGVyNyIsInRlc3QiLCJfcmVuZGVyOCIsInF1ZXJ5QnlUZXh0IiwiX3JlbmRlcjkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3NldHRpbmdzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiwgZmlyZUV2ZW50IH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgVG9nZ2xlIGZyb20gJy4uL3NldHRpbmdzL3RvZ2dsZSc7XG5pbXBvcnQgRGlzcGxheVNpemUgZnJvbSAnLi4vc2V0dGluZ3MvZGlzcGxheS1zaXplJztcbmltcG9ydCBTZXR0aW5nc1JhZGlvTGFiZWwgZnJvbSAnLi4vc2V0dGluZ3Mvc2V0dGluZ3MtcmFkaW8tbGFiZWwnO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tICcuLi9zZXR0aW5ncy9wYW5lbCc7XG5cbmRlc2NyaWJlKCdTZXR0aW5ncyBDb21wb25lbnRzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnVG9nZ2xlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHRvZ2dsZSB3aXRoIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9nZ2xlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxUb2dnbGUgbGFiZWw9XCJFbmFibGUgRmVhdHVyZVwiIGNoZWNrZWQ9e2ZhbHNlfSB0b2dnbGU9e3RvZ2dsZX0gLz4pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnRW5hYmxlIEZlYXR1cmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rpc3BsYXlTaXplJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHNpemU6IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfSxcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBTaXplJyxcbiAgICAgIG9uQ2hhbmdlOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbCBhbmQgaW5wdXQgZmllbGRzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdEaXNwbGF5IFNpemUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdIZWlnaHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoNTAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoNDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHdpZHRoIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgd2lkdGg6IDYwMCB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBoZWlnaHQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICc1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGhlaWdodDogNTAwIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgb3RoZXIgZGltZW5zaW9uIHdoZW4gb25lIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc3MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgd2lkdGg6IDcwMCxcbiAgICAgICAgaGVpZ2h0OiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmZvcmNlcyBtaW4gdmFsdWUgY29uc3RyYWludCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzEwMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIC8vIFNob3VsZCBjbGFtcCB0byBtaW5pbXVtIDE1MFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5mb3JjZXMgbWF4IHZhbHVlIGNvbnN0cmFpbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcyMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIGNsYW1wIHRvIG1heGltdW0gMTAwMFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDEwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgd2hlbiBzaXplIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBsZXQgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSg1MDApO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IHNpemU9e3sgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfX0gLz5cbiAgICAgICk7XG5cbiAgICAgIHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoODAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtaW5pbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxNTAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzE1MCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtYXhpbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxMDAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGlucHV0IHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzUwMC41Jyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBpbnB1dCBhbmQgcmVzZXRzIHRvIG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIHJlc2V0IHRvIG1pbmltdW0gdmFsdWVcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxNTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmFwaWQgd2lkdGggYW5kIGhlaWdodCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2Jyk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzAnKTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZSh3aWR0aElucHV0LCAnMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NsYW1wcyBoZWlnaHQgYXQgYm90aCBib3VuZGFyaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCBoZWlnaHRJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnSGVpZ2h0Jyk7XG5cbiAgICAgIC8vIFRlc3QgYmVsb3cgbWluXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzUwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG4gICAgICBleHBlY3QoaGVpZ2h0SW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG5cbiAgICAgIC8vIFRlc3QgYWJvdmUgbWF4XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzI1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzcGxheXMgY3VzdG9tIGxhYmVsIHRleHQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxEaXNwbGF5U2l6ZVxuICAgICAgICAgIHNpemU9e3sgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfX1cbiAgICAgICAgICBsYWJlbD1cIkN1c3RvbSBTaXplIFNldHRpbmdzXCJcbiAgICAgICAgICBvbkNoYW5nZT17amVzdC5mbigpfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0N1c3RvbSBTaXplIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZhcmlhbnQgb3V0bGluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0cy5sZW5ndGgpLnRvQmUoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXR0aW5nc1JhZGlvTGFiZWwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgcmFkaW8gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ09wdGlvbiAxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGNoZWNrZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17dHJ1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBjb25zdCByYWRpbyA9IHNjcmVlbi5nZXRCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBleHBlY3QocmFkaW8pLnRvQmVDaGVja2VkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB1bmNoZWNrZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgZXhwZWN0KHJhZGlvKS5ub3QudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhZGlvIGlzIGNsaWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhyYWRpbyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIGxhYmVsIHRleHQgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBsYWJlbFRleHQgPSAnQ3VzdG9tIE9wdGlvbiBMYWJlbCc7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxTZXR0aW5nc1JhZGlvTGFiZWxcbiAgICAgICAgICBsYWJlbD17bGFiZWxUZXh0fVxuICAgICAgICAgIHZhbHVlPVwiY3VzdG9tXCJcbiAgICAgICAgICBjaGVja2VkPXtmYWxzZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dChsYWJlbFRleHQpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFuZWwnLCAoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbW9kZWw6IHsgdG9nZ2xlU2V0dGluZzogdHJ1ZSwgbnVtYmVyVmFsdWU6IDUgfSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHsgY29uZmlnVmFsdWU6ICd0ZXN0JyB9LFxuICAgICAgZ3JvdXBzOiB7XG4gICAgICAgICdHZW5lcmFsIFNldHRpbmdzJzoge1xuICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdFbmFibGUgRmVhdHVyZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZU1vZGVsOiBqZXN0LmZuKCksXG4gICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb246IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHBhbmVsIHdpdGggZ3JvdXAgbGFiZWwnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHZW5lcmFsIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlbXB0eSB3aGVuIGdyb3VwcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17dW5kZWZpbmVkfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZC5jaGlsZHJlbi5sZW5ndGgpLnRvQmUoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlbXB0eSB3aGVuIGdyb3VwcyBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7fX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlTW9kZWwgd2hlbiBtb2RlbCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VNb2RlbCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgb25DaGFuZ2VNb2RlbD17b25DaGFuZ2VNb2RlbH1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNb2RlbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlQ29uZmlndXJhdGlvbiB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlQ29uZmlndXJhdGlvbiA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnQ29uZmlnIEdyb3VwJzoge1xuICAgICAgICAgICAgICBjb25maWdWYWx1ZToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29uZmlnIFRvZ2dsZScsXG4gICAgICAgICAgICAgICAgaXNDb25maWdQcm9wZXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb249e29uQ2hhbmdlQ29uZmlndXJhdGlvbn1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VDb25maWd1cmF0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1vZGFsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IDxkaXYgZGF0YS10ZXN0aWQ9XCJ0ZXN0LW1vZGFsXCI+TW9kYWwgQ29udGVudDwvZGl2PjtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBtb2RhbD17bW9kYWx9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCd0ZXN0LW1vZGFsJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnTW9kYWwgQ29udGVudCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgbXVsdGlwbGUgZ3JvdXBzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0dyb3VwIE9uZSc6IHtcbiAgICAgICAgICAgICAgc2V0dGluZzE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1NldHRpbmcgT25lJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR3JvdXAgVHdvJzoge1xuICAgICAgICAgICAgICBzZXR0aW5nMjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZyBUd28nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG1vZGVsPXt7IHNldHRpbmcxOiB0cnVlLCBzZXR0aW5nMjogZmFsc2UgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBPbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBUd28nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIGRlZmF1bHQgY2FsbGJhY2tzIHdoZW4gbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e3sgdGVzdDogdHJ1ZSB9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ1Rlc3QgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIHRlc3Q6IHsgdHlwZTogJ3RvZ2dsZScsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdmaWx0ZXJzIG91dCBlbXB0eSBncm91cHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0VtcHR5IEdyb3VwJzoge30sXG4gICAgICAgICAgICAnR2VuZXJhbCBTZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlIEZlYXR1cmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG1vZGVsPXt7IHRvZ2dsZVNldHRpbmc6IHRydWUgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHZW5lcmFsIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdFbXB0eSBHcm91cCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbnVsbCBtb2RlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIG1vZGVsPXtudWxsfVxuICAgICAgICAgIGNvbmZpZ3VyYXRpb249e3t9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNoYW5nZU1vZGVsPXtqZXN0LmZuKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnR2VuZXJhbCBTZXR0aW5ncycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxtQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFB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
|