@pie-lib/config-ui 12.2.0-next.0 → 12.2.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/lib/__tests__/alert-dialog.test.js +262 -0
  2. package/lib/__tests__/checkbox.test.js +227 -0
  3. package/lib/__tests__/choice-utils.test.js +14 -0
  4. package/lib/__tests__/form-section.test.js +252 -0
  5. package/lib/__tests__/help.test.js +270 -0
  6. package/lib/__tests__/input.test.js +268 -0
  7. package/lib/__tests__/langs.test.js +541 -0
  8. package/lib/__tests__/number-text-field-custom.test.js +362 -0
  9. package/lib/__tests__/number-text-field.test.js +421 -0
  10. package/lib/__tests__/radio-with-label.test.js +233 -0
  11. package/lib/__tests__/settings-panel.test.js +184 -0
  12. package/lib/__tests__/settings.test.js +653 -0
  13. package/lib/__tests__/tabs.test.js +211 -0
  14. package/lib/__tests__/two-choice.test.js +124 -0
  15. package/lib/__tests__/with-stateful-model.test.js +221 -0
  16. package/lib/alert-dialog.js +1 -1
  17. package/lib/checkbox.js +1 -1
  18. package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
  19. package/lib/choice-configuration/__tests__/index.test.js +253 -0
  20. package/lib/choice-configuration/feedback-menu.js +1 -1
  21. package/lib/choice-configuration/index.js +1 -1
  22. package/lib/choice-utils.js +1 -1
  23. package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
  24. package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
  25. package/lib/feedback-config/feedback-selector.js +1 -1
  26. package/lib/feedback-config/group.js +1 -1
  27. package/lib/feedback-config/index.js +1 -1
  28. package/lib/form-section.js +1 -1
  29. package/lib/help.js +1 -1
  30. package/lib/index.js +1 -1
  31. package/lib/input.js +1 -1
  32. package/lib/inputs.js +1 -1
  33. package/lib/langs.js +1 -1
  34. package/lib/layout/__tests__/config.layout.test.js +70 -0
  35. package/lib/layout/__tests__/layout-content.test.js +6 -0
  36. package/lib/layout/config-layout.js +1 -1
  37. package/lib/layout/index.js +1 -1
  38. package/lib/layout/layout-contents.js +1 -1
  39. package/lib/layout/settings-box.js +1 -1
  40. package/lib/mui-box/index.js +1 -1
  41. package/lib/number-text-field-custom.js +1 -1
  42. package/lib/number-text-field.js +1 -1
  43. package/lib/radio-with-label.js +1 -1
  44. package/lib/settings/display-size.js +1 -1
  45. package/lib/settings/index.js +1 -1
  46. package/lib/settings/panel.js +1 -1
  47. package/lib/settings/settings-radio-label.js +1 -1
  48. package/lib/settings/toggle.js +1 -1
  49. package/lib/tabs/index.js +1 -1
  50. package/lib/tags-input/__tests__/index.test.js +183 -0
  51. package/lib/tags-input/index.js +1 -1
  52. package/lib/two-choice.js +1 -1
  53. package/lib/with-stateful-model.js +1 -1
  54. package/package.json +6 -9
  55. package/LICENSE.md +0 -5
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX3RvZ2dsZSIsIl9kaXNwbGF5U2l6ZSIsIl9zZXR0aW5nc1JhZGlvTGFiZWwiLCJfcGFuZWwiLCJkZXNjcmliZSIsIml0IiwidG9nZ2xlIiwiamVzdCIsImZuIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImxhYmVsIiwiY2hlY2tlZCIsImV4cGVjdCIsInNjcmVlbiIsImdldEJ5VGV4dCIsInRvQmVJblRoZURvY3VtZW50IiwiZGVmYXVsdFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25DaGFuZ2UiLCJiZWZvcmVFYWNoIiwiY2xlYXJBbGxNb2NrcyIsImdldEJ5TGFiZWxUZXh0Iiwid2lkdGhJbnB1dCIsImhlaWdodElucHV0IiwidG9IYXZlVmFsdWUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiX2V4dGVuZHMyIiwiY2xlYXIiLCJ0eXBlIiwiZmlyZUV2ZW50IiwiYmx1ciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInN0b3AiLCJfY2FsbGVlMiIsIl9jb250ZXh0MiIsIl9jYWxsZWUzIiwiX2NvbnRleHQzIiwiX2NhbGxlZTQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIl9jYWxsZWU2IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfY29udGV4dDciLCJfY2FsbGVlOCIsIl9jb250ZXh0OCIsIl9jYWxsZWU5IiwiX2NvbnRleHQ5IiwiX2NhbGxlZTAiLCJfY29udGV4dDAiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX2NhbGxlZTEiLCJfY29udGV4dDEiLCJfcmVuZGVyMiIsImNvbnRhaW5lciIsImlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJ0b0JlIiwidmFsdWUiLCJnZXRCeVJvbGUiLCJyYWRpbyIsInRvQmVDaGVja2VkIiwibm90IiwiX2NhbGxlZTEwIiwiX2NvbnRleHQxMCIsImNsaWNrIiwibGFiZWxUZXh0IiwibW9kZWwiLCJ0b2dnbGVTZXR0aW5nIiwibnVtYmVyVmFsdWUiLCJjb25maWd1cmF0aW9uIiwiY29uZmlnVmFsdWUiLCJncm91cHMiLCJvbkNoYW5nZU1vZGVsIiwib25DaGFuZ2VDb25maWd1cmF0aW9uIiwiUGFuZWwiLCJfcmVuZGVyMyIsInVuZGVmaW5lZCIsImZpcnN0Q2hpbGQiLCJjaGlsZHJlbiIsIl9yZW5kZXI0IiwiX2NhbGxlZTExIiwiX3JlbmRlcjUiLCJzd2l0Y2hFbGVtZW50IiwiX2NvbnRleHQxMSIsInF1ZXJ5U2VsZWN0b3IiLCJfY2FsbGVlMTIiLCJfcmVuZGVyNiIsIl9jb250ZXh0MTIiLCJpc0NvbmZpZ1Byb3BlcnR5IiwibW9kYWwiLCJnZXRCeVRlc3RJZCIsInNldHRpbmcxIiwic2V0dGluZzIiLCJfcmVuZGVyNyIsInRlc3QiLCJfcmVuZGVyOCIsInF1ZXJ5QnlUZXh0IiwiX3JlbmRlcjkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3NldHRpbmdzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJlRXZlbnQsIHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgVG9nZ2xlIGZyb20gJy4uL3NldHRpbmdzL3RvZ2dsZSc7XG5pbXBvcnQgRGlzcGxheVNpemUgZnJvbSAnLi4vc2V0dGluZ3MvZGlzcGxheS1zaXplJztcbmltcG9ydCBTZXR0aW5nc1JhZGlvTGFiZWwgZnJvbSAnLi4vc2V0dGluZ3Mvc2V0dGluZ3MtcmFkaW8tbGFiZWwnO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tICcuLi9zZXR0aW5ncy9wYW5lbCc7XG5cbmRlc2NyaWJlKCdTZXR0aW5ncyBDb21wb25lbnRzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnVG9nZ2xlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHRvZ2dsZSB3aXRoIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9nZ2xlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxUb2dnbGUgbGFiZWw9XCJFbmFibGUgRmVhdHVyZVwiIGNoZWNrZWQ9e2ZhbHNlfSB0b2dnbGU9e3RvZ2dsZX0gLz4pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnRW5hYmxlIEZlYXR1cmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rpc3BsYXlTaXplJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHNpemU6IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfSxcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBTaXplJyxcbiAgICAgIG9uQ2hhbmdlOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbCBhbmQgaW5wdXQgZmllbGRzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdEaXNwbGF5IFNpemUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdIZWlnaHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoNTAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoNDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHdpZHRoIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgd2lkdGg6IDYwMCB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBoZWlnaHQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICc1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGhlaWdodDogNTAwIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgb3RoZXIgZGltZW5zaW9uIHdoZW4gb25lIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc3MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgd2lkdGg6IDcwMCxcbiAgICAgICAgaGVpZ2h0OiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmZvcmNlcyBtaW4gdmFsdWUgY29uc3RyYWludCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzEwMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIC8vIFNob3VsZCBjbGFtcCB0byBtaW5pbXVtIDE1MFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5mb3JjZXMgbWF4IHZhbHVlIGNvbnN0cmFpbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcyMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIGNsYW1wIHRvIG1heGltdW0gMTAwMFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDEwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgd2hlbiBzaXplIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBsZXQgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSg1MDApO1xuXG4gICAgICByZXJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gc2l6ZT17eyB3aWR0aDogODAwLCBoZWlnaHQ6IDYwMCB9fSAvPik7XG5cbiAgICAgIHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoODAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtaW5pbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxNTAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzE1MCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtYXhpbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxMDAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGlucHV0IHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzUwMC41Jyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBpbnB1dCBhbmQgcmVzZXRzIHRvIG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIHJlc2V0IHRvIG1pbmltdW0gdmFsdWVcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxNTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmFwaWQgd2lkdGggYW5kIGhlaWdodCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2Jyk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzAnKTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZSh3aWR0aElucHV0LCAnMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NsYW1wcyBoZWlnaHQgYXQgYm90aCBib3VuZGFyaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCBoZWlnaHRJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnSGVpZ2h0Jyk7XG5cbiAgICAgIC8vIFRlc3QgYmVsb3cgbWluXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzUwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG4gICAgICBleHBlY3QoaGVpZ2h0SW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG5cbiAgICAgIC8vIFRlc3QgYWJvdmUgbWF4XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzI1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzcGxheXMgY3VzdG9tIGxhYmVsIHRleHQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHNpemU9e3sgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfX0gbGFiZWw9XCJDdXN0b20gU2l6ZSBTZXR0aW5nc1wiIG9uQ2hhbmdlPXtqZXN0LmZuKCl9IC8+KTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0N1c3RvbSBTaXplIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZhcmlhbnQgb3V0bGluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0cy5sZW5ndGgpLnRvQmUoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXR0aW5nc1JhZGlvTGFiZWwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgcmFkaW8gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8U2V0dGluZ3NSYWRpb0xhYmVsIGxhYmVsPVwiT3B0aW9uIDFcIiB2YWx1ZT1cIm9wdGlvbjFcIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdPcHRpb24gMScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ3JhZGlvJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGVja2VkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPFNldHRpbmdzUmFkaW9MYWJlbCBsYWJlbD1cIk9wdGlvbiAxXCIgdmFsdWU9XCJvcHRpb24xXCIgY2hlY2tlZD17dHJ1ZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHJhZGlvID0gc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGV4cGVjdChyYWRpbykudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHVuY2hlY2tlZCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxTZXR0aW5nc1JhZGlvTGFiZWwgbGFiZWw9XCJPcHRpb24gMVwiIHZhbHVlPVwib3B0aW9uMVwiIGNoZWNrZWQ9e2ZhbHNlfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgZXhwZWN0KHJhZGlvKS5ub3QudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhZGlvIGlzIGNsaWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8U2V0dGluZ3NSYWRpb0xhYmVsIGxhYmVsPVwiT3B0aW9uIDFcIiB2YWx1ZT1cIm9wdGlvbjFcIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHJhZGlvID0gc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2socmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyBsYWJlbCB0ZXh0IGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbGFiZWxUZXh0ID0gJ0N1c3RvbSBPcHRpb24gTGFiZWwnO1xuICAgICAgcmVuZGVyKDxTZXR0aW5nc1JhZGlvTGFiZWwgbGFiZWw9e2xhYmVsVGV4dH0gdmFsdWU9XCJjdXN0b21cIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KGxhYmVsVGV4dCkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYW5lbCcsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICBtb2RlbDogeyB0b2dnbGVTZXR0aW5nOiB0cnVlLCBudW1iZXJWYWx1ZTogNSB9LFxuICAgICAgY29uZmlndXJhdGlvbjogeyBjb25maWdWYWx1ZTogJ3Rlc3QnIH0sXG4gICAgICBncm91cHM6IHtcbiAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlTW9kZWw6IGplc3QuZm4oKSxcbiAgICAgIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjogamVzdC5mbigpLFxuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgcGFuZWwgd2l0aCBncm91cCBsYWJlbCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8UGFuZWwgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0dlbmVyYWwgU2V0dGluZ3MnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGVtcHR5IHdoZW4gZ3JvdXBzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IGdyb3Vwcz17dW5kZWZpbmVkfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZW1wdHkgd2hlbiBncm91cHMgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxQYW5lbCB7Li4uZGVmYXVsdFByb3BzfSBncm91cHM9e3t9fSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlTW9kZWwgd2hlbiBtb2RlbCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VNb2RlbCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlTW9kZWw9e29uQ2hhbmdlTW9kZWx9IC8+KTtcblxuICAgICAgY29uc3Qgc3dpdGNoRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soc3dpdGNoRWxlbWVudCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1vZGVsKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VDb25maWd1cmF0aW9uIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VDb25maWd1cmF0aW9uID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBncm91cHM9e3tcbiAgICAgICAgICAgICdDb25maWcgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIGNvbmZpZ1ZhbHVlOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdDb25maWcgVG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBpc0NvbmZpZ1Byb3BlcnR5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlQ29uZmlndXJhdGlvbj17b25DaGFuZ2VDb25maWd1cmF0aW9ufVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VDb25maWd1cmF0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1vZGFsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IDxkaXYgZGF0YS10ZXN0aWQ9XCJ0ZXN0LW1vZGFsXCI+TW9kYWwgQ29udGVudDwvZGl2PjtcbiAgICAgIHJlbmRlcig8UGFuZWwgey4uLmRlZmF1bHRQcm9wc30gbW9kYWw9e21vZGFsfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ3Rlc3QtbW9kYWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdNb2RhbCBDb250ZW50JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBtdWx0aXBsZSBncm91cHMnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnR3JvdXAgT25lJzoge1xuICAgICAgICAgICAgICBzZXR0aW5nMToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZyBPbmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHcm91cCBUd28nOiB7XG4gICAgICAgICAgICAgIHNldHRpbmcyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdTZXR0aW5nIFR3bycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgbW9kZWw9e3sgc2V0dGluZzE6IHRydWUsIHNldHRpbmcyOiBmYWxzZSB9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBPbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBUd28nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIGRlZmF1bHQgY2FsbGJhY2tzIHdoZW4gbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e3sgdGVzdDogdHJ1ZSB9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ1Rlc3QgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIHRlc3Q6IHsgdHlwZTogJ3RvZ2dsZScsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmlsdGVycyBvdXQgZW1wdHkgZ3JvdXBzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBncm91cHM9e3tcbiAgICAgICAgICAgICdFbXB0eSBHcm91cCc6IHt9LFxuICAgICAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBtb2RlbD17eyB0b2dnbGVTZXR0aW5nOiB0cnVlIH19XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0dlbmVyYWwgU2V0dGluZ3MnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ0VtcHR5IEdyb3VwJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBudWxsIG1vZGVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e251bGx9XG4gICAgICAgICAgY29uZmlndXJhdGlvbj17e319XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnR2VuZXJhbCBTZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlIEZlYXR1cmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlTW9kZWw9e2plc3QuZm4oKX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnR2VuZXJhbCBTZXR0aW5ncycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxtQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUFPLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxZQUFNO0VBQ3BDQSxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQU07SUFDdkJDLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxZQUFNO01BQ3BDLElBQU1DLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztNQUN4QixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVixPQUFBLFdBQU07UUFBQ1csS0FBSyxFQUFDLGdCQUFnQjtRQUFDQyxPQUFPLEVBQUUsS0FBTTtRQUFDTixNQUFNLEVBQUVBO01BQU8sQ0FBRSxDQUFDLENBQUM7TUFFekVPLE1BQU0sQ0FBQ0MsY0FBTSxDQUFDQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGWixRQUFRLENBQUMsYUFBYSxFQUFFLFlBQU07SUFDNUIsSUFBTWEsWUFBWSxHQUFHO01BQ25CQyxJQUFJLEVBQUU7UUFBRUMsS0FBSyxFQUFFLEdBQUc7UUFBRUMsTUFBTSxFQUFFO01BQUksQ0FBQztNQUNqQ1QsS0FBSyxFQUFFLGNBQWM7TUFDckJVLFFBQVEsRUFBRWQsSUFBSSxDQUFDQyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEYyxVQUFVLENBQUMsWUFBTTtNQUNmZixJQUFJLENBQUNnQixhQUFhLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUM7SUFFRmxCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO01BQ3pDLElBQUFJLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxFQUFLZ0IsWUFBZSxDQUFDLENBQUM7TUFFekNKLE1BQU0sQ0FBQ0MsY0FBTSxDQUFDQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztNQUM1REgsTUFBTSxDQUFDQyxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDUixpQkFBaUIsQ0FBQyxDQUFDO01BQzFESCxNQUFNLENBQUNDLGNBQU0sQ0FBQ1UsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUNSLGlCQUFpQixDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0lBRUZYLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFNO01BQzNDLElBQUFJLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxFQUFLZ0IsWUFBZSxDQUFDLENBQUM7TUFFekMsSUFBTVEsVUFBVSxHQUFHWCxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUM7TUFDakQsSUFBTUUsV0FBVyxHQUFHWixjQUFNLENBQUNVLGNBQWMsQ0FBQyxRQUFRLENBQUM7TUFFbkRYLE1BQU0sQ0FBQ1ksVUFBVSxDQUFDLENBQUNFLFdBQVcsQ0FBQyxHQUFHLENBQUM7TUFDbkNkLE1BQU0sQ0FBQ2EsV0FBVyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUZ0QixFQUFFLENBQUMsbUNBQW1DLG1CQUFBdUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFDLFFBQUE7TUFBQSxJQUFBQyxJQUFBLEVBQUFYLFFBQUEsRUFBQUksVUFBQTtNQUFBLE9BQUFJLFlBQUEsWUFBQUksSUFBQSxXQUFBQyxRQUFBO1FBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7VUFBQTtZQUNoQ0osSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsTUFBQXNDLFNBQUEsaUJBQUt0QixZQUFZO2NBQUVJLFFBQVEsRUFBRUE7WUFBUyxFQUFFLENBQUMsQ0FBQztZQUV2REksVUFBVSxHQUFHWCxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFBQVUsUUFBQSxDQUFBRSxJQUFBO1lBQUEsT0FDM0NKLElBQUksQ0FBQ1EsS0FBSyxDQUFDZixVQUFVLENBQUM7VUFBQTtZQUFBUyxRQUFBLENBQUFFLElBQUE7WUFBQSxPQUN0QkosSUFBSSxDQUFDUyxJQUFJLENBQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDO1VBQUE7WUFDbENpQixpQkFBUyxDQUFDQyxJQUFJLENBQUNsQixVQUFVLENBQUM7WUFFMUJaLE1BQU0sQ0FBQ1EsUUFBUSxDQUFDLENBQUN1QixvQkFBb0IsQ0FBQy9CLE1BQU0sQ0FBQ2dDLGdCQUFnQixDQUFDO2NBQUUxQixLQUFLLEVBQUU7WUFBSSxDQUFDLENBQUMsQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBZSxRQUFBLENBQUFZLElBQUE7UUFBQTtNQUFBLEdBQUFmLE9BQUE7SUFBQSxDQUNoRixHQUFDO0lBRUYxQixFQUFFLENBQUMsb0NBQW9DLG1CQUFBdUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFpQixTQUFBO01BQUEsSUFBQWYsSUFBQSxFQUFBWCxRQUFBLEVBQUFLLFdBQUE7TUFBQSxPQUFBRyxZQUFBLFlBQUFJLElBQUEsV0FBQWUsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFiLElBQUEsR0FBQWEsU0FBQSxDQUFBWixJQUFBO1VBQUE7WUFDakNKLElBQUksR0FBR0sscUJBQVMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7WUFDeEJqQixRQUFRLEdBQUdkLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBQUMsY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1QsWUFBQSxXQUFXLE1BQUFzQyxTQUFBLGlCQUFLdEIsWUFBWTtjQUFFSSxRQUFRLEVBQUVBO1lBQVMsRUFBRSxDQUFDLENBQUM7WUFFdkRLLFdBQVcsR0FBR1osY0FBTSxDQUFDVSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQUF3QixTQUFBLENBQUFaLElBQUE7WUFBQSxPQUM3Q0osSUFBSSxDQUFDUSxLQUFLLENBQUNkLFdBQVcsQ0FBQztVQUFBO1lBQUFzQixTQUFBLENBQUFaLElBQUE7WUFBQSxPQUN2QkosSUFBSSxDQUFDUyxJQUFJLENBQUNmLFdBQVcsRUFBRSxLQUFLLENBQUM7VUFBQTtZQUNuQ2dCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2pCLFdBQVcsQ0FBQztZQUUzQmIsTUFBTSxDQUFDUSxRQUFRLENBQUMsQ0FBQ3VCLG9CQUFvQixDQUFDL0IsTUFBTSxDQUFDZ0MsZ0JBQWdCLENBQUM7Y0FBRXpCLE1BQU0sRUFBRTtZQUFJLENBQUMsQ0FBQyxDQUFDO1VBQUM7VUFBQTtZQUFBLE9BQUE0QixTQUFBLENBQUFGLElBQUE7UUFBQTtNQUFBLEdBQUFDLFFBQUE7SUFBQSxDQUNqRixHQUFDO0lBRUYxQyxFQUFFLENBQUMsNENBQTRDLG1CQUFBdUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFtQixTQUFBO01BQUEsSUFBQWpCLElBQUEsRUFBQVgsUUFBQSxFQUFBSSxVQUFBO01BQUEsT0FBQUksWUFBQSxZQUFBSSxJQUFBLFdBQUFpQixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQWYsSUFBQSxHQUFBZSxTQUFBLENBQUFkLElBQUE7VUFBQTtZQUN6Q0osSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsTUFBQXNDLFNBQUEsaUJBQUt0QixZQUFZO2NBQUVJLFFBQVEsRUFBRUE7WUFBUyxFQUFFLENBQUMsQ0FBQztZQUV2REksVUFBVSxHQUFHWCxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFBQTBCLFNBQUEsQ0FBQWQsSUFBQTtZQUFBLE9BQzNDSixJQUFJLENBQUNRLEtBQUssQ0FBQ2YsVUFBVSxDQUFDO1VBQUE7WUFBQXlCLFNBQUEsQ0FBQWQsSUFBQTtZQUFBLE9BQ3RCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxLQUFLLENBQUM7VUFBQTtZQUNsQ2lCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQztZQUUxQlosTUFBTSxDQUFDUSxRQUFRLENBQUMsQ0FBQ3VCLG9CQUFvQixDQUFDO2NBQ3BDekIsS0FBSyxFQUFFLEdBQUc7Y0FDVkMsTUFBTSxFQUFFO1lBQ1YsQ0FBQyxDQUFDO1VBQUM7VUFBQTtZQUFBLE9BQUE4QixTQUFBLENBQUFKLElBQUE7UUFBQTtNQUFBLEdBQUFHLFFBQUE7SUFBQSxDQUNKLEdBQUM7SUFFRjVDLEVBQUUsQ0FBQywrQkFBK0IsbUJBQUF1QixrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXFCLFNBQUE7TUFBQSxJQUFBbkIsSUFBQSxFQUFBWCxRQUFBLEVBQUFJLFVBQUE7TUFBQSxPQUFBSSxZQUFBLFlBQUFJLElBQUEsV0FBQW1CLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBakIsSUFBQSxHQUFBaUIsU0FBQSxDQUFBaEIsSUFBQTtVQUFBO1lBQzVCSixJQUFJLEdBQUdLLHFCQUFTLENBQUNDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCakIsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxNQUFBc0MsU0FBQSxpQkFBS3RCLFlBQVk7Y0FBRUksUUFBUSxFQUFFQTtZQUFTLEVBQUUsQ0FBQyxDQUFDO1lBRXZESSxVQUFVLEdBQUdYLGNBQU0sQ0FBQ1UsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUFBNEIsU0FBQSxDQUFBaEIsSUFBQTtZQUFBLE9BQzNDSixJQUFJLENBQUNRLEtBQUssQ0FBQ2YsVUFBVSxDQUFDO1VBQUE7WUFBQTJCLFNBQUEsQ0FBQWhCLElBQUE7WUFBQSxPQUN0QkosSUFBSSxDQUFDUyxJQUFJLENBQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDO1VBQUE7WUFDbENpQixpQkFBUyxDQUFDQyxJQUFJLENBQUNsQixVQUFVLENBQUM7O1lBRTFCO1lBQ0FaLE1BQU0sQ0FBQ1ksVUFBVSxDQUFDLENBQUNFLFdBQVcsQ0FBQyxHQUFHLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQXlCLFNBQUEsQ0FBQU4sSUFBQTtRQUFBO01BQUEsR0FBQUssUUFBQTtJQUFBLENBQ3JDLEdBQUM7SUFFRjlDLEVBQUUsQ0FBQywrQkFBK0IsbUJBQUF1QixrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXVCLFNBQUE7TUFBQSxJQUFBckIsSUFBQSxFQUFBWCxRQUFBLEVBQUFJLFVBQUE7TUFBQSxPQUFBSSxZQUFBLFlBQUFJLElBQUEsV0FBQXFCLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBbkIsSUFBQSxHQUFBbUIsU0FBQSxDQUFBbEIsSUFBQTtVQUFBO1lBQzVCSixJQUFJLEdBQUdLLHFCQUFTLENBQUNDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCakIsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxNQUFBc0MsU0FBQSxpQkFBS3RCLFlBQVk7Y0FBRUksUUFBUSxFQUFFQTtZQUFTLEVBQUUsQ0FBQyxDQUFDO1lBRXZESSxVQUFVLEdBQUdYLGNBQU0sQ0FBQ1UsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUFBOEIsU0FBQSxDQUFBbEIsSUFBQTtZQUFBLE9BQzNDSixJQUFJLENBQUNRLEtBQUssQ0FBQ2YsVUFBVSxDQUFDO1VBQUE7WUFBQTZCLFNBQUEsQ0FBQWxCLElBQUE7WUFBQSxPQUN0QkosSUFBSSxDQUFDUyxJQUFJLENBQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDO1VBQUE7WUFDbkNpQixpQkFBUyxDQUFDQyxJQUFJLENBQUNsQixVQUFVLENBQUM7O1lBRTFCO1lBQ0FaLE1BQU0sQ0FBQ1ksVUFBVSxDQUFDLENBQUNFLFdBQVcsQ0FBQyxJQUFJLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQTJCLFNBQUEsQ0FBQVIsSUFBQTtRQUFBO01BQUEsR0FBQU8sUUFBQTtJQUFBLENBQ3RDLEdBQUM7SUFFRmhELEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO01BQ3pDLElBQUFrRCxPQUFBLEdBQXFCLElBQUE5QyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsRUFBS2dCLFlBQWUsQ0FBQyxDQUFDO1FBQXREdUMsUUFBUSxHQUFBRCxPQUFBLENBQVJDLFFBQVE7TUFFaEIsSUFBSS9CLFVBQVUsR0FBR1gsY0FBTSxDQUFDVSxjQUFjLENBQUMsT0FBTyxDQUFDO01BQy9DWCxNQUFNLENBQUNZLFVBQVUsQ0FBQyxDQUFDRSxXQUFXLENBQUMsR0FBRyxDQUFDO01BRW5DNkIsUUFBUSxjQUFDN0QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxNQUFBc0MsU0FBQSxpQkFBS3RCLFlBQVk7UUFBRUMsSUFBSSxFQUFFO1VBQUVDLEtBQUssRUFBRSxHQUFHO1VBQUVDLE1BQU0sRUFBRTtRQUFJO01BQUUsRUFBRSxDQUFDLENBQUM7TUFFOUVLLFVBQVUsR0FBR1gsY0FBTSxDQUFDVSxjQUFjLENBQUMsT0FBTyxDQUFDO01BQzNDWCxNQUFNLENBQUNZLFVBQVUsQ0FBQyxDQUFDRSxXQUFXLENBQUMsR0FBRyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztJQUVGdEIsRUFBRSxDQUFDLG9DQUFvQyxtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBMkIsU0FBQTtNQUFBLElBQUF6QixJQUFBLEVBQUFYLFFBQUEsRUFBQUksVUFBQSxFQUFBQyxXQUFBO01BQUEsT0FBQUcsWUFBQSxZQUFBSSxJQUFBLFdBQUF5QixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXZCLElBQUEsR0FBQXVCLFNBQUEsQ0FBQXRCLElBQUE7VUFBQTtZQUNqQ0osSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsTUFBQXNDLFNBQUEsaUJBQUt0QixZQUFZO2NBQUVJLFFBQVEsRUFBRUE7WUFBUyxFQUFFLENBQUMsQ0FBQztZQUV2REksVUFBVSxHQUFHWCxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDM0NFLFdBQVcsR0FBR1osY0FBTSxDQUFDVSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQUFrQyxTQUFBLENBQUF0QixJQUFBO1lBQUEsT0FFN0NKLElBQUksQ0FBQ1EsS0FBSyxDQUFDZixVQUFVLENBQUM7VUFBQTtZQUFBaUMsU0FBQSxDQUFBdEIsSUFBQTtZQUFBLE9BQ3RCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxLQUFLLENBQUM7VUFBQTtZQUNsQ2lCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQztZQUFDaUMsU0FBQSxDQUFBdEIsSUFBQTtZQUFBLE9BRXJCSixJQUFJLENBQUNRLEtBQUssQ0FBQ2QsV0FBVyxDQUFDO1VBQUE7WUFBQWdDLFNBQUEsQ0FBQXRCLElBQUE7WUFBQSxPQUN2QkosSUFBSSxDQUFDUyxJQUFJLENBQUNmLFdBQVcsRUFBRSxLQUFLLENBQUM7VUFBQTtZQUNuQ2dCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2pCLFdBQVcsQ0FBQztZQUUzQmIsTUFBTSxDQUFDWSxVQUFVLENBQUMsQ0FBQ0UsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNuQ2QsTUFBTSxDQUFDYSxXQUFXLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLEdBQUcsQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBK0IsU0FBQSxDQUFBWixJQUFBO1FBQUE7TUFBQSxHQUFBVyxRQUFBO0lBQUEsQ0FDdEMsR0FBQztJQUVGcEQsRUFBRSxDQUFDLG9DQUFvQyxtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBNkIsU0FBQTtNQUFBLElBQUEzQixJQUFBLEVBQUFYLFFBQUEsRUFBQUksVUFBQSxFQUFBQyxXQUFBO01BQUEsT0FBQUcsWUFBQSxZQUFBSSxJQUFBLFdBQUEyQixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXpCLElBQUEsR0FBQXlCLFNBQUEsQ0FBQXhCLElBQUE7VUFBQTtZQUNqQ0osSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsTUFBQXNDLFNBQUEsaUJBQUt0QixZQUFZO2NBQUVJLFFBQVEsRUFBRUE7WUFBUyxFQUFFLENBQUMsQ0FBQztZQUV2REksVUFBVSxHQUFHWCxjQUFNLENBQUNVLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDM0NFLFdBQVcsR0FBR1osY0FBTSxDQUFDVSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQUFvQyxTQUFBLENBQUF4QixJQUFBO1lBQUEsT0FFN0NKLElBQUksQ0FBQ1EsS0FBSyxDQUFDZixVQUFVLENBQUM7VUFBQTtZQUFBbUMsU0FBQSxDQUFBeEIsSUFBQTtZQUFBLE9BQ3RCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxNQUFNLENBQUM7VUFBQTtZQUNuQ2lCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQztZQUFDbUMsU0FBQSxDQUFBeEIsSUFBQTtZQUFBLE9BRXJCSixJQUFJLENBQUNRLEtBQUssQ0FBQ2QsV0FBVyxDQUFDO1VBQUE7WUFBQWtDLFNBQUEsQ0FBQXhCLElBQUE7WUFBQSxPQUN2QkosSUFBSSxDQUFDUyxJQUFJLENBQUNmLFdBQVcsRUFBRSxNQUFNLENBQUM7VUFBQTtZQUNwQ2dCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2pCLFdBQVcsQ0FBQztZQUUzQmIsTUFBTSxDQUFDWSxVQUFVLENBQUMsQ0FBQ0UsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQ2QsTUFBTSxDQUFDYSxXQUFXLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBaUMsU0FBQSxDQUFBZCxJQUFBO1FBQUE7TUFBQSxHQUFBYSxRQUFBO0lBQUEsQ0FDdkMsR0FBQztJQUVGdEQsRUFBRSxDQUFDLDhCQUE4QixtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBK0IsU0FBQTtNQUFBLElBQUE3QixJQUFBLEVBQUFYLFFBQUEsRUFBQUksVUFBQTtNQUFBLE9BQUFJLFlBQUEsWUFBQUksSUFBQSxXQUFBNkIsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEzQixJQUFBLEdBQUEyQixTQUFBLENBQUExQixJQUFBO1VBQUE7WUFDM0JKLElBQUksR0FBR0sscUJBQVMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7WUFDeEJqQixRQUFRLEdBQUdkLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBQUMsY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1QsWUFBQSxXQUFXLE1BQUFzQyxTQUFBLGlCQUFLdEIsWUFBWTtjQUFFSSxRQUFRLEVBQUVBO1lBQVMsRUFBRSxDQUFDLENBQUM7WUFFdkRJLFVBQVUsR0FBR1gsY0FBTSxDQUFDVSxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQUFzQyxTQUFBLENBQUExQixJQUFBO1lBQUEsT0FDM0NKLElBQUksQ0FBQ1EsS0FBSyxDQUFDZixVQUFVLENBQUM7VUFBQTtZQUFBcUMsU0FBQSxDQUFBMUIsSUFBQTtZQUFBLE9BQ3RCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxPQUFPLENBQUM7VUFBQTtZQUNwQ2lCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQztZQUUxQlosTUFBTSxDQUFDWSxVQUFVLENBQUMsQ0FBQ1QsaUJBQWlCLENBQUMsQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBOEMsU0FBQSxDQUFBaEIsSUFBQTtRQUFBO01BQUEsR0FBQWUsUUFBQTtJQUFBLENBQ3hDLEdBQUM7SUFFRnhELEVBQUUsQ0FBQyx1Q0FBdUMsbUJBQUF1QixrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQWlDLFNBQUE7TUFBQSxJQUFBL0IsSUFBQSxFQUFBWCxRQUFBLEVBQUFJLFVBQUE7TUFBQSxPQUFBSSxZQUFBLFlBQUFJLElBQUEsV0FBQStCLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBN0IsSUFBQSxHQUFBNkIsU0FBQSxDQUFBNUIsSUFBQTtVQUFBO1lBQ3BDSixJQUFJLEdBQUdLLHFCQUFTLENBQUNDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCakIsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxNQUFBc0MsU0FBQSxpQkFBS3RCLFlBQVk7Y0FBRUksUUFBUSxFQUFFQTtZQUFTLEVBQUUsQ0FBQyxDQUFDO1lBRXZESSxVQUFVLEdBQUdYLGNBQU0sQ0FBQ1UsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUFBd0MsU0FBQSxDQUFBNUIsSUFBQTtZQUFBLE9BQzNDSixJQUFJLENBQUNRLEtBQUssQ0FBQ2YsVUFBVSxDQUFDO1VBQUE7WUFDNUJpQixpQkFBUyxDQUFDQyxJQUFJLENBQUNsQixVQUFVLENBQUM7O1lBRTFCO1lBQ0FaLE1BQU0sQ0FBQ1ksVUFBVSxDQUFDLENBQUNFLFdBQVcsQ0FBQyxHQUFHLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQXFDLFNBQUEsQ0FBQWxCLElBQUE7UUFBQTtNQUFBLEdBQUFpQixRQUFBO0lBQUEsQ0FDckMsR0FBQztJQUVGMUQsRUFBRSxDQUFDLHdDQUF3QyxtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBbUMsU0FBQTtNQUFBLElBQUFqQyxJQUFBLEVBQUFYLFFBQUEsRUFBQUksVUFBQTtNQUFBLE9BQUFJLFlBQUEsWUFBQUksSUFBQSxXQUFBaUMsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEvQixJQUFBLEdBQUErQixTQUFBLENBQUE5QixJQUFBO1VBQUE7WUFDckNKLElBQUksR0FBR0sscUJBQVMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7WUFDeEJqQixRQUFRLEdBQUdkLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBQUMsY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1QsWUFBQSxXQUFXLE1BQUFzQyxTQUFBLGlCQUFLdEIsWUFBWTtjQUFFSSxRQUFRLEVBQUVBO1lBQVMsRUFBRSxDQUFDLENBQUM7WUFFdkRJLFVBQVUsR0FBR1gsY0FBTSxDQUFDVSxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQUEwQyxTQUFBLENBQUE5QixJQUFBO1lBQUEsT0FFM0NKLElBQUksQ0FBQ1EsS0FBSyxDQUFDZixVQUFVLENBQUM7VUFBQTtZQUFBeUMsU0FBQSxDQUFBOUIsSUFBQTtZQUFBLE9BQ3RCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxHQUFHLENBQUM7VUFBQTtZQUFBeUMsU0FBQSxDQUFBOUIsSUFBQTtZQUFBLE9BQzFCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxHQUFHLENBQUM7VUFBQTtZQUFBeUMsU0FBQSxDQUFBOUIsSUFBQTtZQUFBLE9BQzFCSixJQUFJLENBQUNTLElBQUksQ0FBQ2hCLFVBQVUsRUFBRSxHQUFHLENBQUM7VUFBQTtZQUNoQ2lCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQztZQUUxQlosTUFBTSxDQUFDUSxRQUFRLENBQUMsQ0FBQzhDLGdCQUFnQixDQUFDLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQUQsU0FBQSxDQUFBcEIsSUFBQTtRQUFBO01BQUEsR0FBQW1CLFFBQUE7SUFBQSxDQUNyQyxHQUFDO0lBRUY1RCxFQUFFLENBQUMsa0NBQWtDLG1CQUFBdUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFzQyxTQUFBO01BQUEsSUFBQXBDLElBQUEsRUFBQVgsUUFBQSxFQUFBSyxXQUFBO01BQUEsT0FBQUcsWUFBQSxZQUFBSSxJQUFBLFdBQUFvQyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQWxDLElBQUEsR0FBQWtDLFNBQUEsQ0FBQWpDLElBQUE7VUFBQTtZQUMvQkosSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVcsTUFBQXNDLFNBQUEsaUJBQUt0QixZQUFZO2NBQUVJLFFBQVEsRUFBRUE7WUFBUyxFQUFFLENBQUMsQ0FBQztZQUV2REssV0FBVyxHQUFHWixjQUFNLENBQUNVLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFFbkQ7WUFBQTZDLFNBQUEsQ0FBQWpDLElBQUE7WUFBQSxPQUNNSixJQUFJLENBQUNRLEtBQUssQ0FBQ2QsV0FBVyxDQUFDO1VBQUE7WUFBQTJDLFNBQUEsQ0FBQWpDLElBQUE7WUFBQSxPQUN2QkosSUFBSSxDQUFDUyxJQUFJLENBQUNmLFdBQVcsRUFBRSxJQUFJLENBQUM7VUFBQTtZQUNsQ2dCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2pCLFdBQVcsQ0FBQztZQUMzQmIsTUFBTSxDQUFDYSxXQUFXLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLEdBQUcsQ0FBQzs7WUFFcEM7WUFBQTBDLFNBQUEsQ0FBQWpDLElBQUE7WUFBQSxPQUNNSixJQUFJLENBQUNRLEtBQUssQ0FBQ2QsV0FBVyxDQUFDO1VBQUE7WUFBQTJDLFNBQUEsQ0FBQWpDLElBQUE7WUFBQSxPQUN2QkosSUFBSSxDQUFDUyxJQUFJLENBQUNmLFdBQVcsRUFBRSxNQUFNLENBQUM7VUFBQTtZQUNwQ2dCLGlCQUFTLENBQUNDLElBQUksQ0FBQ2pCLFdBQVcsQ0FBQztZQUMzQmIsTUFBTSxDQUFDYSxXQUFXLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBMEMsU0FBQSxDQUFBdkIsSUFBQTtRQUFBO01BQUEsR0FBQXNCLFFBQUE7SUFBQSxDQUN2QyxHQUFDO0lBRUYvRCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtNQUNyQyxJQUFBSSxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDVCxZQUFBLFdBQVc7UUFBQ2lCLElBQUksRUFBRTtVQUFFQyxLQUFLLEVBQUUsR0FBRztVQUFFQyxNQUFNLEVBQUU7UUFBSSxDQUFFO1FBQUNULEtBQUssRUFBQyxzQkFBc0I7UUFBQ1UsUUFBUSxFQUFFZCxJQUFJLENBQUNDLEVBQUUsQ0FBQztNQUFFLENBQUUsQ0FBQyxDQUFDO01BRTVHSyxNQUFNLENBQUNDLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7SUFFRlgsRUFBRSxDQUFDLCtCQUErQixFQUFFLFlBQU07TUFDeEMsSUFBQWlFLFFBQUEsR0FBc0IsSUFBQTdELGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNULFlBQUEsV0FBVyxFQUFLZ0IsWUFBZSxDQUFDLENBQUM7UUFBdkRzRCxTQUFTLEdBQUFELFFBQUEsQ0FBVEMsU0FBUztNQUVqQixJQUFNQyxNQUFNLEdBQUdELFNBQVMsQ0FBQ0UsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO01BQ2xENUQsTUFBTSxDQUFDMkQsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRnZFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxZQUFNO0lBQ25DQyxFQUFFLENBQUMscUJBQXFCLEVBQUUsWUFBTTtNQUM5QixJQUFNZ0IsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO01BQzFCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNSLG1CQUFBLFdBQWtCO1FBQUNTLEtBQUssRUFBQyxVQUFVO1FBQUNpRSxLQUFLLEVBQUMsU0FBUztRQUFDaEUsT0FBTyxFQUFFLEtBQU07UUFBQ1MsUUFBUSxFQUFFQTtNQUFTLENBQUUsQ0FBQyxDQUFDO01BRW5HUixNQUFNLENBQUNDLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDeERILE1BQU0sQ0FBQ0MsY0FBTSxDQUFDK0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM3RCxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztJQUVGWCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsWUFBTTtNQUNoQyxJQUFNZ0IsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO01BQzFCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNSLG1CQUFBLFdBQWtCO1FBQUNTLEtBQUssRUFBQyxVQUFVO1FBQUNpRSxLQUFLLEVBQUMsU0FBUztRQUFDaEUsT0FBTyxFQUFFLElBQUs7UUFBQ1MsUUFBUSxFQUFFQTtNQUFTLENBQUUsQ0FBQyxDQUFDO01BRWxHLElBQU15RCxLQUFLLEdBQUdoRSxjQUFNLENBQUMrRCxTQUFTLENBQUMsT0FBTyxDQUFDO01BQ3ZDaEUsTUFBTSxDQUFDaUUsS0FBSyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVGMUUsRUFBRSxDQUFDLHlCQUF5QixFQUFFLFlBQU07TUFDbEMsSUFBTWdCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztNQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUixtQkFBQSxXQUFrQjtRQUFDUyxLQUFLLEVBQUMsVUFBVTtRQUFDaUUsS0FBSyxFQUFDLFNBQVM7UUFBQ2hFLE9BQU8sRUFBRSxLQUFNO1FBQUNTLFFBQVEsRUFBRUE7TUFBUyxDQUFFLENBQUMsQ0FBQztNQUVuRyxJQUFNeUQsS0FBSyxHQUFHaEUsY0FBTSxDQUFDK0QsU0FBUyxDQUFDLE9BQU8sQ0FBQztNQUN2Q2hFLE1BQU0sQ0FBQ2lFLEtBQUssQ0FBQyxDQUFDRSxHQUFHLENBQUNELFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUVGMUUsRUFBRSxDQUFDLHNDQUFzQyxtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBbUQsVUFBQTtNQUFBLElBQUFqRCxJQUFBLEVBQUFYLFFBQUEsRUFBQXlELEtBQUE7TUFBQSxPQUFBakQsWUFBQSxZQUFBSSxJQUFBLFdBQUFpRCxVQUFBO1FBQUEsa0JBQUFBLFVBQUEsQ0FBQS9DLElBQUEsR0FBQStDLFVBQUEsQ0FBQTlDLElBQUE7VUFBQTtZQUNuQ0osSUFBSSxHQUFHSyxxQkFBUyxDQUFDQyxLQUFLLENBQUMsQ0FBQztZQUN4QmpCLFFBQVEsR0FBR2QsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFBQyxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUixtQkFBQSxXQUFrQjtjQUFDUyxLQUFLLEVBQUMsVUFBVTtjQUFDaUUsS0FBSyxFQUFDLFNBQVM7Y0FBQ2hFLE9BQU8sRUFBRSxLQUFNO2NBQUNTLFFBQVEsRUFBRUE7WUFBUyxDQUFFLENBQUMsQ0FBQztZQUU3RnlELEtBQUssR0FBR2hFLGNBQU0sQ0FBQytELFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFBQUssVUFBQSxDQUFBOUMsSUFBQTtZQUFBLE9BQ2pDSixJQUFJLENBQUNtRCxLQUFLLENBQUNMLEtBQUssQ0FBQztVQUFBO1lBRXZCakUsTUFBTSxDQUFDUSxRQUFRLENBQUMsQ0FBQzhDLGdCQUFnQixDQUFDLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQWUsVUFBQSxDQUFBcEMsSUFBQTtRQUFBO01BQUEsR0FBQW1DLFNBQUE7SUFBQSxDQUNyQyxHQUFDO0lBRUY1RSxFQUFFLENBQUMsK0JBQStCLEVBQUUsWUFBTTtNQUN4QyxJQUFNZ0IsUUFBUSxHQUFHZCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO01BQzFCLElBQU00RSxTQUFTLEdBQUcscUJBQXFCO01BQ3ZDLElBQUEzRSxjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUixtQkFBQSxXQUFrQjtRQUFDUyxLQUFLLEVBQUV5RSxTQUFVO1FBQUNSLEtBQUssRUFBQyxRQUFRO1FBQUNoRSxPQUFPLEVBQUUsS0FBTTtRQUFDUyxRQUFRLEVBQUVBO01BQVMsQ0FBRSxDQUFDLENBQUM7TUFFbkdSLE1BQU0sQ0FBQ0MsY0FBTSxDQUFDQyxTQUFTLENBQUNxRSxTQUFTLENBQUMsQ0FBQyxDQUFDcEUsaUJBQWlCLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRlosUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFNO0lBQ3RCLElBQU1hLFlBQVksR0FBRztNQUNuQm9FLEtBQUssRUFBRTtRQUFFQyxhQUFhLEVBQUUsSUFBSTtRQUFFQyxXQUFXLEVBQUU7TUFBRSxDQUFDO01BQzlDQyxhQUFhLEVBQUU7UUFBRUMsV0FBVyxFQUFFO01BQU8sQ0FBQztNQUN0Q0MsTUFBTSxFQUFFO1FBQ04sa0JBQWtCLEVBQUU7VUFDbEJKLGFBQWEsRUFBRTtZQUNiN0MsSUFBSSxFQUFFLFFBQVE7WUFDZDlCLEtBQUssRUFBRTtVQUNUO1FBQ0Y7TUFDRixDQUFDO01BQ0RnRixhQUFhLEVBQUVwRixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO01BQ3hCb0YscUJBQXFCLEVBQUVyRixJQUFJLENBQUNDLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRURjLFVBQVUsQ0FBQyxZQUFNO01BQ2ZmLElBQUksQ0FBQ2dCLGFBQWEsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGbEIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLFlBQU07TUFDekMsSUFBQUksY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1AsTUFBQSxDQUFBMEYsS0FBSyxFQUFLNUUsWUFBZSxDQUFDLENBQUM7TUFDbkNKLE1BQU0sQ0FBQ0MsY0FBTSxDQUFDQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGWCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsWUFBTTtNQUNqRCxJQUFBeUYsUUFBQSxHQUFzQixJQUFBckYsY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1AsTUFBQSxDQUFBMEYsS0FBSyxNQUFBdEQsU0FBQSxpQkFBS3RCLFlBQVk7VUFBRXlFLE1BQU0sRUFBRUs7UUFBVSxFQUFFLENBQUMsQ0FBQztRQUFwRXhCLFNBQVMsR0FBQXVCLFFBQUEsQ0FBVHZCLFNBQVM7TUFDakIxRCxNQUFNLENBQUMwRCxTQUFTLENBQUN5QixVQUFVLENBQUNDLFFBQVEsQ0FBQ3ZCLE1BQU0sQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQztJQUVGdEUsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07TUFDN0MsSUFBQTZGLFFBQUEsR0FBc0IsSUFBQXpGLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNQLE1BQUEsQ0FBQTBGLEtBQUssTUFBQXRELFNBQUEsaUJBQUt0QixZQUFZO1VBQUV5RSxNQUFNLEVBQUUsQ0FBQztRQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQTdEbkIsU0FBUyxHQUFBMkIsUUFBQSxDQUFUM0IsU0FBUztNQUNqQjFELE1BQU0sQ0FBQzBELFNBQVMsQ0FBQ3lCLFVBQVUsQ0FBQ0MsUUFBUSxDQUFDdkIsTUFBTSxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDO0lBRUZ0RSxFQUFFLENBQUMsd0NBQXdDLG1CQUFBdUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFxRSxVQUFBO01BQUEsSUFBQW5FLElBQUEsRUFBQTJELGFBQUEsRUFBQVMsUUFBQSxFQUFBN0IsU0FBQSxFQUFBOEIsYUFBQTtNQUFBLE9BQUF4RSxZQUFBLFlBQUFJLElBQUEsV0FBQXFFLFVBQUE7UUFBQSxrQkFBQUEsVUFBQSxDQUFBbkUsSUFBQSxHQUFBbUUsVUFBQSxDQUFBbEUsSUFBQTtVQUFBO1lBQ3JDSixJQUFJLEdBQUdLLHFCQUFTLENBQUNDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCcUQsYUFBYSxHQUFHcEYsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztZQUFBNEYsUUFBQSxHQUNULElBQUEzRixjQUFNLGVBQUNkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUCxNQUFBLENBQUEwRixLQUFLLE1BQUF0RCxTQUFBLGlCQUFLdEIsWUFBWTtjQUFFMEUsYUFBYSxFQUFFQTtZQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQS9FcEIsU0FBUyxHQUFBNkIsUUFBQSxDQUFUN0IsU0FBUztZQUVYOEIsYUFBYSxHQUFHOUIsU0FBUyxDQUFDZ0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQUFELFVBQUEsQ0FBQWxFLElBQUE7WUFBQSxPQUNqRUosSUFBSSxDQUFDbUQsS0FBSyxDQUFDa0IsYUFBYSxDQUFDO1VBQUE7WUFFL0J4RixNQUFNLENBQUM4RSxhQUFhLENBQUMsQ0FBQ3hCLGdCQUFnQixDQUFDLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQW1DLFVBQUEsQ0FBQXhELElBQUE7UUFBQTtNQUFBLEdBQUFxRCxTQUFBO0lBQUEsQ0FDMUMsR0FBQztJQUVGOUYsRUFBRSxDQUFDLHdEQUF3RCxtQkFBQXVCLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBMEUsVUFBQTtNQUFBLElBQUF4RSxJQUFBLEVBQUE0RCxxQkFBQSxFQUFBYSxRQUFBLEVBQUFsQyxTQUFBLEVBQUE4QixhQUFBO01BQUEsT0FBQXhFLFlBQUEsWUFBQUksSUFBQSxXQUFBeUUsVUFBQTtRQUFBLGtCQUFBQSxVQUFBLENBQUF2RSxJQUFBLEdBQUF1RSxVQUFBLENBQUF0RSxJQUFBO1VBQUE7WUFDckRKLElBQUksR0FBR0sscUJBQVMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7WUFDeEJzRCxxQkFBcUIsR0FBR3JGLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7WUFBQWlHLFFBQUEsR0FDakIsSUFBQWhHLGNBQU0sZUFDMUJkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUCxNQUFBLENBQUEwRixLQUFLLE1BQUF0RCxTQUFBLGlCQUNBdEIsWUFBWTtjQUNoQnlFLE1BQU0sRUFBRTtnQkFDTixjQUFjLEVBQUU7a0JBQ2RELFdBQVcsRUFBRTtvQkFDWGhELElBQUksRUFBRSxRQUFRO29CQUNkOUIsS0FBSyxFQUFFLGVBQWU7b0JBQ3RCZ0csZ0JBQWdCLEVBQUU7a0JBQ3BCO2dCQUNGO2NBQ0YsQ0FBRTtjQUNGZixxQkFBcUIsRUFBRUE7WUFBc0IsRUFDOUMsQ0FDSCxDQUFDLEVBZE9yQixTQUFTLEdBQUFrQyxRQUFBLENBQVRsQyxTQUFTO1lBZ0JYOEIsYUFBYSxHQUFHOUIsU0FBUyxDQUFDZ0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQUFHLFVBQUEsQ0FBQXRFLElBQUE7WUFBQSxPQUNqRUosSUFBSSxDQUFDbUQsS0FBSyxDQUFDa0IsYUFBYSxDQUFDO1VBQUE7WUFFL0J4RixNQUFNLENBQUMrRSxxQkFBcUIsQ0FBQyxDQUFDekIsZ0JBQWdCLENBQUMsQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBdUMsVUFBQSxDQUFBNUQsSUFBQTtRQUFBO01BQUEsR0FBQTBELFNBQUE7SUFBQSxDQUNsRCxHQUFDO0lBRUZuRyxFQUFFLENBQUMsa0NBQWtDLEVBQUUsWUFBTTtNQUMzQyxJQUFNdUcsS0FBSyxnQkFBR2pILE1BQUEsWUFBQWUsYUFBQTtRQUFLLGVBQVk7TUFBWSxHQUFDLGVBQWtCLENBQUM7TUFDL0QsSUFBQUQsY0FBTSxlQUFDZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1AsTUFBQSxDQUFBMEYsS0FBSyxNQUFBdEQsU0FBQSxpQkFBS3RCLFlBQVk7UUFBRTJGLEtBQUssRUFBRUE7TUFBTSxFQUFFLENBQUMsQ0FBQztNQUVqRC9GLE1BQU0sQ0FBQ0MsY0FBTSxDQUFDK0YsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM3RixpQkFBaUIsQ0FBQyxDQUFDO01BQzVESCxNQUFNLENBQUNDLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0lBRUZYLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxZQUFNO01BQ2xDLElBQUFJLGNBQU0sZUFDSmQsTUFBQSxZQUFBZSxhQUFBLENBQUNQLE1BQUEsQ0FBQTBGLEtBQUssTUFBQXRELFNBQUEsaUJBQ0F0QixZQUFZO1FBQ2hCeUUsTUFBTSxFQUFFO1VBQ04sV0FBVyxFQUFFO1lBQ1hvQixRQUFRLEVBQUU7Y0FDUnJFLElBQUksRUFBRSxRQUFRO2NBQ2Q5QixLQUFLLEVBQUU7WUFDVDtVQUNGLENBQUM7VUFDRCxXQUFXLEVBQUU7WUFDWG9HLFFBQVEsRUFBRTtjQUNSdEUsSUFBSSxFQUFFLFFBQVE7Y0FDZDlCLEtBQUssRUFBRTtZQUNUO1VBQ0Y7UUFDRixDQUFFO1FBQ0YwRSxLQUFLLEVBQUU7VUFBRXlCLFFBQVEsRUFBRSxJQUFJO1VBQUVDLFFBQVEsRUFBRTtRQUFNO01BQUUsRUFDNUMsQ0FDSCxDQUFDO01BRURsRyxNQUFNLENBQUNDLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDekRILE1BQU0sQ0FBQ0MsY0FBTSxDQUFDQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRlgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLFlBQU07TUFDbkQsSUFBQTJHLFFBQUEsR0FBc0IsSUFBQXZHLGNBQU0sZUFDMUJkLE1BQUEsWUFBQWUsYUFBQSxDQUFDUCxNQUFBLENBQUEwRixLQUFLO1VBQ0pSLEtBQUssRUFBRTtZQUFFNEIsSUFBSSxFQUFFO1VBQUssQ0FBRTtVQUN0QnZCLE1BQU0sRUFBRTtZQUNOLFlBQVksRUFBRTtjQUNadUIsSUFBSSxFQUFFO2dCQUFFeEUsSUFBSSxFQUFFLFFBQVE7Z0JBQUU5QixLQUFLLEVBQUU7Y0FBTztZQUN4QztVQUNGO1FBQUUsQ0FDSCxDQUNILENBQUM7UUFUTzRELFNBQVMsR0FBQXlDLFFBQUEsQ0FBVHpDLFNBQVM7TUFXakIxRCxNQUFNLENBQUMwRCxTQUFTLENBQUN5QixVQUFVLENBQUMsQ0FBQ2hGLGlCQUFpQixDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBRUZYLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO01BQ25DLElBQUE2RyxRQUFBLEdBQXNCLElBQUF6RyxjQUFNLGVBQzFCZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1AsTUFBQSxDQUFBMEYsS0FBSyxNQUFBdEQsU0FBQSxpQkFDQXRCLFlBQVk7VUFDaEJ5RSxNQUFNLEVBQUU7WUFDTixhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLGtCQUFrQixFQUFFO2NBQ2xCSixhQUFhLEVBQUU7Z0JBQ2I3QyxJQUFJLEVBQUUsUUFBUTtnQkFDZDlCLEtBQUssRUFBRTtjQUNUO1lBQ0Y7VUFDRixDQUFFO1VBQ0YwRSxLQUFLLEVBQUU7WUFBRUMsYUFBYSxFQUFFO1VBQUs7UUFBRSxFQUNoQyxDQUNILENBQUM7UUFkT2YsU0FBUyxHQUFBMkMsUUFBQSxDQUFUM0MsU0FBUztNQWdCakIxRCxNQUFNLENBQUNDLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztNQUNoRUgsTUFBTSxDQUFDQyxjQUFNLENBQUNxRyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ25DLEdBQUcsQ0FBQ2hFLGlCQUFpQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0lBRUZYLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxZQUFNO01BQ2xDLElBQUErRyxRQUFBLEdBQXNCLElBQUEzRyxjQUFNLGVBQzFCZCxNQUFBLFlBQUFlLGFBQUEsQ0FBQ1AsTUFBQSxDQUFBMEYsS0FBSztVQUNKUixLQUFLLEVBQUUsSUFBSztVQUNaRyxhQUFhLEVBQUUsQ0FBQyxDQUFFO1VBQ2xCRSxNQUFNLEVBQUU7WUFDTixrQkFBa0IsRUFBRTtjQUNsQkosYUFBYSxFQUFFO2dCQUNiN0MsSUFBSSxFQUFFLFFBQVE7Z0JBQ2Q5QixLQUFLLEVBQUU7Y0FDVDtZQUNGO1VBQ0YsQ0FBRTtVQUNGZ0YsYUFBYSxFQUFFcEYsSUFBSSxDQUFDQyxFQUFFLENBQUM7UUFBRSxDQUMxQixDQUNILENBQUM7UUFkTytELFNBQVMsR0FBQTZDLFFBQUEsQ0FBVDdDLFNBQVM7TUFnQmpCMUQsTUFBTSxDQUFDQyxjQUFNLENBQUNDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119