@pie-element/inline-dropdown 4.10.16-next.1 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +461 -0
- package/LICENSE.md +5 -0
- package/configure/CHANGELOG.md +405 -0
- package/configure/lib/defaults.js +18 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +15 -1
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/inline-dropdown-toolbar.js +54 -47
- package/configure/lib/inline-dropdown-toolbar.js.map +1 -1
- package/configure/lib/main.js +227 -159
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/markupUtils.js +1 -1
- package/configure/lib/markupUtils.js.map +1 -1
- package/configure/lib/utils.js +17 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +85 -0
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +28 -1
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/config-schema.json +94 -0
- package/docs/config-schema.json.md +73 -1
- package/docs/demo/config.js +2 -2
- package/docs/demo/generate.js +19 -20
- package/docs/pie-schema.json +27 -0
- package/docs/pie-schema.json.md +20 -0
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/inline-dropdown.js +31 -21
- package/lib/inline-dropdown.js.map +1 -1
- package/package.json +6 -6
- package/configure/lib/__tests__/inline-dropdown-toolbar.test.js +0 -124
- package/configure/lib/__tests__/main.test.js +0 -516
- package/configure/lib/__tests__/markupUtils.test.js +0 -108
- package/controller/lib/__tests__/index.test.js +0 -942
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/inline-dropdown.test.js +0 -121
|
@@ -1,516 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
6
|
-
|
|
7
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
-
|
|
9
|
-
var _enzyme = require("enzyme");
|
|
10
|
-
|
|
11
|
-
var _react = _interopRequireDefault(require("react"));
|
|
12
|
-
|
|
13
|
-
var _main = require("../main");
|
|
14
|
-
|
|
15
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
16
|
-
|
|
17
|
-
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
18
|
-
|
|
19
|
-
var _markupUtils = require("../markupUtils");
|
|
20
|
-
|
|
21
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
22
|
-
|
|
23
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
24
|
-
|
|
25
|
-
jest.mock('@pie-lib/config-ui', function () {
|
|
26
|
-
return {
|
|
27
|
-
choiceUtils: {
|
|
28
|
-
firstAvailableIndex: jest.fn()
|
|
29
|
-
},
|
|
30
|
-
settings: {
|
|
31
|
-
Panel: function Panel(props) {
|
|
32
|
-
return /*#__PURE__*/_react["default"].createElement("div", props);
|
|
33
|
-
},
|
|
34
|
-
toggle: jest.fn(),
|
|
35
|
-
radio: jest.fn(),
|
|
36
|
-
dropdown: jest.fn()
|
|
37
|
-
},
|
|
38
|
-
layout: {
|
|
39
|
-
ConfigLayout: function ConfigLayout(props) {
|
|
40
|
-
return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
InputContainer: function InputContainer(props) {
|
|
44
|
-
return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
});
|
|
48
|
-
var model = {
|
|
49
|
-
prompt: 'Use the dropdowns to complete the sentence',
|
|
50
|
-
shuffle: true,
|
|
51
|
-
markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
|
|
52
|
-
choices: {
|
|
53
|
-
'0': [{
|
|
54
|
-
label: 'cow ',
|
|
55
|
-
value: '0',
|
|
56
|
-
correct: true,
|
|
57
|
-
rationale: 'rationale for cow'
|
|
58
|
-
}, {
|
|
59
|
-
label: 'dog ',
|
|
60
|
-
value: '1',
|
|
61
|
-
correct: false
|
|
62
|
-
}, {
|
|
63
|
-
label: 'cat ',
|
|
64
|
-
value: '2',
|
|
65
|
-
correct: false
|
|
66
|
-
}],
|
|
67
|
-
'1': [{
|
|
68
|
-
label: 'over ',
|
|
69
|
-
value: '0',
|
|
70
|
-
correct: true,
|
|
71
|
-
rationale: 'rationale for over'
|
|
72
|
-
}, {
|
|
73
|
-
label: 'under ',
|
|
74
|
-
value: '1',
|
|
75
|
-
correct: false
|
|
76
|
-
}, {
|
|
77
|
-
label: 'across ',
|
|
78
|
-
value: '2',
|
|
79
|
-
correct: false
|
|
80
|
-
}],
|
|
81
|
-
'2': [{
|
|
82
|
-
label: 'moon ',
|
|
83
|
-
value: '0',
|
|
84
|
-
correct: true,
|
|
85
|
-
rationale: 'rationale for moon'
|
|
86
|
-
}, {
|
|
87
|
-
label: 'sun',
|
|
88
|
-
value: '2',
|
|
89
|
-
correct: false
|
|
90
|
-
}, {
|
|
91
|
-
label: 'house ',
|
|
92
|
-
value: '3',
|
|
93
|
-
correct: false
|
|
94
|
-
}]
|
|
95
|
-
},
|
|
96
|
-
alternateResponse: {
|
|
97
|
-
'2': ['2']
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
var prepareModel = function prepareModel() {
|
|
102
|
-
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
103
|
-
|
|
104
|
-
var currModal = _objectSpread(_objectSpread({}, _defaults["default"].model), model);
|
|
105
|
-
|
|
106
|
-
var slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(currModal.markup, currModal.choices);
|
|
107
|
-
var markup = (0, _markupUtils.processMarkup)(slateMarkup);
|
|
108
|
-
return _objectSpread(_objectSpread({}, currModal), {}, {
|
|
109
|
-
slateMarkup: slateMarkup,
|
|
110
|
-
markup: markup
|
|
111
|
-
/*...processedMarkup,*/
|
|
112
|
-
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
describe('Main', function () {
|
|
117
|
-
var onModelChanged;
|
|
118
|
-
var onConfigurationChanged;
|
|
119
|
-
|
|
120
|
-
var wrapper = function wrapper(extras) {
|
|
121
|
-
onModelChanged = jest.fn();
|
|
122
|
-
onConfigurationChanged = jest.fn();
|
|
123
|
-
var defaults = {
|
|
124
|
-
onModelChanged: onModelChanged,
|
|
125
|
-
onConfigurationChanged: onConfigurationChanged,
|
|
126
|
-
classes: {},
|
|
127
|
-
model: prepareModel(_objectSpread(_objectSpread({}, model), extras)),
|
|
128
|
-
configuration: _defaults["default"].configuration
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
var props = _objectSpread({}, defaults);
|
|
132
|
-
|
|
133
|
-
return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_main.Main, props), {
|
|
134
|
-
disableLifecycleMethods: true
|
|
135
|
-
});
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
describe('snapshot', function () {
|
|
139
|
-
it('renders with teacher instructions, prompt and rationale even if not set', function () {
|
|
140
|
-
expect(wrapper()).toMatchSnapshot();
|
|
141
|
-
});
|
|
142
|
-
it('renders without teacher instructions, prompt and rationale', function () {
|
|
143
|
-
expect(wrapper({
|
|
144
|
-
promptEnabled: false,
|
|
145
|
-
teacherInstructionsEnabled: false,
|
|
146
|
-
rationaleEnabled: false
|
|
147
|
-
})).toMatchSnapshot();
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe('logic', function () {
|
|
151
|
-
var w;
|
|
152
|
-
beforeEach(function () {
|
|
153
|
-
w = wrapper();
|
|
154
|
-
});
|
|
155
|
-
describe('onModelChange', function () {
|
|
156
|
-
it('changes the model', function () {
|
|
157
|
-
w.instance().onModelChange({
|
|
158
|
-
promptEnabled: false
|
|
159
|
-
});
|
|
160
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
161
|
-
promptEnabled: false
|
|
162
|
-
}));
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
describe('onPromptChanged', function () {
|
|
166
|
-
it('changes the prompt value', function () {
|
|
167
|
-
w.instance().onPromptChanged('This is the new prompt');
|
|
168
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
169
|
-
prompt: 'This is the new prompt'
|
|
170
|
-
}));
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
describe('onRationaleChanged', function () {
|
|
174
|
-
it('changes the rationale value', function () {
|
|
175
|
-
w.instance().onRationaleChanged('New Rationale');
|
|
176
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
177
|
-
rationale: 'New Rationale'
|
|
178
|
-
}));
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
describe('onTeacherInstructionsChanged', function () {
|
|
182
|
-
it('changes the teacher instructions value', function () {
|
|
183
|
-
w.instance().onTeacherInstructionsChanged('New Teacher Instructions');
|
|
184
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
185
|
-
teacherInstructions: 'New Teacher Instructions'
|
|
186
|
-
}));
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
describe('onMarkupChanged', function () {
|
|
190
|
-
it('changes slate markup value', function () {
|
|
191
|
-
var slateMarkup = '<p>The <span data-type=\\"explicit_constructed_response\\" data-index=\\"0\\" data-value=\\"cow\\"></span> jumped</p>';
|
|
192
|
-
w.instance().onMarkupChanged(slateMarkup);
|
|
193
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
194
|
-
slateMarkup: slateMarkup
|
|
195
|
-
}));
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
describe('onChange', function () {
|
|
199
|
-
it('Removing choices (keeping only 1 choice): slateMarkup and choices are updated', function () {
|
|
200
|
-
var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
|
|
201
|
-
'0': model.choices['0'].slice(0, 1)
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
|
|
205
|
-
w.instance().setState({
|
|
206
|
-
respAreaChoices: newChoices
|
|
207
|
-
});
|
|
208
|
-
w.instance().onChange(newMarkup); // TODO do we have to test what happens if clicking on OK/Cancel? How?
|
|
209
|
-
|
|
210
|
-
expect(onModelChanged).not.toBeCalled();
|
|
211
|
-
});
|
|
212
|
-
it('No correct choice selected: slateMarkup and choices are updated', function () {
|
|
213
|
-
var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
|
|
214
|
-
'0': [{
|
|
215
|
-
label: 'cow ',
|
|
216
|
-
value: '0',
|
|
217
|
-
correct: false
|
|
218
|
-
}, {
|
|
219
|
-
label: 'dog ',
|
|
220
|
-
value: '1',
|
|
221
|
-
correct: false
|
|
222
|
-
}, {
|
|
223
|
-
label: 'cat ',
|
|
224
|
-
value: '2',
|
|
225
|
-
correct: false
|
|
226
|
-
}]
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
|
|
230
|
-
w.instance().setState({
|
|
231
|
-
respAreaChoices: newChoices
|
|
232
|
-
});
|
|
233
|
-
w.instance().onChange(newMarkup); // TODO do we have to test what happens if clicking on OK/Cancel? How?
|
|
234
|
-
|
|
235
|
-
expect(onModelChanged).not.toBeCalled();
|
|
236
|
-
});
|
|
237
|
-
it('New choice: slateMarkup and choices are updated', function () {
|
|
238
|
-
var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
|
|
239
|
-
'0': [].concat((0, _toConsumableArray2["default"])(model.choices['0']), [{
|
|
240
|
-
label: 'pet ',
|
|
241
|
-
value: '3',
|
|
242
|
-
correct: false
|
|
243
|
-
}])
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
|
|
247
|
-
w.instance().setState({
|
|
248
|
-
respAreaChoices: newChoices
|
|
249
|
-
});
|
|
250
|
-
w.instance().onChange(newMarkup);
|
|
251
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
252
|
-
slateMarkup: newMarkup,
|
|
253
|
-
choices: newChoices
|
|
254
|
-
}));
|
|
255
|
-
});
|
|
256
|
-
it('New Response Area: slateMarkup and choices are updated', function () {
|
|
257
|
-
var oldModel = w.instance().props.model;
|
|
258
|
-
|
|
259
|
-
var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
|
|
260
|
-
'3': [{
|
|
261
|
-
label: 'A ',
|
|
262
|
-
value: '0',
|
|
263
|
-
correct: true
|
|
264
|
-
}, {
|
|
265
|
-
label: 'B',
|
|
266
|
-
value: '1',
|
|
267
|
-
correct: false
|
|
268
|
-
}, {
|
|
269
|
-
label: 'C ',
|
|
270
|
-
value: '2',
|
|
271
|
-
correct: false
|
|
272
|
-
}]
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>, <span data-type=\"inline_dropdown\" data-index=\"3\" data-value=\"A\"></span>.</p></div>";
|
|
276
|
-
w.instance().setState({
|
|
277
|
-
respAreaChoices: newChoices
|
|
278
|
-
});
|
|
279
|
-
w.instance().onChange(newMarkup);
|
|
280
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
|
|
281
|
-
slateMarkup: newMarkup,
|
|
282
|
-
choices: newChoices
|
|
283
|
-
}));
|
|
284
|
-
});
|
|
285
|
-
it('Removing choices (keeping at least 2): slateMarkup and choices are updated', function () {
|
|
286
|
-
var oldModel = w.instance().props.model;
|
|
287
|
-
|
|
288
|
-
var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
|
|
289
|
-
'0': model.choices['0'].slice(0, 2)
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
|
|
293
|
-
w.instance().setState({
|
|
294
|
-
respAreaChoices: newChoices
|
|
295
|
-
});
|
|
296
|
-
w.instance().onChange(newMarkup);
|
|
297
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
|
|
298
|
-
slateMarkup: newMarkup,
|
|
299
|
-
choices: newChoices
|
|
300
|
-
}));
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
describe('onChoiceRationaleChanged', function () {
|
|
304
|
-
it('changes the choice level rationale value', function () {
|
|
305
|
-
w.instance().onChoiceRationaleChanged(0, {
|
|
306
|
-
label: 'cow ',
|
|
307
|
-
value: '0',
|
|
308
|
-
correct: true,
|
|
309
|
-
rationale: 'new rationale for cow'
|
|
310
|
-
});
|
|
311
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
|
|
312
|
-
choices: {
|
|
313
|
-
'0': [{
|
|
314
|
-
label: 'cow ',
|
|
315
|
-
value: '0',
|
|
316
|
-
correct: true,
|
|
317
|
-
rationale: 'new rationale for cow'
|
|
318
|
-
}, {
|
|
319
|
-
label: 'dog ',
|
|
320
|
-
value: '1',
|
|
321
|
-
correct: false
|
|
322
|
-
}, {
|
|
323
|
-
label: 'cat ',
|
|
324
|
-
value: '2',
|
|
325
|
-
correct: false
|
|
326
|
-
}],
|
|
327
|
-
'1': [{
|
|
328
|
-
label: 'over ',
|
|
329
|
-
value: '0',
|
|
330
|
-
correct: true,
|
|
331
|
-
rationale: 'rationale for over'
|
|
332
|
-
}, {
|
|
333
|
-
label: 'under ',
|
|
334
|
-
value: '1',
|
|
335
|
-
correct: false
|
|
336
|
-
}, {
|
|
337
|
-
label: 'across ',
|
|
338
|
-
value: '2',
|
|
339
|
-
correct: false
|
|
340
|
-
}],
|
|
341
|
-
'2': [{
|
|
342
|
-
label: 'moon ',
|
|
343
|
-
value: '0',
|
|
344
|
-
correct: true,
|
|
345
|
-
rationale: 'rationale for moon'
|
|
346
|
-
}, {
|
|
347
|
-
label: 'sun',
|
|
348
|
-
value: '2',
|
|
349
|
-
correct: false
|
|
350
|
-
}, {
|
|
351
|
-
label: 'house ',
|
|
352
|
-
value: '3',
|
|
353
|
-
correct: false
|
|
354
|
-
}]
|
|
355
|
-
}
|
|
356
|
-
}));
|
|
357
|
-
});
|
|
358
|
-
});
|
|
359
|
-
describe('onAddChoice', function () {
|
|
360
|
-
beforeEach(function () {
|
|
361
|
-
w.instance().setState({
|
|
362
|
-
respAreaChoices: model.choices
|
|
363
|
-
});
|
|
364
|
-
});
|
|
365
|
-
it('Does not add duplicates', function () {
|
|
366
|
-
w.instance().onAddChoice('0', 'cow');
|
|
367
|
-
expect(onModelChanged).not.toBeCalled();
|
|
368
|
-
w.instance().onAddChoice('1', 'over');
|
|
369
|
-
expect(onModelChanged).not.toBeCalled();
|
|
370
|
-
w.instance().onAddChoice('1', 'under');
|
|
371
|
-
expect(onModelChanged).not.toBeCalled();
|
|
372
|
-
});
|
|
373
|
-
it('Adds a new choice', function () {
|
|
374
|
-
var currentModel = (0, _cloneDeep["default"])(w.instance().props.model);
|
|
375
|
-
w.instance().onAddChoice('0', 'bird');
|
|
376
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
|
|
377
|
-
choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
|
|
378
|
-
'0': [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
|
|
379
|
-
label: 'bird',
|
|
380
|
-
value: '3',
|
|
381
|
-
correct: false
|
|
382
|
-
}])
|
|
383
|
-
})
|
|
384
|
-
}));
|
|
385
|
-
w.instance().onAddChoice('2', 'star');
|
|
386
|
-
expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
|
|
387
|
-
choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
|
|
388
|
-
'0': [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
|
|
389
|
-
label: 'bird',
|
|
390
|
-
value: '3',
|
|
391
|
-
correct: false
|
|
392
|
-
}]),
|
|
393
|
-
'2': [].concat((0, _toConsumableArray2["default"])(currentModel.choices['2']), [{
|
|
394
|
-
label: 'star',
|
|
395
|
-
value: '4',
|
|
396
|
-
correct: false
|
|
397
|
-
}])
|
|
398
|
-
})
|
|
399
|
-
}));
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
describe('onRemoveChoice', function () {
|
|
403
|
-
beforeEach(function () {
|
|
404
|
-
w.instance().setState({
|
|
405
|
-
respAreaChoices: {
|
|
406
|
-
'0': [{
|
|
407
|
-
label: 'cow ',
|
|
408
|
-
value: '0',
|
|
409
|
-
correct: true
|
|
410
|
-
}, {
|
|
411
|
-
label: 'dog ',
|
|
412
|
-
value: '1',
|
|
413
|
-
correct: false
|
|
414
|
-
}, {
|
|
415
|
-
label: 'cat ',
|
|
416
|
-
value: '2',
|
|
417
|
-
correct: false
|
|
418
|
-
}]
|
|
419
|
-
}
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
it('Removes choices', function () {
|
|
423
|
-
w.instance().onRemoveChoice(0, '0');
|
|
424
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
425
|
-
choices: {
|
|
426
|
-
'0': [{
|
|
427
|
-
label: 'dog ',
|
|
428
|
-
value: '1',
|
|
429
|
-
correct: false
|
|
430
|
-
}, {
|
|
431
|
-
label: 'cat ',
|
|
432
|
-
value: '2',
|
|
433
|
-
correct: false
|
|
434
|
-
}]
|
|
435
|
-
}
|
|
436
|
-
}));
|
|
437
|
-
w.instance().onRemoveChoice(0, '0');
|
|
438
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
439
|
-
choices: {
|
|
440
|
-
'0': [{
|
|
441
|
-
label: 'cat ',
|
|
442
|
-
value: '2',
|
|
443
|
-
correct: false
|
|
444
|
-
}]
|
|
445
|
-
}
|
|
446
|
-
}));
|
|
447
|
-
w.instance().onRemoveChoice(0, '0');
|
|
448
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
449
|
-
choices: {
|
|
450
|
-
'0': []
|
|
451
|
-
}
|
|
452
|
-
}));
|
|
453
|
-
});
|
|
454
|
-
});
|
|
455
|
-
describe('onSelectChoice', function () {
|
|
456
|
-
beforeEach(function () {
|
|
457
|
-
w.instance().setState({
|
|
458
|
-
respAreaChoices: {
|
|
459
|
-
'0': [{
|
|
460
|
-
label: 'cow ',
|
|
461
|
-
value: '0',
|
|
462
|
-
correct: true
|
|
463
|
-
}, {
|
|
464
|
-
label: 'dog ',
|
|
465
|
-
value: '1',
|
|
466
|
-
correct: false
|
|
467
|
-
}, {
|
|
468
|
-
label: 'cat ',
|
|
469
|
-
value: '2',
|
|
470
|
-
correct: false
|
|
471
|
-
}]
|
|
472
|
-
}
|
|
473
|
-
});
|
|
474
|
-
});
|
|
475
|
-
it('Updates correct choice', function () {
|
|
476
|
-
w.instance().onSelectChoice(0, 1);
|
|
477
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
478
|
-
choices: {
|
|
479
|
-
'0': [{
|
|
480
|
-
label: 'cow ',
|
|
481
|
-
value: '0',
|
|
482
|
-
correct: false
|
|
483
|
-
}, {
|
|
484
|
-
label: 'dog ',
|
|
485
|
-
value: '1',
|
|
486
|
-
correct: true
|
|
487
|
-
}, {
|
|
488
|
-
label: 'cat ',
|
|
489
|
-
value: '2',
|
|
490
|
-
correct: false
|
|
491
|
-
}]
|
|
492
|
-
}
|
|
493
|
-
}));
|
|
494
|
-
w.instance().onSelectChoice(0, 0);
|
|
495
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
496
|
-
choices: {
|
|
497
|
-
'0': [{
|
|
498
|
-
label: 'cow ',
|
|
499
|
-
value: '0',
|
|
500
|
-
correct: true
|
|
501
|
-
}, {
|
|
502
|
-
label: 'dog ',
|
|
503
|
-
value: '1',
|
|
504
|
-
correct: false
|
|
505
|
-
}, {
|
|
506
|
-
label: 'cat ',
|
|
507
|
-
value: '2',
|
|
508
|
-
correct: false
|
|
509
|
-
}]
|
|
510
|
-
}
|
|
511
|
-
}));
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWFpbi50ZXN0LmpzeCJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsImZuIiwic2V0dGluZ3MiLCJQYW5lbCIsInByb3BzIiwidG9nZ2xlIiwicmFkaW8iLCJkcm9wZG93biIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwiSW5wdXRDb250YWluZXIiLCJtb2RlbCIsInByb21wdCIsInNodWZmbGUiLCJtYXJrdXAiLCJjaG9pY2VzIiwibGFiZWwiLCJ2YWx1ZSIsImNvcnJlY3QiLCJyYXRpb25hbGUiLCJhbHRlcm5hdGVSZXNwb25zZSIsInByZXBhcmVNb2RlbCIsImN1cnJNb2RhbCIsInNlbnNpYmxlRGVmYXVsdHMiLCJzbGF0ZU1hcmt1cCIsImRlc2NyaWJlIiwib25Nb2RlbENoYW5nZWQiLCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwid3JhcHBlciIsImV4dHJhcyIsImRlZmF1bHRzIiwiY2xhc3NlcyIsImNvbmZpZ3VyYXRpb24iLCJkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kcyIsIml0IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicHJvbXB0RW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInciLCJiZWZvcmVFYWNoIiwiaW5zdGFuY2UiLCJvbk1vZGVsQ2hhbmdlIiwidG9CZUNhbGxlZFdpdGgiLCJvblByb21wdENoYW5nZWQiLCJvblJhdGlvbmFsZUNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwidGVhY2hlckluc3RydWN0aW9ucyIsIm9uTWFya3VwQ2hhbmdlZCIsIm5ld0Nob2ljZXMiLCJzbGljZSIsIm5ld01hcmt1cCIsInNldFN0YXRlIiwicmVzcEFyZWFDaG9pY2VzIiwib25DaGFuZ2UiLCJub3QiLCJ0b0JlQ2FsbGVkIiwib2xkTW9kZWwiLCJvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQiLCJvbkFkZENob2ljZSIsImN1cnJlbnRNb2RlbCIsIm9uUmVtb3ZlQ2hvaWNlIiwib2JqZWN0Q29udGFpbmluZyIsIm9uU2VsZWN0Q2hvaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsb0JBQVYsRUFBZ0M7QUFBQSxTQUFPO0FBQ3JDQyxJQUFBQSxXQUFXLEVBQUU7QUFDWEMsTUFBQUEsbUJBQW1CLEVBQUVILElBQUksQ0FBQ0ksRUFBTDtBQURWLEtBRHdCO0FBSXJDQyxJQUFBQSxRQUFRLEVBQUU7QUFDUkMsTUFBQUEsS0FBSyxFQUFFLGVBQUFDLEtBQUs7QUFBQSw0QkFBSSx1Q0FBU0EsS0FBVCxDQUFKO0FBQUEsT0FESjtBQUVSQyxNQUFBQSxNQUFNLEVBQUVSLElBQUksQ0FBQ0ksRUFBTCxFQUZBO0FBR1JLLE1BQUFBLEtBQUssRUFBRVQsSUFBSSxDQUFDSSxFQUFMLEVBSEM7QUFJUk0sTUFBQUEsUUFBUSxFQUFFVixJQUFJLENBQUNJLEVBQUw7QUFKRixLQUoyQjtBQVVyQ08sSUFBQUEsTUFBTSxFQUFFO0FBQ05DLE1BQUFBLFlBQVksRUFBRSxzQkFBQUwsS0FBSztBQUFBLDRCQUFJLDZDQUFNQSxLQUFLLENBQUNNLFFBQVosQ0FBSjtBQUFBO0FBRGIsS0FWNkI7QUFhckNDLElBQUFBLGNBQWMsRUFBRSx3QkFBQVAsS0FBSztBQUFBLDBCQUFJLDZDQUFNQSxLQUFLLENBQUNNLFFBQVosQ0FBSjtBQUFBO0FBYmdCLEdBQVA7QUFBQSxDQUFoQztBQWdCQSxJQUFNRSxLQUFLLEdBQUc7QUFDWkMsRUFBQUEsTUFBTSxFQUFFLDRDQURJO0FBRVpDLEVBQUFBLE9BQU8sRUFBRSxJQUZHO0FBR1pDLEVBQUFBLE1BQU0sRUFBRSxvREFISTtBQUlaQyxFQUFBQSxPQUFPLEVBQUU7QUFDUCxTQUFLLENBQ0g7QUFDRUMsTUFBQUEsS0FBSyxF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b20gJ3JlYWN0JztcblxuaW1wb3J0IHsgTWFpbiB9IGZyb20gJy4uL21haW4nO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBzZW5zaWJsZURlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcbmltcG9ydCB7IGNyZWF0ZVNsYXRlTWFya3VwLCBwcm9jZXNzTWFya3VwIH0gZnJvbSAnLi4vbWFya3VwVXRpbHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbmZpZy11aScsICgpID0+ICh7XG4gIGNob2ljZVV0aWxzOiB7XG4gICAgZmlyc3RBdmFpbGFibGVJbmRleDogamVzdC5mbigpXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IHByb3BzID0+IDxkaXYgey4uLnByb3BzfSAvPixcbiAgICB0b2dnbGU6IGplc3QuZm4oKSxcbiAgICByYWRpbzogamVzdC5mbigpLFxuICAgIGRyb3Bkb3duOiBqZXN0LmZuKClcbiAgfSxcbiAgbGF5b3V0OiB7XG4gICAgQ29uZmlnTGF5b3V0OiBwcm9wcyA9PiA8ZGl2Pntwcm9wcy5jaGlsZHJlbn08L2Rpdj5cbiAgfSxcbiAgSW5wdXRDb250YWluZXI6IHByb3BzID0+IDxkaXY+e3Byb3BzLmNoaWxkcmVufTwvZGl2PlxufSkpO1xuXG5jb25zdCBtb2RlbCA9IHtcbiAgcHJvbXB0OiAnVXNlIHRoZSBkcm9wZG93bnMgdG8gY29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbiAgc2h1ZmZsZTogdHJ1ZSxcbiAgbWFya3VwOiAnPGRpdj48cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD48L2Rpdj4nLFxuICBjaG9pY2VzOiB7XG4gICAgJzAnOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY293ICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgY293J1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdkb2cgJyxcbiAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICAnMSc6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdvdmVyICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3Igb3ZlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAndW5kZXIgJyxcbiAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICAnMic6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgbW9vbidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIGFsdGVybmF0ZVJlc3BvbnNlOiB7XG4gICAgJzInOiBbJzInXVxuICB9XG59O1xuXG5jb25zdCBwcmVwYXJlTW9kZWwgPSAobW9kZWwgPSB7fSkgPT4ge1xuICBjb25zdCBjdXJyTW9kYWwgPSB7XG4gICAgLi4uc2Vuc2libGVEZWZhdWx0cy5tb2RlbCxcbiAgICAuLi5tb2RlbFxuICB9O1xuICBjb25zdCBzbGF0ZU1hcmt1cCA9IG1vZGVsLnNsYXRlTWFya3VwIHx8IGNyZWF0ZVNsYXRlTWFya3VwKGN1cnJNb2RhbC5tYXJrdXAsIGN1cnJNb2RhbC5jaG9pY2VzKTtcbiAgY29uc3QgbWFya3VwID0gcHJvY2Vzc01hcmt1cChzbGF0ZU1hcmt1cCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jdXJyTW9kYWwsXG4gICAgc2xhdGVNYXJrdXAsXG4gICAgbWFya3VwXG4gICAgLyouLi5wcm9jZXNzZWRNYXJrdXAsKi9cbiAgfTtcbn07XG5cbmRlc2NyaWJlKCdNYWluJywgKCkgPT4ge1xuICBsZXQgb25Nb2RlbENoYW5nZWQ7XG4gIGxldCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSBleHRyYXMgPT4ge1xuICAgIG9uTW9kZWxDaGFuZ2VkID0gamVzdC5mbigpO1xuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5leHRyYXNcbiAgICAgIH0pLFxuICAgICAgY29uZmlndXJhdGlvbjogc2Vuc2libGVEZWZhdWx0cy5jb25maWd1cmF0aW9uXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMgfTtcblxuICAgIHJldHVybiBzaGFsbG93KDxNYWluIHsuLi5wcm9wc30gLz4sIHsgZGlzYWJsZUxpZmVjeWNsZU1ldGhvZHM6IHRydWUgfSk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggdGVhY2hlciBpbnN0cnVjdGlvbnMsIHByb21wdCBhbmQgcmF0aW9uYWxlIGV2ZW4gaWYgbm90IHNldCcsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3cmFwcGVyKCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCB0ZWFjaGVyIGluc3RydWN0aW9ucywgcHJvbXB0IGFuZCByYXRpb25hbGUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qod3JhcHBlcih7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlXG4gICAgICB9KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBsZXQgdztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgdyA9IHdyYXBwZXIoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbk1vZGVsQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIG1vZGVsJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25Nb2RlbENoYW5nZSh7IHByb21wdEVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblByb21wdENoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgcHJvbXB0IHZhbHVlJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25Qcm9tcHRDaGFuZ2VkKCdUaGlzIGlzIHRoZSBuZXcgcHJvbXB0Jyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBwcm9tcHQ6ICdUaGlzIGlzIHRoZSBuZXcgcHJvbXB0J1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmF0aW9uYWxlQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSByYXRpb25hbGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblJhdGlvbmFsZUNoYW5nZWQoJ05ldyBSYXRpb25hbGUnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ05ldyBSYXRpb25hbGUnXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSB0ZWFjaGVyIGluc3RydWN0aW9ucyB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQoJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucydcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbk1hcmt1cENoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyBzbGF0ZSBtYXJrdXAgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNsYXRlTWFya3VwID0gJzxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XFxcXFwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcXFxcXCIgZGF0YS1pbmRleD1cXFxcXCIwXFxcXFwiIGRhdGEtdmFsdWU9XFxcXFwiY293XFxcXFwiPjwvc3Bhbj4ganVtcGVkPC9wPic7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uTWFya3VwQ2hhbmdlZChzbGF0ZU1hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBzbGF0ZU1hcmt1cFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgaXQoJ1JlbW92aW5nIGNob2ljZXMgKGtlZXBpbmcgb25seSAxIGNob2ljZSk6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgJzAnOiBtb2RlbC5jaG9pY2VzWycwJ10uc2xpY2UoMCwgMSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFRPRE8gZG8gd2UgaGF2ZSB0byB0ZXN0IHdoYXQgaGFwcGVucyBpZiBjbGlja2luZyBvbiBPSy9DYW5jZWw/IEhvdz9cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdObyBjb3JyZWN0IGNob2ljZSBzZWxlY3RlZDogc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAnMCc6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnZG9nICcsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFRPRE8gZG8gd2UgaGF2ZSB0byB0ZXN0IHdoYXQgaGFwcGVucyBpZiBjbGlja2luZyBvbiBPSy9DYW5jZWw/IEhvdz9cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgfSk7XG5cblxuICAgICAgaXQoJ05ldyBjaG9pY2U6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgJzAnOiBbXG4gICAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzWycwJ10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAncGV0ICcsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMycsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hhbmdlKG5ld01hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBzbGF0ZU1hcmt1cDogbmV3TWFya3VwLFxuICAgICAgICAgIGNob2ljZXM6IG5ld0Nob2ljZXNcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ05ldyBSZXNwb25zZSBBcmVhOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3Lmluc3RhbmNlKCkucHJvcHMubW9kZWw7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAnMyc6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdBICcsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnQicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0MgJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4sIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIzXCIgZGF0YS12YWx1ZT1cIkFcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hhbmdlKG5ld01hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ub2xkTW9kZWwsXG4gICAgICAgICAgc2xhdGVNYXJrdXA6IG5ld01hcmt1cCxcbiAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdSZW1vdmluZyBjaG9pY2VzIChrZWVwaW5nIGF0IGxlYXN0IDIpOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3Lmluc3RhbmNlKCkucHJvcHMubW9kZWw7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAnMCc6IG1vZGVsLmNob2ljZXNbJzAnXS5zbGljZSgwLCAyKVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hhbmdlKG5ld01hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ub2xkTW9kZWwsXG4gICAgICAgICAgc2xhdGVNYXJrdXA6IG5ld01hcmt1cCxcbiAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaG9pY2VSYXRpb25hbGVDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIGNob2ljZSBsZXZlbCByYXRpb25hbGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQoMCwgIHtcbiAgICAgICAgICBsYWJlbDogJ2NvdyAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6ICduZXcgcmF0aW9uYWxlIGZvciBjb3cnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgJzAnOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2NvdyAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICByYXRpb25hbGU6ICduZXcgcmF0aW9uYWxlIGZvciBjb3cnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2RvZyAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJzEnOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ292ZXIgJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBvdmVyJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICd1bmRlciAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJzInOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ21vb24gJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBtb29uJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdzdW4nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2VcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25BZGRDaG9pY2UnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBtb2RlbC5jaG9pY2VzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdEb2VzIG5vdCBhZGQgZHVwbGljYXRlcycsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCcwJywgJ2NvdycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzEnLCAnb3ZlcicpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzEnLCAndW5kZXInKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ0FkZHMgYSBuZXcgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjbG9uZURlZXAody5pbnN0YW5jZSgpLnByb3BzLm1vZGVsKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzAnLCAnYmlyZCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgICcwJzogW1xuICAgICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMCddLFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnYmlyZCcsIHZhbHVlOiAnMycsIGNvcnJlY3Q6IGZhbHNlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkFkZENob2ljZSgnMicsICdzdGFyJyk7XG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgICcwJzogW1xuICAgICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMCddLFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnYmlyZCcsIHZhbHVlOiAnMycsIGNvcnJlY3Q6IGZhbHNlIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnMic6IFtcbiAgICAgICAgICAgICAgLi4uY3VycmVudE1vZGVsLmNob2ljZXNbJzInXSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ3N0YXInLCB2YWx1ZTogJzQnLCBjb3JyZWN0OiBmYWxzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmVtb3ZlQ2hvaWNlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7XG4gICAgICAgICAgcmVzcEFyZWFDaG9pY2VzOiB7XG4gICAgICAgICAgICAnMCc6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cgJywgdmFsdWU6ICcxJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCAnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnUmVtb3ZlcyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25SZW1vdmVDaG9pY2UoMCwgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgJzAnOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQgJywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25SZW1vdmVDaG9pY2UoMCwgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgJzAnOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCAnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblJlbW92ZUNob2ljZSgwLCAnMCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAnMCc6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU2VsZWN0Q2hvaWNlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7XG4gICAgICAgICAgcmVzcEFyZWFDaG9pY2VzOiB7XG4gICAgICAgICAgICAnMCc6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cgJywgdmFsdWU6ICcxJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCAnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnVXBkYXRlcyBjb3JyZWN0IGNob2ljZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uU2VsZWN0Q2hvaWNlKDAsIDEpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAnMCc6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY293ICcsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCAnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblNlbGVjdENob2ljZSgwLCAwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgJzAnOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQgJywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|