@pie-element/explicit-constructed-response 11.0.1 → 11.1.0-beta.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.
@@ -0,0 +1,470 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
+ var _react = require("@testing-library/react");
6
+ var _react2 = _interopRequireDefault(require("react"));
7
+ var _styles = require("@mui/material/styles");
8
+ var _main = require("../main");
9
+ var _defaults = _interopRequireDefault(require("../defaults"));
10
+ var _markupUtils = require("../markupUtils");
11
+ jest.mock('@pie-lib/config-ui', () => ({
12
+ choiceUtils: {
13
+ firstAvailableIndex: jest.fn()
14
+ },
15
+ settings: {
16
+ Panel: props => /*#__PURE__*/_react2.default.createElement("div", (0, _extends2.default)({
17
+ "data-testid": "settings-panel"
18
+ }, props)),
19
+ toggle: jest.fn(),
20
+ radio: jest.fn(),
21
+ dropdown: jest.fn()
22
+ },
23
+ layout: {
24
+ ConfigLayout: props => /*#__PURE__*/_react2.default.createElement("div", {
25
+ "data-testid": "config-layout"
26
+ }, props.children)
27
+ },
28
+ InputContainer: props => /*#__PURE__*/_react2.default.createElement("div", {
29
+ "data-testid": "input-container"
30
+ }, props.children)
31
+ }));
32
+ jest.mock('@pie-lib/editable-html-tip-tap', () => ({
33
+ __esModule: true,
34
+ default: ({
35
+ markup,
36
+ onChange
37
+ }) => /*#__PURE__*/_react2.default.createElement("div", {
38
+ "data-testid": "editable-html",
39
+ onClick: () => onChange && onChange('new value')
40
+ }, markup),
41
+ ALL_PLUGINS: []
42
+ }));
43
+ jest.mock('../ecr-toolbar', () => ({
44
+ __esModule: true,
45
+ default: props => /*#__PURE__*/_react2.default.createElement("div", (0, _extends2.default)({
46
+ "data-testid": "ecr-toolbar"
47
+ }, props))
48
+ }));
49
+ jest.mock('../alternateResponses', () => ({
50
+ __esModule: true,
51
+ default: props => /*#__PURE__*/_react2.default.createElement("div", (0, _extends2.default)({
52
+ "data-testid": "alternate-responses"
53
+ }, props))
54
+ }));
55
+ const theme = (0, _styles.createTheme)();
56
+ const model = {
57
+ markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
58
+ disabled: false,
59
+ choices: {
60
+ 0: [{
61
+ label: 'cow',
62
+ value: '0'
63
+ }, {
64
+ label: 'cattle',
65
+ value: '1'
66
+ }, {
67
+ label: 'calf',
68
+ value: '2'
69
+ }],
70
+ 1: [{
71
+ label: 'over',
72
+ value: '0'
73
+ }, {
74
+ label: 'past',
75
+ value: '1'
76
+ }, {
77
+ label: 'beyond',
78
+ value: '2'
79
+ }],
80
+ 2: [{
81
+ label: 'moon',
82
+ value: '0'
83
+ }]
84
+ },
85
+ maxLengthPerChoice: [6, 6, 4],
86
+ prompt: 'Complete the sentence'
87
+ };
88
+ const prepareModel = (model = {}) => {
89
+ const joinedObj = {
90
+ ..._defaults.default.model,
91
+ ...model
92
+ };
93
+ const slateMarkup = joinedObj.slateMarkup || (0, _markupUtils.createSlateMarkup)(joinedObj.markup, joinedObj.choices);
94
+ const processedMarkup = (0, _markupUtils.processMarkup)(slateMarkup);
95
+ return {
96
+ ...joinedObj,
97
+ slateMarkup,
98
+ markup: processedMarkup
99
+ };
100
+ };
101
+ describe('Main', () => {
102
+ let onModelChanged = jest.fn();
103
+ let onConfigurationChanged = jest.fn();
104
+ beforeEach(() => {
105
+ jest.clearAllMocks();
106
+ });
107
+ const renderMain = (extras = {}) => {
108
+ const defaults = {
109
+ onModelChanged,
110
+ onConfigurationChanged,
111
+ classes: {},
112
+ model: prepareModel({
113
+ ...model,
114
+ ...extras
115
+ }),
116
+ configuration: _defaults.default.configuration
117
+ };
118
+ const props = {
119
+ ...defaults
120
+ };
121
+ return (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_styles.ThemeProvider, {
122
+ theme: theme
123
+ }, /*#__PURE__*/_react2.default.createElement(_main.Main, props)));
124
+ };
125
+ describe('logic', () => {
126
+ describe('onModelChange', () => {
127
+ it('changes the model', () => {
128
+ const testInstance = new _main.Main({
129
+ onModelChanged,
130
+ onConfigurationChanged,
131
+ classes: {},
132
+ model: prepareModel(model),
133
+ configuration: _defaults.default.configuration
134
+ });
135
+ testInstance.onModelChange({
136
+ promptEnabled: false
137
+ });
138
+ expect(onModelChanged).toBeCalledWith({
139
+ ...prepareModel(model),
140
+ promptEnabled: false
141
+ });
142
+ });
143
+ });
144
+ describe('onPromptChanged', () => {
145
+ it('changes the prompt value', () => {
146
+ const testInstance = new _main.Main({
147
+ onModelChanged,
148
+ onConfigurationChanged,
149
+ classes: {},
150
+ model: prepareModel(model),
151
+ configuration: _defaults.default.configuration
152
+ });
153
+ testInstance.onPromptChanged('This is the new prompt');
154
+ expect(onModelChanged).toBeCalledWith({
155
+ ...prepareModel(model),
156
+ prompt: 'This is the new prompt'
157
+ });
158
+ });
159
+ });
160
+ describe('onRationaleChanged', () => {
161
+ it('changes the rationale value', () => {
162
+ const testInstance = new _main.Main({
163
+ onModelChanged,
164
+ onConfigurationChanged,
165
+ classes: {},
166
+ model: prepareModel(model),
167
+ configuration: _defaults.default.configuration
168
+ });
169
+ testInstance.onRationaleChanged('New Rationale');
170
+ expect(onModelChanged).toBeCalledWith({
171
+ ...prepareModel(model),
172
+ rationale: 'New Rationale'
173
+ });
174
+ });
175
+ });
176
+ describe('onTeacherInstructionsChanged', () => {
177
+ it('changes the teacher instructions value', () => {
178
+ const testInstance = new _main.Main({
179
+ onModelChanged,
180
+ onConfigurationChanged,
181
+ classes: {},
182
+ model: prepareModel(model),
183
+ configuration: _defaults.default.configuration
184
+ });
185
+ testInstance.onTeacherInstructionsChanged('New Teacher Instructions');
186
+ expect(onModelChanged).toBeCalledWith({
187
+ ...prepareModel(model),
188
+ teacherInstructions: 'New Teacher Instructions'
189
+ });
190
+ });
191
+ });
192
+ describe('onMarkupChanged', () => {
193
+ it('changes slate markup value', () => {
194
+ const testInstance = new _main.Main({
195
+ onModelChanged,
196
+ onConfigurationChanged,
197
+ classes: {},
198
+ model: prepareModel(model),
199
+ configuration: _defaults.default.configuration
200
+ });
201
+ const slateMarkup = '<p>The <span data-type=\\"explicit_constructed_response\\" data-index=\\"0\\" data-value=\\"cow\\"></span> jumped</p>';
202
+ testInstance.onMarkupChanged(slateMarkup);
203
+ expect(onModelChanged).toBeCalledWith({
204
+ ...prepareModel(model),
205
+ slateMarkup
206
+ });
207
+ });
208
+ });
209
+ describe('onResponsesChanged', () => {
210
+ it('changes choices and slateMarkup as well', () => {
211
+ const testInstance = new _main.Main({
212
+ onModelChanged,
213
+ onConfigurationChanged,
214
+ classes: {},
215
+ model: prepareModel(model),
216
+ configuration: _defaults.default.configuration
217
+ });
218
+ const newChoices = {
219
+ 0: [{
220
+ label: 'cow',
221
+ value: '0'
222
+ }, {
223
+ label: 'cattle',
224
+ value: '1'
225
+ }, {
226
+ label: 'calf',
227
+ value: '2'
228
+ }],
229
+ 1: [{
230
+ label: 'over',
231
+ value: '0'
232
+ }, {
233
+ label: 'past',
234
+ value: '1'
235
+ }, {
236
+ label: 'beyond',
237
+ value: '2'
238
+ }],
239
+ 2: [{
240
+ label: 'sun',
241
+ value: '0'
242
+ }]
243
+ };
244
+ testInstance.onResponsesChanged(newChoices);
245
+ expect(onModelChanged).toBeCalledWith({
246
+ ...prepareModel(model),
247
+ choices: newChoices
248
+ });
249
+ });
250
+ });
251
+ describe('onChangeResponse', () => {
252
+ it('with new area', () => {
253
+ const testInstance = new _main.Main({
254
+ onModelChanged,
255
+ onConfigurationChanged,
256
+ classes: {},
257
+ model: prepareModel(model),
258
+ configuration: _defaults.default.configuration
259
+ });
260
+ testInstance.onChangeResponse(3);
261
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
262
+ choices: expect.objectContaining({
263
+ ...model.choices,
264
+ 3: [{
265
+ label: '',
266
+ value: '0'
267
+ }]
268
+ }),
269
+ maxLengthPerChoice: expect.arrayContaining([6, 6, 4, 2])
270
+ }));
271
+ });
272
+ it('with existing area', () => {
273
+ const testInstance = new _main.Main({
274
+ onModelChanged,
275
+ onConfigurationChanged,
276
+ classes: {},
277
+ model: prepareModel(model),
278
+ configuration: _defaults.default.configuration
279
+ });
280
+ testInstance.onChangeResponse(1, 'under');
281
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
282
+ choices: expect.objectContaining({
283
+ 1: [{
284
+ label: 'under',
285
+ value: '0'
286
+ }, {
287
+ label: 'past',
288
+ value: '1'
289
+ }, {
290
+ label: 'beyond',
291
+ value: '2'
292
+ }]
293
+ })
294
+ }));
295
+ });
296
+ });
297
+ describe('onChange', () => {
298
+ // Note: The following tests for onChange test implementation details (setState callbacks)
299
+ // that are difficult to test with RTL without full component rendering.
300
+ // These should be tested through user interactions in integration tests instead.
301
+
302
+ it.skip('slateMarkup and choices are updated with new area without data-value', () => {
303
+ jest.useFakeTimers();
304
+ const testInstance = new _main.Main({
305
+ onModelChanged,
306
+ onConfigurationChanged,
307
+ classes: {},
308
+ model: prepareModel({
309
+ choices: {
310
+ 0: [{
311
+ label: 'cow',
312
+ value: '0'
313
+ }, {
314
+ label: 'cattle',
315
+ value: '1'
316
+ }, {
317
+ label: 'calf',
318
+ value: '2'
319
+ }],
320
+ 1: [{
321
+ label: 'over',
322
+ value: '0'
323
+ }, {
324
+ label: 'past',
325
+ value: '1'
326
+ }, {
327
+ label: 'beyond',
328
+ value: '2'
329
+ }],
330
+ 2: [{
331
+ label: 'moon',
332
+ value: '0'
333
+ }]
334
+ },
335
+ maxLengthPerChoice: [6, 6, 4, 2]
336
+ }),
337
+ configuration: _defaults.default.configuration
338
+ });
339
+ const newMarkup = `<p>The <span data-type="explicit_constructed_response" data-index="0" data-value="cow"></span> jumped <span data-type="explicit_constructed_response" data-index="1" data-value="over"></span> the <span data-type="explicit_constructed_response" data-index="2" data-value="moon"></span>and <span data-type="explicit_constructed_response" data-index="3"></span></p>`;
340
+ testInstance.onChange(newMarkup);
341
+
342
+ // Wait for setState callback
343
+ jest.runAllTimers();
344
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
345
+ slateMarkup: newMarkup,
346
+ choices: expect.objectContaining({
347
+ 3: [{
348
+ label: '',
349
+ value: '0'
350
+ }]
351
+ })
352
+ }));
353
+ jest.useRealTimers();
354
+ });
355
+ it.skip('slateMarkup and choices are updated with new area with data-value', () => {
356
+ jest.useFakeTimers();
357
+ const testInstance = new _main.Main({
358
+ onModelChanged,
359
+ onConfigurationChanged,
360
+ classes: {},
361
+ model: prepareModel({
362
+ choices: {
363
+ 0: [{
364
+ label: 'cow',
365
+ value: '0'
366
+ }, {
367
+ label: 'cattle',
368
+ value: '1'
369
+ }, {
370
+ label: 'calf',
371
+ value: '2'
372
+ }],
373
+ 1: [{
374
+ label: 'over',
375
+ value: '0'
376
+ }, {
377
+ label: 'past',
378
+ value: '1'
379
+ }, {
380
+ label: 'beyond',
381
+ value: '2'
382
+ }],
383
+ 2: [{
384
+ label: 'moon',
385
+ value: '0'
386
+ }]
387
+ },
388
+ maxLengthPerChoice: [6, 6, 4, 2]
389
+ }),
390
+ configuration: _defaults.default.configuration
391
+ });
392
+ const newMarkup = `<p>The <span data-type="explicit_constructed_response" data-index="0" data-value="cow"></span> jumped <span data-type="explicit_constructed_response" data-index="1" data-value="over"></span> the <span data-type="explicit_constructed_response" data-index="2" data-value="moon"></span>and <span data-type="explicit_constructed_response" data-index="3" data-value="test"></span></p>`;
393
+ testInstance.onChange(newMarkup);
394
+
395
+ // Wait for setState callback
396
+ jest.runAllTimers();
397
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
398
+ slateMarkup: newMarkup,
399
+ choices: expect.objectContaining({
400
+ 3: [{
401
+ label: 'test',
402
+ value: '0'
403
+ }]
404
+ })
405
+ }));
406
+ jest.useRealTimers();
407
+ });
408
+ it.skip('slateMarkup and choices are updated with changed data-value', () => {
409
+ jest.useFakeTimers();
410
+ const testInstance = new _main.Main({
411
+ onModelChanged,
412
+ onConfigurationChanged,
413
+ classes: {},
414
+ model: prepareModel({
415
+ choices: {
416
+ 0: [{
417
+ label: 'cow',
418
+ value: '0'
419
+ }, {
420
+ label: 'cattle',
421
+ value: '1'
422
+ }, {
423
+ label: 'calf',
424
+ value: '2'
425
+ }],
426
+ 1: [{
427
+ label: 'over',
428
+ value: '0'
429
+ }, {
430
+ label: 'past',
431
+ value: '1'
432
+ }, {
433
+ label: 'beyond',
434
+ value: '2'
435
+ }],
436
+ 2: [{
437
+ label: 'moon',
438
+ value: '0'
439
+ }]
440
+ },
441
+ maxLengthPerChoice: [6, 6, 4, 2]
442
+ }),
443
+ configuration: _defaults.default.configuration
444
+ });
445
+ const newMarkup = `<p>The <span data-type="explicit_constructed_response" data-index="0" data-value="rabbit"></span> jumped <span data-type="explicit_constructed_response" data-index="1" data-value="over"></span> the <span data-type="explicit_constructed_response" data-index="2" data-value="moon"></span>and <span data-type="explicit_constructed_response" data-index="3" data-value="test"></span></p>`;
446
+ testInstance.onChange(newMarkup);
447
+
448
+ // Wait for setState callback
449
+ jest.runAllTimers();
450
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
451
+ slateMarkup: newMarkup,
452
+ choices: expect.objectContaining({
453
+ 0: [{
454
+ label: 'rabbit',
455
+ value: '0'
456
+ }, {
457
+ label: 'cattle',
458
+ value: '1'
459
+ }, {
460
+ label: 'calf',
461
+ value: '2'
462
+ }]
463
+ })
464
+ }));
465
+ jest.useRealTimers();
466
+ });
467
+ });
468
+ });
469
+ });
470
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVzIiwiX21haW4iLCJfZGVmYXVsdHMiLCJfbWFya3VwVXRpbHMiLCJqZXN0IiwibW9jayIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsImZuIiwic2V0dGluZ3MiLCJQYW5lbCIsInByb3BzIiwiZGVmYXVsdCIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJ0b2dnbGUiLCJyYWRpbyIsImRyb3Bkb3duIiwibGF5b3V0IiwiQ29uZmlnTGF5b3V0IiwiY2hpbGRyZW4iLCJJbnB1dENvbnRhaW5lciIsIl9fZXNNb2R1bGUiLCJtYXJrdXAiLCJvbkNoYW5nZSIsIm9uQ2xpY2siLCJBTExfUExVR0lOUyIsInRoZW1lIiwiY3JlYXRlVGhlbWUiLCJtb2RlbCIsImRpc2FibGVkIiwiY2hvaWNlcyIsImxhYmVsIiwidmFsdWUiLCJtYXhMZW5ndGhQZXJDaG9pY2UiLCJwcm9tcHQiLCJwcmVwYXJlTW9kZWwiLCJqb2luZWRPYmoiLCJzZW5zaWJsZURlZmF1bHRzIiwic2xhdGVNYXJrdXAiLCJjcmVhdGVTbGF0ZU1hcmt1cCIsInByb2Nlc3NlZE1hcmt1cCIsInByb2Nlc3NNYXJrdXAiLCJkZXNjcmliZSIsIm9uTW9kZWxDaGFuZ2VkIiwib25Db25maWd1cmF0aW9uQ2hhbmdlZCIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwicmVuZGVyTWFpbiIsImV4dHJhcyIsImRlZmF1bHRzIiwiY2xhc3NlcyIsImNvbmZpZ3VyYXRpb24iLCJyZW5kZXIiLCJUaGVtZVByb3ZpZGVyIiwiTWFpbiIsIml0IiwidGVzdEluc3RhbmNlIiwib25Nb2RlbENoYW5nZSIsInByb21wdEVuYWJsZWQiLCJleHBlY3QiLCJ0b0JlQ2FsbGVkV2l0aCIsIm9uUHJvbXB0Q2hhbmdlZCIsIm9uUmF0aW9uYWxlQ2hhbmdlZCIsInJhdGlvbmFsZSIsIm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwib25NYXJrdXBDaGFuZ2VkIiwibmV3Q2hvaWNlcyIsIm9uUmVzcG9uc2VzQ2hhbmdlZCIsIm9uQ2hhbmdlUmVzcG9uc2UiLCJvYmplY3RDb250YWluaW5nIiwiYXJyYXlDb250YWluaW5nIiwic2tpcCIsInVzZUZha2VUaW1lcnMiLCJuZXdNYXJrdXAiLCJydW5BbGxUaW1lcnMiLCJ1c2VSZWFsVGltZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYWluLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRoZW1lUHJvdmlkZXIsIGNyZWF0ZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5pbXBvcnQgeyBNYWluIH0gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgc2Vuc2libGVEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5pbXBvcnQgeyBjcmVhdGVTbGF0ZU1hcmt1cCwgcHJvY2Vzc01hcmt1cCB9IGZyb20gJy4uL21hcmt1cFV0aWxzJztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9jb25maWctdWknLCAoKSA9PiAoe1xuICBjaG9pY2VVdGlsczoge1xuICAgIGZpcnN0QXZhaWxhYmxlSW5kZXg6IGplc3QuZm4oKSxcbiAgfSxcbiAgc2V0dGluZ3M6IHtcbiAgICBQYW5lbDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwic2V0dGluZ3MtcGFuZWxcIiB7Li4ucHJvcHN9IC8+LFxuICAgIHRvZ2dsZTogamVzdC5mbigpLFxuICAgIHJhZGlvOiBqZXN0LmZuKCksXG4gICAgZHJvcGRvd246IGplc3QuZm4oKSxcbiAgfSxcbiAgbGF5b3V0OiB7XG4gICAgQ29uZmlnTGF5b3V0OiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJjb25maWctbGF5b3V0XCI+e3Byb3BzLmNoaWxkcmVufTwvZGl2PixcbiAgfSxcbiAgSW5wdXRDb250YWluZXI6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImlucHV0LWNvbnRhaW5lclwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvZWRpdGFibGUtaHRtbC10aXAtdGFwJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogKHsgbWFya3VwLCBvbkNoYW5nZSB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImVkaXRhYmxlLWh0bWxcIiBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSAmJiBvbkNoYW5nZSgnbmV3IHZhbHVlJyl9PlxuICAgICAge21hcmt1cH1cbiAgICA8L2Rpdj5cbiAgKSxcbiAgQUxMX1BMVUdJTlM6IFtdLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL2Vjci10b29sYmFyJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZWNyLXRvb2xiYXJcIiB7Li4ucHJvcHN9IC8+LFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL2FsdGVybmF0ZVJlc3BvbnNlcycsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImFsdGVybmF0ZS1yZXNwb25zZXNcIiB7Li4ucHJvcHN9IC8+LFxufSkpO1xuXG5jb25zdCB0aGVtZSA9IGNyZWF0ZVRoZW1lKCk7XG5cbmNvbnN0IG1vZGVsID0ge1xuICBtYXJrdXA6ICc8cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD4nLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGNob2ljZXM6IHtcbiAgICAwOiBbXG4gICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgIF0sXG4gICAgMTogW1xuICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScgfSxcbiAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgXSxcbiAgICAyOiBbeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnIH1dLFxuICB9LFxuICBtYXhMZW5ndGhQZXJDaG9pY2U6IFs2LCA2LCA0XSxcbiAgcHJvbXB0OiAnQ29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbn07XG5cbmNvbnN0IHByZXBhcmVNb2RlbCA9IChtb2RlbCA9IHt9KSA9PiB7XG4gIGNvbnN0IGpvaW5lZE9iaiA9IHtcbiAgICAuLi5zZW5zaWJsZURlZmF1bHRzLm1vZGVsLFxuICAgIC4uLm1vZGVsLFxuICB9O1xuICBjb25zdCBzbGF0ZU1hcmt1cCA9IGpvaW5lZE9iai5zbGF0ZU1hcmt1cCB8fCBjcmVhdGVTbGF0ZU1hcmt1cChqb2luZWRPYmoubWFya3VwLCBqb2luZWRPYmouY2hvaWNlcyk7XG4gIGNvbnN0IHByb2Nlc3NlZE1hcmt1cCA9IHByb2Nlc3NNYXJrdXAoc2xhdGVNYXJrdXApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uam9pbmVkT2JqLFxuICAgIHNsYXRlTWFya3VwLFxuICAgIG1hcmt1cDogcHJvY2Vzc2VkTWFya3VwLFxuICB9O1xufTtcblxuZGVzY3JpYmUoJ01haW4nLCAoKSA9PiB7XG4gIGxldCBvbk1vZGVsQ2hhbmdlZCA9IGplc3QuZm4oKTtcbiAgbGV0IG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlck1haW4gPSAoZXh0cmFzID0ge30pID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5leHRyYXMsXG4gICAgICB9KSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cyB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcihcbiAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxNYWluIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj5cbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnb25Nb2RlbENoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSBtb2RlbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gbmV3IE1haW4oe1xuICAgICAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICAgICAgY2xhc3Nlczoge30sXG4gICAgICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogc2Vuc2libGVEZWZhdWx0cy5jb25maWd1cmF0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25Nb2RlbENoYW5nZSh7IHByb21wdEVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Qcm9tcHRDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIHByb21wdCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gbmV3IE1haW4oe1xuICAgICAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICAgICAgY2xhc3Nlczoge30sXG4gICAgICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogc2Vuc2libGVEZWZhdWx0cy5jb25maWd1cmF0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25Qcm9tcHRDaGFuZ2VkKCdUaGlzIGlzIHRoZSBuZXcgcHJvbXB0Jyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBwcm9tcHQ6ICdUaGlzIGlzIHRoZSBuZXcgcHJvbXB0JyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblJhdGlvbmFsZUNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgcmF0aW9uYWxlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBuZXcgTWFpbih7XG4gICAgICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBtb2RlbDogcHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBzZW5zaWJsZURlZmF1bHRzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vblJhdGlvbmFsZUNoYW5nZWQoJ05ldyBSYXRpb25hbGUnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ05ldyBSYXRpb25hbGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgdGVhY2hlciBpbnN0cnVjdGlvbnMgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IG5ldyBNYWluKHtcbiAgICAgICAgICBvbk1vZGVsQ2hhbmdlZCxcbiAgICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkLFxuICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGVzdEluc3RhbmNlLm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQoJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25NYXJrdXBDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgc2xhdGUgbWFya3VwIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBuZXcgTWFpbih7XG4gICAgICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBtb2RlbDogcHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBzZW5zaWJsZURlZmF1bHRzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNsYXRlTWFya3VwID1cbiAgICAgICAgICAnPHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cXFxcXCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVxcXFxcIiBkYXRhLWluZGV4PVxcXFxcIjBcXFxcXCIgZGF0YS12YWx1ZT1cXFxcXCJjb3dcXFxcXCI+PC9zcGFuPiBqdW1wZWQ8L3A+JztcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25NYXJrdXBDaGFuZ2VkKHNsYXRlTWFya3VwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHNsYXRlTWFya3VwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmVzcG9uc2VzQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIGNob2ljZXMgYW5kIHNsYXRlTWFya3VwIGFzIHdlbGwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IG5ldyBNYWluKHtcbiAgICAgICAgICBvbk1vZGVsQ2hhbmdlZCxcbiAgICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkLFxuICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAwOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgMTogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAyOiBbeyBsYWJlbDogJ3N1bicsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGVzdEluc3RhbmNlLm9uUmVzcG9uc2VzQ2hhbmdlZChuZXdDaG9pY2VzKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNob2ljZXM6IG5ld0Nob2ljZXMsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaGFuZ2VSZXNwb25zZScsICgpID0+IHtcbiAgICAgIGl0KCd3aXRoIG5ldyBhcmVhJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBuZXcgTWFpbih7XG4gICAgICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBtb2RlbDogcHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBzZW5zaWJsZURlZmF1bHRzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vbkNoYW5nZVJlc3BvbnNlKDMpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgICAgICAzOiBbeyBsYWJlbDogJycsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbNiwgNiwgNCwgMl0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd3aXRoIGV4aXN0aW5nIGFyZWEnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IG5ldyBNYWluKHtcbiAgICAgICAgICBvbk1vZGVsQ2hhbmdlZCxcbiAgICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkLFxuICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGVzdEluc3RhbmNlLm9uQ2hhbmdlUmVzcG9uc2UoMSwgJ3VuZGVyJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBjaG9pY2VzOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAndW5kZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ3Bhc3QnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIHRlc3RzIGZvciBvbkNoYW5nZSB0ZXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMgKHNldFN0YXRlIGNhbGxiYWNrcylcbiAgICAgIC8vIHRoYXQgYXJlIGRpZmZpY3VsdCB0byB0ZXN0IHdpdGggUlRMIHdpdGhvdXQgZnVsbCBjb21wb25lbnQgcmVuZGVyaW5nLlxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHRlc3RlZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb25zIGluIGludGVncmF0aW9uIHRlc3RzIGluc3RlYWQuXG5cbiAgICAgIGl0LnNraXAoJ3NsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkIHdpdGggbmV3IGFyZWEgd2l0aG91dCBkYXRhLXZhbHVlJywgKCkgPT4ge1xuICAgICAgICBqZXN0LnVzZUZha2VUaW1lcnMoKTtcblxuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBuZXcgTWFpbih7XG4gICAgICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBtb2RlbDogcHJlcGFyZU1vZGVsKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2FsZicsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMTogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdvdmVyJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbNiwgNiwgNCwgMl0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogc2Vuc2libGVEZWZhdWx0cy5jb25maWd1cmF0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293XCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uXCI+PC9zcGFuPmFuZCA8c3BhbiBkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiIGRhdGEtaW5kZXg9XCIzXCI+PC9zcGFuPjwvcD5gO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHNldFN0YXRlIGNhbGxiYWNrXG4gICAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBzbGF0ZU1hcmt1cDogbmV3TWFya3VwLFxuICAgICAgICAgICAgY2hvaWNlczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAzOiBbeyBsYWJlbDogJycsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdC5za2lwKCdzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCB3aXRoIG5ldyBhcmVhIHdpdGggZGF0YS12YWx1ZScsICgpID0+IHtcbiAgICAgICAgamVzdC51c2VGYWtlVGltZXJzKCk7XG5cbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gbmV3IE1haW4oe1xuICAgICAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICAgICAgY2xhc3Nlczoge30sXG4gICAgICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXR0bGUnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhbGYnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnb3ZlcicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnYmV5b25kJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAyOiBbeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzYsIDYsIDQsIDJdLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvd1wiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlclwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vblwiPjwvc3Bhbj5hbmQgPHNwYW4gZGF0YS10eXBlPVwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcIiBkYXRhLWluZGV4PVwiM1wiIGRhdGEtdmFsdWU9XCJ0ZXN0XCI+PC9zcGFuPjwvcD5gO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHNldFN0YXRlIGNhbGxiYWNrXG4gICAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBzbGF0ZU1hcmt1cDogbmV3TWFya3VwLFxuICAgICAgICAgICAgY2hvaWNlczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAzOiBbeyBsYWJlbDogJ3Rlc3QnLCB2YWx1ZTogJzAnIH1dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgamVzdC51c2VSZWFsVGltZXJzKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQuc2tpcCgnc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQgd2l0aCBjaGFuZ2VkIGRhdGEtdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGplc3QudXNlRmFrZVRpbWVycygpO1xuXG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IG5ldyBNYWluKHtcbiAgICAgICAgICBvbk1vZGVsQ2hhbmdlZCxcbiAgICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkLFxuICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0dGxlJywgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAxOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ3Bhc3QnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMjogW3sgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcwJyB9XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFs2LCA2LCA0LCAyXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBzZW5zaWJsZURlZmF1bHRzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJyYWJiaXRcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXJcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb25cIj48L3NwYW4+YW5kIDxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjNcIiBkYXRhLXZhbHVlPVwidGVzdFwiPjwvc3Bhbj48L3A+YDtcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICAvLyBXYWl0IGZvciBzZXRTdGF0ZSBjYWxsYmFja1xuICAgICAgICBqZXN0LnJ1bkFsbFRpbWVycygpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgc2xhdGVNYXJrdXA6IG5ld01hcmt1cCxcbiAgICAgICAgICAgIGNob2ljZXM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdyYWJiaXQnLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2FsZicsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxLQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFFQU8sSUFBSSxDQUFDQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUs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
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _markupUtils = require("../markupUtils");
4
+ describe('markupUtils', () => {
5
+ describe('removeUnwantedCharacters', () => {
6
+ it('should remove \\t and \\n characters', () => {
7
+ expect((0, _markupUtils.removeUnwantedCharacters)('<div>foo\t\nbar</div>')).toEqual('<div>foobar</div>');
8
+ });
9
+ it('should remove \\t and \\n characters', () => {
10
+ expect((0, _markupUtils.removeUnwantedCharacters)('<div>foo\\t\\nbar</div>')).toEqual('<div>foobar</div>');
11
+ });
12
+ it('should replace \\" with "', () => {
13
+ expect((0, _markupUtils.removeUnwantedCharacters)('<div>"foo bar"</div>')).toEqual('<div>"foo bar"</div>');
14
+ });
15
+ it('should replace \\/ with /', () => {
16
+ expect((0, _markupUtils.removeUnwantedCharacters)('<div>foo/bar</div>')).toEqual('<div>foo/bar</div>');
17
+ });
18
+ it('should not remove \\t character which has latex like \\times', () => {
19
+ expect((0, _markupUtils.removeUnwantedCharacters)('<div><span data-latex="" data-raw="3\\times3\\div2">3\\times3\\div2</span></div>')).toEqual('<div><span data-latex="" data-raw="3\\times3\\div2">3\\times3\\div2</span></div>');
20
+ });
21
+ });
22
+ describe('processMarkup', () => {
23
+ it('should process slate markup and replace {{number}} with a ecr element dom', () => {
24
+ const markup = ['<div>', '<span data-type="explicit_constructed_response"></span>', '<span data-type="explicit_constructed_response"></span>', '</div>'].join('');
25
+ const processed = (0, _markupUtils.processMarkup)(markup);
26
+ expect(processed).toEqual(['<div>', '{{0}}', '{{1}}', '</div>'].join(''));
27
+ });
28
+ });
29
+ describe('createSlateMarkup', () => {
30
+ it('should handle the case when markup is empty', () => {
31
+ expect((0, _markupUtils.createSlateMarkup)('', {})).toEqual('');
32
+ });
33
+ it('should replace {{number}} with the appropriate element', () => {
34
+ const markup = ['<div>', '{{0}}', '</div>'].join('');
35
+ const choices = {
36
+ 0: [{
37
+ label: 'foobar'
38
+ }]
39
+ };
40
+ const slateMarkup = (0, _markupUtils.createSlateMarkup)(markup, choices);
41
+ expect(slateMarkup).toEqual(['<div>', '<span data-type="explicit_constructed_response" data-index="0" data-value="foobar"></span>', '</div>'].join(''));
42
+ });
43
+ it('should replace {{number}} with the appropriate element having the value escaped', () => {
44
+ const markup = ['<div>', '{{0}}', '</div>'].join('');
45
+ const choices = {
46
+ 0: [{
47
+ label: 'foo&bar'
48
+ }]
49
+ };
50
+ const slateMarkup = (0, _markupUtils.createSlateMarkup)(markup, choices);
51
+ expect(slateMarkup).toEqual(['<div>', '<span data-type="explicit_constructed_response" data-index="0" data-value="foo&amp;bar"></span>', '</div>'].join(''));
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWFya3VwVXRpbHMiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInJlbW92ZVVud2FudGVkQ2hhcmFjdGVycyIsInRvRXF1YWwiLCJtYXJrdXAiLCJqb2luIiwicHJvY2Vzc2VkIiwicHJvY2Vzc01hcmt1cCIsImNyZWF0ZVNsYXRlTWFya3VwIiwiY2hvaWNlcyIsImxhYmVsIiwic2xhdGVNYXJrdXAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL21hcmt1cFV0aWxzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNsYXRlTWFya3VwLCBwcm9jZXNzTWFya3VwLCByZW1vdmVVbndhbnRlZENoYXJhY3RlcnMgfSBmcm9tICcuLi9tYXJrdXBVdGlscyc7XG5cbmRlc2NyaWJlKCdtYXJrdXBVdGlscycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3JlbW92ZVVud2FudGVkQ2hhcmFjdGVycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbW92ZSBcXFxcdCBhbmQgXFxcXG4gY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVVbndhbnRlZENoYXJhY3RlcnMoJzxkaXY+Zm9vXFx0XFxuYmFyPC9kaXY+JykpLnRvRXF1YWwoJzxkaXY+Zm9vYmFyPC9kaXY+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbW92ZSBcXFxcdCBhbmQgXFxcXG4gY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVVbndhbnRlZENoYXJhY3RlcnMoJzxkaXY+Zm9vXFxcXHRcXFxcbmJhcjwvZGl2PicpKS50b0VxdWFsKCc8ZGl2PmZvb2JhcjwvZGl2PicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXBsYWNlIFxcXFxcIiB3aXRoIFwiJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVud2FudGVkQ2hhcmFjdGVycygnPGRpdj5cImZvbyBiYXJcIjwvZGl2PicpKS50b0VxdWFsKCc8ZGl2PlwiZm9vIGJhclwiPC9kaXY+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlcGxhY2UgXFxcXC8gd2l0aCAvJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVud2FudGVkQ2hhcmFjdGVycygnPGRpdj5mb28vYmFyPC9kaXY+JykpLnRvRXF1YWwoJzxkaXY+Zm9vL2JhcjwvZGl2PicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVtb3ZlIFxcXFx0IGNoYXJhY3RlciB3aGljaCBoYXMgbGF0ZXggbGlrZSBcXFxcdGltZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlbW92ZVVud2FudGVkQ2hhcmFjdGVycygnPGRpdj48c3BhbiBkYXRhLWxhdGV4PVwiXCIgZGF0YS1yYXc9XCIzXFxcXHRpbWVzM1xcXFxkaXYyXCI+M1xcXFx0aW1lczNcXFxcZGl2Mjwvc3Bhbj48L2Rpdj4nKSxcbiAgICAgICkudG9FcXVhbCgnPGRpdj48c3BhbiBkYXRhLWxhdGV4PVwiXCIgZGF0YS1yYXc9XCIzXFxcXHRpbWVzM1xcXFxkaXYyXCI+M1xcXFx0aW1lczNcXFxcZGl2Mjwvc3Bhbj48L2Rpdj4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb2Nlc3NNYXJrdXAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIHNsYXRlIG1hcmt1cCBhbmQgcmVwbGFjZSB7e251bWJlcn19IHdpdGggYSBlY3IgZWxlbWVudCBkb20nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrdXAgPSBbXG4gICAgICAgICc8ZGl2PicsXG4gICAgICAgICc8c3BhbiBkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiPjwvc3Bhbj4nLFxuICAgICAgICAnPHNwYW4gZGF0YS10eXBlPVwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcIj48L3NwYW4+JyxcbiAgICAgICAgJzwvZGl2PicsXG4gICAgICBdLmpvaW4oJycpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcHJvY2Vzc01hcmt1cChtYXJrdXApO1xuXG4gICAgICBleHBlY3QocHJvY2Vzc2VkKS50b0VxdWFsKFsnPGRpdj4nLCAne3swfX0nLCAne3sxfX0nLCAnPC9kaXY+J10uam9pbignJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlU2xhdGVNYXJrdXAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBtYXJrdXAgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY3JlYXRlU2xhdGVNYXJrdXAoJycsIHt9KSkudG9FcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlcGxhY2Uge3tudW1iZXJ9fSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3VwID0gWyc8ZGl2PicsICd7ezB9fScsICc8L2Rpdj4nXS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSB7XG4gICAgICAgIDA6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ2Zvb2JhcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzbGF0ZU1hcmt1cCA9IGNyZWF0ZVNsYXRlTWFya3VwKG1hcmt1cCwgY2hvaWNlcyk7XG5cbiAgICAgIGV4cGVjdChzbGF0ZU1hcmt1cCkudG9FcXVhbChcbiAgICAgICAgW1xuICAgICAgICAgICc8ZGl2PicsXG4gICAgICAgICAgJzxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiZm9vYmFyXCI+PC9zcGFuPicsXG4gICAgICAgICAgJzwvZGl2PicsXG4gICAgICAgIF0uam9pbignJyksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXBsYWNlIHt7bnVtYmVyfX0gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZWxlbWVudCBoYXZpbmcgdGhlIHZhbHVlIGVzY2FwZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrdXAgPSBbJzxkaXY+JywgJ3t7MH19JywgJzwvZGl2PiddLmpvaW4oJycpO1xuICAgICAgY29uc3QgY2hvaWNlcyA9IHtcbiAgICAgICAgMDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnZm9vJmJhcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzbGF0ZU1hcmt1cCA9IGNyZWF0ZVNsYXRlTWFya3VwKG1hcmt1cCwgY2hvaWNlcyk7XG5cbiAgICAgIGV4cGVjdChzbGF0ZU1hcmt1cCkudG9FcXVhbChcbiAgICAgICAgW1xuICAgICAgICAgICc8ZGl2PicsXG4gICAgICAgICAgJzxzcGFuIGRhdGEtdHlwZT1cImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiZm9vJmFtcDtiYXJcIj48L3NwYW4+JyxcbiAgICAgICAgICAnPC9kaXY+JyxcbiAgICAgICAgXS5qb2luKCcnKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBRUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTTtFQUM1QkEsUUFBUSxDQUFDLDBCQUEwQixFQUFFLE1BQU07SUFDekNDLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNO01BQy9DQyxNQUFNLENBQUMsSUFBQUMscUNBQXdCLEVBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDeEYsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNO01BQy9DQyxNQUFNLENBQUMsSUFBQUMscUNBQXdC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