@pie-element/placement-ordering 14.3.0-beta.0 → 14.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -9
- package/configure/CHANGELOG.md +60 -8
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +10 -2
- package/controller/package.json +1 -1
- package/lib/keyboard-coordinates.js +124 -0
- package/lib/keyboard-coordinates.js.map +1 -0
- package/lib/placement-ordering.js +138 -8
- package/lib/placement-ordering.js.map +1 -1
- package/lib/tile.js +93 -22
- package/lib/tile.js.map +1 -1
- package/lib/tiler.js +7 -1
- package/lib/tiler.js.map +1 -1
- package/package.json +6 -5
- package/configure/lib/__tests__/choice-editor.test.js +0 -376
- package/configure/lib/__tests__/choice-tile.test.js +0 -283
- package/configure/lib/__tests__/design.test.js +0 -268
- package/configure/lib/__tests__/help.test.js +0 -64
- package/configure/lib/__tests__/index.test.js +0 -77
- package/configure/lib/__tests__/utils.test.js +0 -493
- package/controller/lib/__tests__/index.test.js +0 -401
- package/controller/lib/__tests__/scoring.test.js +0 -165
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/index-test.js +0 -90
- package/lib/__tests__/ordering.test.js +0 -133
- package/lib/__tests__/placement-ordering.test.js +0 -445
|
@@ -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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
|