@pie-element/placement-ordering 14.2.0-beta.0 → 14.2.1

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.
@@ -1,376 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _react = _interopRequireDefault(require("react"));
5
- var _react2 = require("@testing-library/react");
6
- require("@testing-library/jest-dom");
7
- var _choiceEditor = _interopRequireDefault(require("../choice-editor"));
8
- // Mock dependencies
9
- jest.mock('@pie-lib/render-ui', () => ({
10
- InputContainer: ({
11
- label,
12
- children
13
- }) => /*#__PURE__*/_react.default.createElement("div", {
14
- "data-testid": "input-container"
15
- }, label && /*#__PURE__*/_react.default.createElement("div", {
16
- className: "input-container-label"
17
- }, label), children)
18
- }));
19
- jest.mock('@pie-lib/config-ui', () => ({
20
- AlertDialog: ({
21
- open,
22
- title,
23
- text,
24
- onConfirm
25
- }) => open ? /*#__PURE__*/_react.default.createElement("div", {
26
- "data-testid": "alert-dialog"
27
- }, /*#__PURE__*/_react.default.createElement("div", {
28
- "data-testid": "alert-title"
29
- }, title), /*#__PURE__*/_react.default.createElement("div", {
30
- "data-testid": "alert-text"
31
- }, text), /*#__PURE__*/_react.default.createElement("button", {
32
- "data-testid": "alert-confirm",
33
- onClick: onConfirm
34
- }, "Confirm")) : null
35
- }));
36
- jest.mock('../choice-tile', () => ({
37
- __esModule: true,
38
- default: ({
39
- choice,
40
- onDelete,
41
- onChoiceChange,
42
- error
43
- }) => /*#__PURE__*/_react.default.createElement("div", {
44
- "data-testid": `choice-tile-${choice.type}-${choice.id}`
45
- }, /*#__PURE__*/_react.default.createElement("div", {
46
- "data-testid": `choice-label-${choice.type}-${choice.id}`
47
- }, choice.label), /*#__PURE__*/_react.default.createElement("button", {
48
- "data-testid": `delete-${choice.type}-${choice.id}`,
49
- onClick: onDelete
50
- }, "Delete"), /*#__PURE__*/_react.default.createElement("button", {
51
- "data-testid": `change-${choice.type}-${choice.id}`,
52
- onClick: () => onChoiceChange({
53
- ...choice,
54
- label: 'Updated'
55
- })
56
- }, "Change"), error && /*#__PURE__*/_react.default.createElement("div", {
57
- "data-testid": `error-${choice.type}-${choice.id}`
58
- }, error))
59
- }));
60
- describe('ChoiceEditor', () => {
61
- let defaultProps;
62
- beforeEach(() => {
63
- defaultProps = {
64
- choices: [{
65
- id: 'c1',
66
- label: 'Choice 1'
67
- }, {
68
- id: 'c2',
69
- label: 'Choice 2'
70
- }, {
71
- id: 'c3',
72
- label: 'Choice 3'
73
- }],
74
- correctResponse: [{
75
- id: 'c1',
76
- weight: 0
77
- }, {
78
- id: 'c2',
79
- weight: 0
80
- }, {
81
- id: 'c3',
82
- weight: 0
83
- }],
84
- onChange: jest.fn(),
85
- imageSupport: {
86
- add: jest.fn(),
87
- delete: jest.fn()
88
- },
89
- singularChoiceLabel: 'choice',
90
- pluralChoiceLabel: 'choices',
91
- choicesLabel: 'Choices',
92
- ordering: {
93
- tiles: [{
94
- id: 'c1',
95
- label: 'Choice 1',
96
- type: 'choice'
97
- }, {
98
- id: 'c2',
99
- label: 'Choice 2',
100
- type: 'choice'
101
- }, {
102
- id: 'c3',
103
- label: 'Choice 3',
104
- type: 'choice'
105
- }, {
106
- id: 'c1',
107
- label: 'Choice 1',
108
- type: 'target'
109
- }, {
110
- id: 'c2',
111
- label: 'Choice 2',
112
- type: 'target'
113
- }, {
114
- id: 'c3',
115
- label: 'Choice 3',
116
- type: 'target'
117
- }]
118
- },
119
- errors: {}
120
- };
121
- });
122
- describe('rendering', () => {
123
- it('should render without crashing', () => {
124
- const {
125
- container
126
- } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
127
- expect(container).toBeTruthy();
128
- });
129
- it('should render column labels', () => {
130
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
131
- expect(_react2.screen.getByText('Student Choices')).toBeInTheDocument();
132
- expect(_react2.screen.getByText('Correct Order')).toBeInTheDocument();
133
- });
134
- it('should render all choice tiles', () => {
135
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
136
- expect(_react2.screen.getByTestId('choice-tile-choice-c1')).toBeInTheDocument();
137
- expect(_react2.screen.getByTestId('choice-tile-choice-c2')).toBeInTheDocument();
138
- expect(_react2.screen.getByTestId('choice-tile-choice-c3')).toBeInTheDocument();
139
- expect(_react2.screen.getByTestId('choice-tile-target-c1')).toBeInTheDocument();
140
- expect(_react2.screen.getByTestId('choice-tile-target-c2')).toBeInTheDocument();
141
- expect(_react2.screen.getByTestId('choice-tile-target-c3')).toBeInTheDocument();
142
- });
143
- it('should render shuffle button', () => {
144
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
145
- expect(_react2.screen.getByText('SHUFFLE CHOICES')).toBeInTheDocument();
146
- });
147
- it('should render add button', () => {
148
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
149
- expect(_react2.screen.getByText('ADD CHOICE')).toBeInTheDocument();
150
- });
151
- it('should use custom choice labels', () => {
152
- const props = {
153
- ...defaultProps,
154
- singularChoiceLabel: 'item',
155
- pluralChoiceLabel: 'items',
156
- choicesLabel: 'Items'
157
- };
158
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
159
- expect(_react2.screen.getByText('SHUFFLE ITEMS')).toBeInTheDocument();
160
- expect(_react2.screen.getByText('ADD ITEM')).toBeInTheDocument();
161
- expect(_react2.screen.getByText('Student Items')).toBeInTheDocument();
162
- });
163
- });
164
- describe('adding choices', () => {
165
- it('should add a new choice when add button is clicked', () => {
166
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
167
- const addButton = _react2.screen.getByText('ADD CHOICE');
168
- _react2.fireEvent.click(addButton);
169
- expect(defaultProps.onChange).toHaveBeenCalledWith(expect.arrayContaining([...defaultProps.choices, {
170
- id: 'c4',
171
- label: ''
172
- }]), expect.arrayContaining([...defaultProps.correctResponse, {
173
- id: 'c4',
174
- weight: 0
175
- }]));
176
- });
177
- it('should show warning when trying to add more than 10 choices', () => {
178
- const props = {
179
- ...defaultProps,
180
- choices: Array.from({
181
- length: 10
182
- }, (_, i) => ({
183
- id: `c${i + 1}`,
184
- label: `Choice ${i + 1}`
185
- })),
186
- ordering: {
187
- tiles: Array.from({
188
- length: 10
189
- }, (_, i) => ({
190
- id: `c${i + 1}`,
191
- label: `Choice ${i + 1}`,
192
- type: 'choice'
193
- }))
194
- }
195
- };
196
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
197
- const addButton = _react2.screen.getByText('ADD CHOICE');
198
- _react2.fireEvent.click(addButton);
199
- expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
200
- expect(_react2.screen.getByText('There can be maximum 10 Choices.')).toBeInTheDocument();
201
- });
202
- it('should find free slot when adding choice', () => {
203
- const props = {
204
- ...defaultProps,
205
- choices: [{
206
- id: 'c1',
207
- label: 'Choice 1'
208
- }, {
209
- id: 'c3',
210
- label: 'Choice 3'
211
- }],
212
- correctResponse: [{
213
- id: 'c1',
214
- weight: 0
215
- }, {
216
- id: 'c3',
217
- weight: 0
218
- }],
219
- ordering: {
220
- tiles: [{
221
- id: 'c1',
222
- label: 'Choice 1',
223
- type: 'choice'
224
- }, {
225
- id: 'c3',
226
- label: 'Choice 3',
227
- type: 'choice'
228
- }]
229
- }
230
- };
231
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
232
- const addButton = _react2.screen.getByText('ADD CHOICE');
233
- _react2.fireEvent.click(addButton);
234
- expect(props.onChange).toHaveBeenCalledWith(expect.arrayContaining([...props.choices, {
235
- id: 'c2',
236
- label: ''
237
- }]), expect.anything());
238
- });
239
- });
240
- describe('deleting choices', () => {
241
- it('should show warning when trying to delete with only 3 choices', () => {
242
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
243
- const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
244
- _react2.fireEvent.click(deleteButton);
245
- expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
246
- expect(_react2.screen.getByText('There have to be at least 3 Choices.')).toBeInTheDocument();
247
- });
248
- it('should allow deletion when more than 3 choices exist', () => {
249
- const props = {
250
- ...defaultProps,
251
- choices: [{
252
- id: 'c1',
253
- label: 'Choice 1'
254
- }, {
255
- id: 'c2',
256
- label: 'Choice 2'
257
- }, {
258
- id: 'c3',
259
- label: 'Choice 3'
260
- }, {
261
- id: 'c4',
262
- label: 'Choice 4'
263
- }],
264
- ordering: {
265
- tiles: [{
266
- id: 'c1',
267
- label: 'Choice 1',
268
- type: 'choice'
269
- }, {
270
- id: 'c2',
271
- label: 'Choice 2',
272
- type: 'choice'
273
- }, {
274
- id: 'c3',
275
- label: 'Choice 3',
276
- type: 'choice'
277
- }, {
278
- id: 'c4',
279
- label: 'Choice 4',
280
- type: 'choice'
281
- }]
282
- }
283
- };
284
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
285
- const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
286
- _react2.fireEvent.click(deleteButton);
287
- expect(props.onChange).toHaveBeenCalled();
288
- expect(_react2.screen.queryByTestId('alert-dialog')).not.toBeInTheDocument();
289
- });
290
- });
291
- describe('changing choices', () => {
292
- it('should update choice label when changed', () => {
293
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
294
- const changeButton = _react2.screen.getByTestId('change-choice-c1');
295
- _react2.fireEvent.click(changeButton);
296
- expect(defaultProps.onChange).toHaveBeenCalledWith(expect.arrayContaining([{
297
- id: 'c1',
298
- label: 'Updated'
299
- }, {
300
- id: 'c2',
301
- label: 'Choice 2'
302
- }, {
303
- id: 'c3',
304
- label: 'Choice 3'
305
- }]), defaultProps.correctResponse);
306
- });
307
- });
308
- describe('shuffling choices', () => {
309
- it('should shuffle choices when shuffle button is clicked', () => {
310
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
311
- const shuffleButton = _react2.screen.getByText('SHUFFLE CHOICES');
312
- _react2.fireEvent.click(shuffleButton);
313
- expect(defaultProps.onChange).toHaveBeenCalled();
314
- const [shuffledChoices] = defaultProps.onChange.mock.calls[0];
315
- expect(shuffledChoices).toHaveLength(3);
316
- expect(shuffledChoices.map(c => c.id).sort()).toEqual(['c1', 'c2', 'c3']);
317
- });
318
- it('should shuffle again if result matches correct order when placementArea is disabled', () => {
319
- const props = {
320
- ...defaultProps,
321
- placementArea: false
322
- };
323
-
324
- // Mock shuffle to return the same order first time
325
- const originalMath = Math.random;
326
- let callCount = 0;
327
- Math.random = () => {
328
- callCount++;
329
- // First call returns ordered, second returns shuffled
330
- return callCount === 1 ? 0.1 : 0.9;
331
- };
332
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
333
- const shuffleButton = _react2.screen.getByText('SHUFFLE CHOICES');
334
- _react2.fireEvent.click(shuffleButton);
335
- expect(props.onChange).toHaveBeenCalled();
336
- Math.random = originalMath;
337
- });
338
- });
339
- describe('alert dialog', () => {
340
- it('should close warning dialog when confirm is clicked', () => {
341
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
342
- const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
343
- _react2.fireEvent.click(deleteButton);
344
- expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
345
- const confirmButton = _react2.screen.getByTestId('alert-confirm');
346
- _react2.fireEvent.click(confirmButton);
347
- expect(_react2.screen.queryByTestId('alert-dialog')).not.toBeInTheDocument();
348
- });
349
- });
350
- describe('errors', () => {
351
- it('should display choice errors', () => {
352
- const props = {
353
- ...defaultProps,
354
- errors: {
355
- choicesErrors: {
356
- c1: 'Choice is required'
357
- }
358
- }
359
- };
360
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
361
- // Error appears on both choice and target tiles for the same id
362
- expect(_react2.screen.getAllByTestId(/error-.*-c1/)[0]).toHaveTextContent('Choice is required');
363
- });
364
- it('should display order error', () => {
365
- const props = {
366
- ...defaultProps,
367
- errors: {
368
- orderError: 'Order must be different'
369
- }
370
- };
371
- (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
372
- expect(_react2.screen.getByText('Order must be different')).toBeInTheDocument();
373
- });
374
- });
375
- });
376
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY2hvaWNlRWRpdG9yIiwiamVzdCIsIm1vY2siLCJJbnB1dENvbnRhaW5lciIsImxhYmVsIiwiY2hpbGRyZW4iLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIkFsZXJ0RGlhbG9nIiwib3BlbiIsInRpdGxlIiwidGV4dCIsIm9uQ29uZmlybSIsIm9uQ2xpY2siLCJfX2VzTW9kdWxlIiwiY2hvaWNlIiwib25EZWxldGUiLCJvbkNob2ljZUNoYW5nZSIsImVycm9yIiwidHlwZSIsImlkIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJiZWZvcmVFYWNoIiwiY2hvaWNlcyIsImNvcnJlY3RSZXNwb25zZSIsIndlaWdodCIsIm9uQ2hhbmdlIiwiZm4iLCJpbWFnZVN1cHBvcnQiLCJhZGQiLCJkZWxldGUiLCJzaW5ndWxhckNob2ljZUxhYmVsIiwicGx1cmFsQ2hvaWNlTGFiZWwiLCJjaG9pY2VzTGFiZWwiLCJvcmRlcmluZyIsInRpbGVzIiwiZXJyb3JzIiwiaXQiLCJjb250YWluZXIiLCJyZW5kZXIiLCJleHBlY3QiLCJ0b0JlVHJ1dGh5Iiwic2NyZWVuIiwiZ2V0QnlUZXh0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJnZXRCeVRlc3RJZCIsInByb3BzIiwiYWRkQnV0dG9uIiwiZmlyZUV2ZW50IiwiY2xpY2siLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImFycmF5Q29udGFpbmluZyIsIkFycmF5IiwiZnJvbSIsImxlbmd0aCIsIl8iLCJpIiwiYW55dGhpbmciLCJkZWxldGVCdXR0b24iLCJ0b0hhdmVCZWVuQ2FsbGVkIiwicXVlcnlCeVRlc3RJZCIsIm5vdCIsImNoYW5nZUJ1dHRvbiIsInNodWZmbGVCdXR0b24iLCJzaHVmZmxlZENob2ljZXMiLCJjYWxscyIsInRvSGF2ZUxlbmd0aCIsIm1hcCIsImMiLCJzb3J0IiwidG9FcXVhbCIsInBsYWNlbWVudEFyZWEiLCJvcmlnaW5hbE1hdGgiLCJNYXRoIiwicmFuZG9tIiwiY2FsbENvdW50IiwiY29uZmlybUJ1dHRvbiIsImNob2ljZXNFcnJvcnMiLCJjMSIsImdldEFsbEJ5VGVzdElkIiwidG9IYXZlVGV4dENvbnRlbnQiLCJvcmRlckVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9jaG9pY2UtZWRpdG9yLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIGZpcmVFdmVudCwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgJ0B0ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20nO1xuaW1wb3J0IENob2ljZUVkaXRvciBmcm9tICcuLi9jaG9pY2UtZWRpdG9yJztcblxuLy8gTW9jayBkZXBlbmRlbmNpZXNcbmplc3QubW9jaygnQHBpZS1saWIvcmVuZGVyLXVpJywgKCkgPT4gKHtcbiAgSW5wdXRDb250YWluZXI6ICh7IGxhYmVsLCBjaGlsZHJlbiB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImlucHV0LWNvbnRhaW5lclwiPlxuICAgICAge2xhYmVsICYmIDxkaXYgY2xhc3NOYW1lPVwiaW5wdXQtY29udGFpbmVyLWxhYmVsXCI+e2xhYmVsfTwvZGl2Pn1cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9jb25maWctdWknLCAoKSA9PiAoe1xuICBBbGVydERpYWxvZzogKHsgb3BlbiwgdGl0bGUsIHRleHQsIG9uQ29uZmlybSB9KSA9PlxuICAgIG9wZW4gPyAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiYWxlcnQtZGlhbG9nXCI+XG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJhbGVydC10aXRsZVwiPnt0aXRsZX08L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImFsZXJ0LXRleHRcIj57dGV4dH08L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNvbmZpcm1cIiBvbkNsaWNrPXtvbkNvbmZpcm19PlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApIDogbnVsbCxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9jaG9pY2UtdGlsZScsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6ICh7IGNob2ljZSwgb25EZWxldGUsIG9uQ2hvaWNlQ2hhbmdlLCBlcnJvciB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD17YGNob2ljZS10aWxlLSR7Y2hvaWNlLnR5cGV9LSR7Y2hvaWNlLmlkfWB9PlxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD17YGNob2ljZS1sYWJlbC0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfT57Y2hvaWNlLmxhYmVsfTwvZGl2PlxuICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD17YGRlbGV0ZS0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfSBvbkNsaWNrPXtvbkRlbGV0ZX0+XG4gICAgICAgIERlbGV0ZVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGRhdGEtdGVzdGlkPXtgY2hhbmdlLSR7Y2hvaWNlLnR5cGV9LSR7Y2hvaWNlLmlkfWB9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hvaWNlQ2hhbmdlKHsgLi4uY2hvaWNlLCBsYWJlbDogJ1VwZGF0ZWQnIH0pfVxuICAgICAgPlxuICAgICAgICBDaGFuZ2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAge2Vycm9yICYmIDxkaXYgZGF0YS10ZXN0aWQ9e2BlcnJvci0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfT57ZXJyb3J9PC9kaXY+fVxuICAgIDwvZGl2PlxuICApLFxufSkpO1xuXG5kZXNjcmliZSgnQ2hvaWNlRWRpdG9yJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdFByb3BzO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfSxcbiAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycgfSxcbiAgICAgIF0sXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IFtcbiAgICAgICAgeyBpZDogJ2MxJywgd2VpZ2h0OiAwIH0sXG4gICAgICAgIHsgaWQ6ICdjMicsIHdlaWdodDogMCB9LFxuICAgICAgICB7IGlkOiAnYzMnLCB3ZWlnaHQ6IDAgfSxcbiAgICAgIF0sXG4gICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgaW1hZ2VTdXBwb3J0OiB7XG4gICAgICAgIGFkZDogamVzdC5mbigpLFxuICAgICAgICBkZWxldGU6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgICBzaW5ndWxhckNob2ljZUxhYmVsOiAnY2hvaWNlJyxcbiAgICAgIHBsdXJhbENob2ljZUxhYmVsOiAnY2hvaWNlcycsXG4gICAgICBjaG9pY2VzTGFiZWw6ICdDaG9pY2VzJyxcbiAgICAgIG9yZGVyaW5nOiB7XG4gICAgICAgIHRpbGVzOiBbXG4gICAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICB9O1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgY29sdW1uIGxhYmVscycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdTdHVkZW50IENob2ljZXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdDb3JyZWN0IE9yZGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhbGwgY2hvaWNlIHRpbGVzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hvaWNlLXRpbGUtY2hvaWNlLWMxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdjaG9pY2UtdGlsZS1jaG9pY2UtYzInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2Nob2ljZS10aWxlLWNob2ljZS1jMycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hvaWNlLXRpbGUtdGFyZ2V0LWMxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdjaG9pY2UtdGlsZS10YXJnZXQtYzInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2Nob2ljZS10aWxlLXRhcmdldC1jMycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgc2h1ZmZsZSBidXR0b24nLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnU0hVRkZMRSBDSE9JQ0VTJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhZGQgYnV0dG9uJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGN1c3RvbSBjaG9pY2UgbGFiZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc2luZ3VsYXJDaG9pY2VMYWJlbDogJ2l0ZW0nLFxuICAgICAgICBwbHVyYWxDaG9pY2VMYWJlbDogJ2l0ZW1zJyxcbiAgICAgICAgY2hvaWNlc0xhYmVsOiAnSXRlbXMnLFxuICAgICAgfTtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1NIVUZGTEUgSVRFTVMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBREQgSVRFTScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1N0dWRlbnQgSXRlbXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgbmV3IGNob2ljZSB3aGVuIGFkZCBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChkZWZhdWx0UHJvcHMub25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMuY2hvaWNlcyxcbiAgICAgICAgICB7IGlkOiAnYzQnLCBsYWJlbDogJycgfSxcbiAgICAgICAgXSksXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgeyBpZDogJ2M0Jywgd2VpZ2h0OiAwIH0sXG4gICAgICAgIF0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIHdoZW4gdHJ5aW5nIHRvIGFkZCBtb3JlIHRoYW4gMTAgY2hvaWNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDEwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICAgIGlkOiBgYyR7aSArIDF9YCxcbiAgICAgICAgICBsYWJlbDogYENob2ljZSAke2kgKyAxfWAsXG4gICAgICAgIH0pKSxcbiAgICAgICAgb3JkZXJpbmc6IHtcbiAgICAgICAgICB0aWxlczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMTAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgICAgICBpZDogYGMke2kgKyAxfWAsXG4gICAgICAgICAgICBsYWJlbDogYENob2ljZSAke2kgKyAxfWAsXG4gICAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1RoZXJlIGNhbiBiZSBtYXhpbXVtIDEwIENob2ljZXMuJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgZnJlZSBzbG90IHdoZW4gYWRkaW5nIGNob2ljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvcnJlY3RSZXNwb25zZTogW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIHdlaWdodDogMCB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIHdlaWdodDogMCB9LFxuICAgICAgICBdLFxuICAgICAgICBvcmRlcmluZzoge1xuICAgICAgICAgIHRpbGVzOiBbXG4gICAgICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJywgdHlwZTogJ2Nob2ljZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChwcm9wcy5vbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIC4uLnByb3BzLmNob2ljZXMsXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICcnIH0sXG4gICAgICAgIF0pLFxuICAgICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWxldGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSB3aXRoIG9ubHkgMyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gc2NyZWVuLmdldEJ5VGVzdElkKCdkZWxldGUtY2hvaWNlLWMxJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhkZWxldGVCdXR0b24pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdhbGVydC1kaWFsb2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdUaGVyZSBoYXZlIHRvIGJlIGF0IGxlYXN0IDMgQ2hvaWNlcy4nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgZGVsZXRpb24gd2hlbiBtb3JlIHRoYW4gMyBjaG9pY2VzIGV4aXN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgICAgICB7IGlkOiAnYzMnLCBsYWJlbDogJ0Nob2ljZSAzJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjNCcsIGxhYmVsOiAnQ2hvaWNlIDQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9yZGVyaW5nOiB7XG4gICAgICAgICAgdGlsZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYzMnLCBsYWJlbDogJ0Nob2ljZSAzJywgdHlwZTogJ2Nob2ljZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdjNCcsIGxhYmVsOiAnQ2hvaWNlIDQnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnZGVsZXRlLWNob2ljZS1jMScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGVsZXRlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KHByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoYW5naW5nIGNob2ljZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgY2hvaWNlIGxhYmVsIHdoZW4gY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGNoYW5nZUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hhbmdlLWNob2ljZS1jMScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY2hhbmdlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnVXBkYXRlZCcgfSxcbiAgICAgICAgICB7IGlkOiAnYzInLCBsYWJlbDogJ0Nob2ljZSAyJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnIH0sXG4gICAgICAgIF0pLFxuICAgICAgICBkZWZhdWx0UHJvcHMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NodWZmbGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2h1ZmZsZSBjaG9pY2VzIHdoZW4gc2h1ZmZsZSBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHNodWZmbGVCdXR0b24gPSBzY3JlZW4uZ2V0QnlUZXh0KCdTSFVGRkxFIENIT0lDRVMnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNodWZmbGVCdXR0b24pO1xuXG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBjb25zdCBbc2h1ZmZsZWRDaG9pY2VzXSA9IGRlZmF1bHRQcm9wcy5vbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHNodWZmbGVkQ2hvaWNlcykudG9IYXZlTGVuZ3RoKDMpO1xuICAgICAgZXhwZWN0KHNodWZmbGVkQ2hvaWNlcy5tYXAoKGMpID0+IGMuaWQpLnNvcnQoKSkudG9FcXVhbChbJ2MxJywgJ2MyJywgJ2MzJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaHVmZmxlIGFnYWluIGlmIHJlc3VsdCBtYXRjaGVzIGNvcnJlY3Qgb3JkZXIgd2hlbiBwbGFjZW1lbnRBcmVhIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgcGxhY2VtZW50QXJlYTogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBNb2NrIHNodWZmbGUgdG8gcmV0dXJuIHRoZSBzYW1lIG9yZGVyIGZpcnN0IHRpbWVcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWF0aCA9IE1hdGgucmFuZG9tO1xuICAgICAgbGV0IGNhbGxDb3VudCA9IDA7XG4gICAgICBNYXRoLnJhbmRvbSA9ICgpID0+IHtcbiAgICAgICAgY2FsbENvdW50Kys7XG4gICAgICAgIC8vIEZpcnN0IGNhbGwgcmV0dXJucyBvcmRlcmVkLCBzZWNvbmQgcmV0dXJucyBzaHVmZmxlZFxuICAgICAgICByZXR1cm4gY2FsbENvdW50ID09PSAxID8gMC4xIDogMC45O1xuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBzaHVmZmxlQnV0dG9uID0gc2NyZWVuLmdldEJ5VGV4dCgnU0hVRkZMRSBDSE9JQ0VTJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzaHVmZmxlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KHByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgIE1hdGgucmFuZG9tID0gb3JpZ2luYWxNYXRoO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWxlcnQgZGlhbG9nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2xvc2Ugd2FybmluZyBkaWFsb2cgd2hlbiBjb25maXJtIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBzY3JlZW4uZ2V0QnlUZXN0SWQoJ2RlbGV0ZS1jaG9pY2UtYzEnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGRlbGV0ZUJ1dHRvbik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdhbGVydC1kaWFsb2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgY29uc3QgY29uZmlybUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnYWxlcnQtY29uZmlybScpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbmZpcm1CdXR0b24pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRpc3BsYXkgY2hvaWNlIGVycm9ycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGVycm9yczoge1xuICAgICAgICAgIGNob2ljZXNFcnJvcnM6IHtcbiAgICAgICAgICAgIGMxOiAnQ2hvaWNlIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICAvLyBFcnJvciBhcHBlYXJzIG9uIGJvdGggY2hvaWNlIGFuZCB0YXJnZXQgdGlsZXMgZm9yIHRoZSBzYW1lIGlkXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEFsbEJ5VGVzdElkKC9lcnJvci0uKi1jMS8pWzBdKS50b0hhdmVUZXh0Q29udGVudCgnQ2hvaWNlIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRpc3BsYXkgb3JkZXIgZXJyb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBvcmRlckVycm9yOiAnT3JkZXIgbXVzdCBiZSBkaWZmZXJlbnQnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnT3JkZXIgbXVzdCBiZSBkaWZmZXJlbnQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMs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