@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.
- package/CHANGELOG.md +6 -0
- package/configure/CHANGELOG.md +6 -0
- package/configure/lib/__tests__/alternateResponses.test.js +503 -0
- package/configure/lib/__tests__/alternateSection.test.js +372 -0
- package/configure/lib/__tests__/ecr-toolbar.test.js +214 -0
- package/configure/lib/__tests__/main.test.js +470 -0
- package/configure/lib/__tests__/markupUtils.test.js +55 -0
- package/configure/lib/__tests__/utils.test.js +62 -0
- package/configure/lib/alternateResponses.js +1 -1
- package/configure/lib/alternateSection.js +1 -1
- package/configure/lib/defaults.js +1 -1
- package/configure/lib/ecr-toolbar.js +1 -1
- package/configure/lib/index.js +1 -1
- package/configure/lib/main.js +1 -1
- package/configure/lib/markupUtils.js +1 -1
- package/configure/lib/utils.js +1 -1
- package/configure/package.json +3 -3
- package/controller/CHANGELOG.md +6 -0
- package/controller/lib/__tests__/index.spec.js +30 -0
- package/controller/lib/__tests__/index.test.js +950 -0
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +1 -1
- package/controller/package.json +3 -3
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/main.test.js +166 -0
- package/lib/index.js +1 -1
- package/lib/main.js +1 -1
- package/lib/print.js +1 -1
- package/module/configure.js +1 -1
- package/module/element.js +1 -1
- package/module/index.html +1 -1
- package/module/manifest.json +4 -4
- package/module/print.html +1 -1
- package/module/print.js +1 -1
- package/package.json +7 -7
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,950 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _index = require("../index");
|
|
5
|
+
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
6
|
+
jest.mock('@pie-lib/controller-utils', () => ({
|
|
7
|
+
getShuffledChoices: (choices, session, updateSession, key) => {
|
|
8
|
+
const currentShuffled = ((session || {}).shuffledValues || []).filter(v => v);
|
|
9
|
+
if (session && !currentShuffled.length && updateSession && typeof updateSession === 'function') {
|
|
10
|
+
updateSession();
|
|
11
|
+
}
|
|
12
|
+
return choices;
|
|
13
|
+
},
|
|
14
|
+
partialScoring: {
|
|
15
|
+
enabled: (config, env) => {
|
|
16
|
+
config = config || {};
|
|
17
|
+
env = env || {};
|
|
18
|
+
if (config.partialScoring === false) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (env.partialScoring === false) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
const choice = (l, v) => ({
|
|
29
|
+
label: l,
|
|
30
|
+
value: v
|
|
31
|
+
});
|
|
32
|
+
const choices = {
|
|
33
|
+
0: [choice('cow', '0'), choice('cattle', '1'), choice('calf', '2')],
|
|
34
|
+
1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
|
|
35
|
+
2: [choice('moon', '0')]
|
|
36
|
+
};
|
|
37
|
+
const question = {
|
|
38
|
+
markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
|
|
39
|
+
disabled: false,
|
|
40
|
+
choices,
|
|
41
|
+
prompt: 'Complete the sentence',
|
|
42
|
+
note: 'The answer shown above is the most common correct answer for this item.',
|
|
43
|
+
language: 'english',
|
|
44
|
+
maxLengthPerChoiceEnabled: true,
|
|
45
|
+
playerSpellCheckEnabled: true,
|
|
46
|
+
displayType: 'block'
|
|
47
|
+
};
|
|
48
|
+
describe('controller', () => {
|
|
49
|
+
describe('model', () => {
|
|
50
|
+
let q, env;
|
|
51
|
+
it('output when session is defined', async () => {
|
|
52
|
+
const m = await (0, _index.model)(question, {
|
|
53
|
+
value: {
|
|
54
|
+
0: 'cow',
|
|
55
|
+
1: 'over',
|
|
56
|
+
2: 'moon'
|
|
57
|
+
}
|
|
58
|
+
}, {
|
|
59
|
+
mode: 'evaluate'
|
|
60
|
+
});
|
|
61
|
+
expect(m).toEqual(expect.objectContaining({
|
|
62
|
+
feedback: {
|
|
63
|
+
0: 'correct',
|
|
64
|
+
1: 'correct',
|
|
65
|
+
2: 'correct'
|
|
66
|
+
},
|
|
67
|
+
responseCorrect: true
|
|
68
|
+
}));
|
|
69
|
+
});
|
|
70
|
+
const returnModel = session => {
|
|
71
|
+
it(`output when session is ${JSON.stringify(session)}`, async () => {
|
|
72
|
+
const m = await (0, _index.model)(question, session, {
|
|
73
|
+
mode: 'evaluate'
|
|
74
|
+
});
|
|
75
|
+
expect(m).toEqual(expect.objectContaining({
|
|
76
|
+
feedback: {
|
|
77
|
+
0: 'incorrect',
|
|
78
|
+
1: 'incorrect',
|
|
79
|
+
2: 'incorrect'
|
|
80
|
+
},
|
|
81
|
+
responseCorrect: false
|
|
82
|
+
}));
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
returnModel(undefined);
|
|
86
|
+
returnModel(null);
|
|
87
|
+
returnModel({});
|
|
88
|
+
const assertGather = (label, extra, session, expected) => {
|
|
89
|
+
it(`'mode: gather, ${label}'`, async () => {
|
|
90
|
+
q = {
|
|
91
|
+
...question,
|
|
92
|
+
teacherInstructions: 'Teacher Instructions',
|
|
93
|
+
rationale: 'Rationale',
|
|
94
|
+
...extra
|
|
95
|
+
};
|
|
96
|
+
env = {
|
|
97
|
+
mode: 'gather'
|
|
98
|
+
};
|
|
99
|
+
const result = await (0, _index.model)(q, {
|
|
100
|
+
id: '1',
|
|
101
|
+
element: 'explicit-constructed-response',
|
|
102
|
+
...session
|
|
103
|
+
}, env);
|
|
104
|
+
expect(result).toEqual({
|
|
105
|
+
...question,
|
|
106
|
+
disabled: false,
|
|
107
|
+
feedback: {},
|
|
108
|
+
responseCorrect: undefined,
|
|
109
|
+
maxLengthPerChoice: [10, 10, 7],
|
|
110
|
+
...env,
|
|
111
|
+
...expected
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
|
|
116
|
+
rationale: _defaults.default.rationale,
|
|
117
|
+
showNote: true,
|
|
118
|
+
teacherInstructions: _defaults.default.teacherInstructions
|
|
119
|
+
});
|
|
120
|
+
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
121
|
+
promptEnabled: false,
|
|
122
|
+
rationaleEnabled: false,
|
|
123
|
+
teacherInstructionsEnabled: false,
|
|
124
|
+
studentInstructionsEnabled: false
|
|
125
|
+
}, {}, {
|
|
126
|
+
prompt: _defaults.default.prompt,
|
|
127
|
+
rationale: _defaults.default.rationale,
|
|
128
|
+
showNote: true,
|
|
129
|
+
teacherInstructions: _defaults.default.teacherInstructions
|
|
130
|
+
});
|
|
131
|
+
const assertView = (label, extra, session, expected) => {
|
|
132
|
+
it(`'mode: view, ${label}'`, async () => {
|
|
133
|
+
q = {
|
|
134
|
+
...question,
|
|
135
|
+
teacherInstructions: 'Teacher Instructions',
|
|
136
|
+
rationale: 'Rationale',
|
|
137
|
+
...extra
|
|
138
|
+
};
|
|
139
|
+
env = {
|
|
140
|
+
mode: 'view',
|
|
141
|
+
role: 'instructor'
|
|
142
|
+
};
|
|
143
|
+
const result = await (0, _index.model)(q, {
|
|
144
|
+
id: '1',
|
|
145
|
+
element: 'explicit-constructed-response',
|
|
146
|
+
...session
|
|
147
|
+
}, env);
|
|
148
|
+
expect(result).toEqual({
|
|
149
|
+
...question,
|
|
150
|
+
disabled: true,
|
|
151
|
+
feedback: {},
|
|
152
|
+
responseCorrect: undefined,
|
|
153
|
+
maxLengthPerChoice: [10, 10, 7],
|
|
154
|
+
...env,
|
|
155
|
+
...expected
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
160
|
+
promptEnabled: false,
|
|
161
|
+
rationaleEnabled: false,
|
|
162
|
+
teacherInstructionsEnabled: false,
|
|
163
|
+
studentInstructionsEnabled: false
|
|
164
|
+
}, {}, {
|
|
165
|
+
prompt: _defaults.default.prompt,
|
|
166
|
+
rationale: _defaults.default.rationale,
|
|
167
|
+
showNote: true,
|
|
168
|
+
teacherInstructions: _defaults.default.teacherInstructions
|
|
169
|
+
});
|
|
170
|
+
assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
|
|
171
|
+
teacherInstructions: 'Teacher Instructions',
|
|
172
|
+
showNote: true,
|
|
173
|
+
rationale: 'Rationale'
|
|
174
|
+
});
|
|
175
|
+
const assertViewStudent = (label, extra, session, expected) => {
|
|
176
|
+
it(`'mode: view, ${label}'`, async () => {
|
|
177
|
+
q = {
|
|
178
|
+
...question,
|
|
179
|
+
teacherInstructions: 'Teacher Instructions',
|
|
180
|
+
rationale: 'Rationale',
|
|
181
|
+
...extra
|
|
182
|
+
};
|
|
183
|
+
env = {
|
|
184
|
+
mode: 'view',
|
|
185
|
+
role: ' student'
|
|
186
|
+
};
|
|
187
|
+
const result = await (0, _index.model)(q, {
|
|
188
|
+
id: '1',
|
|
189
|
+
element: 'explicit-constructed-response',
|
|
190
|
+
...session
|
|
191
|
+
}, env);
|
|
192
|
+
expect(result).toEqual({
|
|
193
|
+
...question,
|
|
194
|
+
disabled: true,
|
|
195
|
+
feedback: {},
|
|
196
|
+
responseCorrect: undefined,
|
|
197
|
+
maxLengthPerChoice: [10, 10, 7],
|
|
198
|
+
...env,
|
|
199
|
+
...expected
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
204
|
+
promptEnabled: false,
|
|
205
|
+
rationaleEnabled: false,
|
|
206
|
+
teacherInstructionsEnabled: false,
|
|
207
|
+
studentInstructionsEnabled: false
|
|
208
|
+
}, {}, {
|
|
209
|
+
prompt: _defaults.default.prompt,
|
|
210
|
+
rationale: _defaults.default.rationale,
|
|
211
|
+
showNote: true,
|
|
212
|
+
teacherInstructions: _defaults.default.teacherInstructions
|
|
213
|
+
});
|
|
214
|
+
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
|
|
215
|
+
rationale: _defaults.default.rationale,
|
|
216
|
+
showNote: true,
|
|
217
|
+
teacherInstructions: _defaults.default.teacherInstructions
|
|
218
|
+
});
|
|
219
|
+
const assertEvaluate = (label, extra, session, expected) => {
|
|
220
|
+
it(`'mode: evaluate, ${label}'`, async () => {
|
|
221
|
+
q = {
|
|
222
|
+
...question,
|
|
223
|
+
teacherInstructions: 'Teacher Instructions',
|
|
224
|
+
rationale: 'Rationale',
|
|
225
|
+
...extra
|
|
226
|
+
};
|
|
227
|
+
env = {
|
|
228
|
+
mode: 'evaluate',
|
|
229
|
+
role: 'instructor'
|
|
230
|
+
};
|
|
231
|
+
const result = await (0, _index.model)(q, {
|
|
232
|
+
id: '1',
|
|
233
|
+
element: 'explicit-constructed-response',
|
|
234
|
+
...session
|
|
235
|
+
}, env);
|
|
236
|
+
expect(result).toEqual({
|
|
237
|
+
...question,
|
|
238
|
+
teacherInstructions: 'Teacher Instructions',
|
|
239
|
+
rationale: 'Rationale',
|
|
240
|
+
disabled: true,
|
|
241
|
+
choices: {
|
|
242
|
+
0: [{
|
|
243
|
+
label: 'cow',
|
|
244
|
+
value: '0',
|
|
245
|
+
correct: true
|
|
246
|
+
}, {
|
|
247
|
+
label: 'cattle',
|
|
248
|
+
value: '1',
|
|
249
|
+
correct: true
|
|
250
|
+
}, {
|
|
251
|
+
label: 'calf',
|
|
252
|
+
value: '2',
|
|
253
|
+
correct: true
|
|
254
|
+
}],
|
|
255
|
+
1: [{
|
|
256
|
+
label: 'over',
|
|
257
|
+
value: '0',
|
|
258
|
+
correct: true
|
|
259
|
+
}, {
|
|
260
|
+
label: 'past',
|
|
261
|
+
value: '1',
|
|
262
|
+
correct: true
|
|
263
|
+
}, {
|
|
264
|
+
label: 'beyond',
|
|
265
|
+
value: '2',
|
|
266
|
+
correct: true
|
|
267
|
+
}],
|
|
268
|
+
2: [{
|
|
269
|
+
label: 'moon',
|
|
270
|
+
value: '0',
|
|
271
|
+
correct: true
|
|
272
|
+
}]
|
|
273
|
+
},
|
|
274
|
+
maxLengthPerChoice: [10, 10, 7],
|
|
275
|
+
...env,
|
|
276
|
+
...expected
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
};
|
|
280
|
+
assertEvaluate('- correct answer', {}, {
|
|
281
|
+
value: {
|
|
282
|
+
0: 'cow',
|
|
283
|
+
1: 'over',
|
|
284
|
+
2: 'moon'
|
|
285
|
+
}
|
|
286
|
+
}, {
|
|
287
|
+
feedback: {
|
|
288
|
+
0: 'correct',
|
|
289
|
+
1: 'correct',
|
|
290
|
+
2: 'correct'
|
|
291
|
+
},
|
|
292
|
+
showNote: true,
|
|
293
|
+
responseCorrect: true
|
|
294
|
+
});
|
|
295
|
+
assertEvaluate('- partially correct answer', {}, {
|
|
296
|
+
value: {
|
|
297
|
+
0: 'cow',
|
|
298
|
+
1: 'over',
|
|
299
|
+
2: 'sun'
|
|
300
|
+
}
|
|
301
|
+
}, {
|
|
302
|
+
feedback: {
|
|
303
|
+
0: 'correct',
|
|
304
|
+
1: 'correct',
|
|
305
|
+
2: 'incorrect'
|
|
306
|
+
},
|
|
307
|
+
showNote: true,
|
|
308
|
+
responseCorrect: false
|
|
309
|
+
});
|
|
310
|
+
assertEvaluate('- partially correct answer using alternates', {}, {
|
|
311
|
+
value: {
|
|
312
|
+
0: 'calf',
|
|
313
|
+
1: 'over',
|
|
314
|
+
2: 'sun'
|
|
315
|
+
}
|
|
316
|
+
}, {
|
|
317
|
+
feedback: {
|
|
318
|
+
0: 'correct',
|
|
319
|
+
1: 'correct',
|
|
320
|
+
2: 'incorrect'
|
|
321
|
+
},
|
|
322
|
+
showNote: true,
|
|
323
|
+
responseCorrect: false
|
|
324
|
+
});
|
|
325
|
+
assertEvaluate('- incorrect answer', {}, {
|
|
326
|
+
value: {
|
|
327
|
+
0: 'han',
|
|
328
|
+
1: 'above',
|
|
329
|
+
2: 'chicken'
|
|
330
|
+
}
|
|
331
|
+
}, {
|
|
332
|
+
feedback: {
|
|
333
|
+
0: 'incorrect',
|
|
334
|
+
1: 'incorrect',
|
|
335
|
+
2: 'incorrect'
|
|
336
|
+
},
|
|
337
|
+
showNote: true,
|
|
338
|
+
responseCorrect: false
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe('get score', () => {
|
|
342
|
+
const assertScore = (session, expected) => {
|
|
343
|
+
it('return score', () => {
|
|
344
|
+
const score = (0, _index.getScore)(question, session);
|
|
345
|
+
expect(score).toEqual(expected);
|
|
346
|
+
});
|
|
347
|
+
};
|
|
348
|
+
assertScore({
|
|
349
|
+
value: {
|
|
350
|
+
0: 'cow',
|
|
351
|
+
1: 'over',
|
|
352
|
+
2: 'moon'
|
|
353
|
+
}
|
|
354
|
+
}, 1);
|
|
355
|
+
assertScore({
|
|
356
|
+
value: {
|
|
357
|
+
0: 'cattle',
|
|
358
|
+
1: 'over',
|
|
359
|
+
2: 'moon'
|
|
360
|
+
}
|
|
361
|
+
}, 1);
|
|
362
|
+
assertScore({
|
|
363
|
+
value: {
|
|
364
|
+
0: 'calf',
|
|
365
|
+
1: 'over',
|
|
366
|
+
2: 'moon'
|
|
367
|
+
}
|
|
368
|
+
}, 1);
|
|
369
|
+
assertScore({
|
|
370
|
+
value: {
|
|
371
|
+
0: 'cow',
|
|
372
|
+
1: 'past',
|
|
373
|
+
2: 'moon'
|
|
374
|
+
}
|
|
375
|
+
}, 1);
|
|
376
|
+
assertScore({
|
|
377
|
+
value: {
|
|
378
|
+
0: 'cattle',
|
|
379
|
+
1: 'past',
|
|
380
|
+
2: 'moon'
|
|
381
|
+
}
|
|
382
|
+
}, 1);
|
|
383
|
+
assertScore({
|
|
384
|
+
value: {
|
|
385
|
+
0: 'calf',
|
|
386
|
+
1: 'past',
|
|
387
|
+
2: 'moon'
|
|
388
|
+
}
|
|
389
|
+
}, 1);
|
|
390
|
+
assertScore({
|
|
391
|
+
value: {
|
|
392
|
+
0: 'cow',
|
|
393
|
+
1: 'beyond',
|
|
394
|
+
2: 'moon'
|
|
395
|
+
}
|
|
396
|
+
}, 1);
|
|
397
|
+
assertScore({
|
|
398
|
+
value: {
|
|
399
|
+
0: 'cattle',
|
|
400
|
+
1: 'beyond',
|
|
401
|
+
2: 'moon'
|
|
402
|
+
}
|
|
403
|
+
}, 1);
|
|
404
|
+
assertScore({
|
|
405
|
+
value: {
|
|
406
|
+
0: 'calf',
|
|
407
|
+
1: 'beyond',
|
|
408
|
+
2: 'moon'
|
|
409
|
+
}
|
|
410
|
+
}, 1);
|
|
411
|
+
assertScore({
|
|
412
|
+
value: {
|
|
413
|
+
0: 'calf',
|
|
414
|
+
1: 'under',
|
|
415
|
+
2: 'moon'
|
|
416
|
+
}
|
|
417
|
+
}, 0.67);
|
|
418
|
+
assertScore({
|
|
419
|
+
value: {
|
|
420
|
+
0: 'cat',
|
|
421
|
+
1: 'under',
|
|
422
|
+
2: 'moon'
|
|
423
|
+
}
|
|
424
|
+
}, 0.33);
|
|
425
|
+
assertScore({
|
|
426
|
+
value: {
|
|
427
|
+
0: 'cat',
|
|
428
|
+
1: 'under',
|
|
429
|
+
2: 'sun'
|
|
430
|
+
}
|
|
431
|
+
}, 0);
|
|
432
|
+
const returnScore = session => {
|
|
433
|
+
it(`score = 0 when session is ${JSON.stringify(session)}`, () => {
|
|
434
|
+
expect((0, _index.getScore)(question, session)).toEqual(0);
|
|
435
|
+
});
|
|
436
|
+
};
|
|
437
|
+
returnScore(undefined);
|
|
438
|
+
returnScore(null);
|
|
439
|
+
returnScore({});
|
|
440
|
+
});
|
|
441
|
+
describe('outcome partialScoring test', () => {
|
|
442
|
+
const assertOutcome = (message, extra, sessionValue, env, expected) => {
|
|
443
|
+
it(message, async () => {
|
|
444
|
+
const result = await (0, _index.outcome)({
|
|
445
|
+
...question,
|
|
446
|
+
...extra
|
|
447
|
+
}, sessionValue, env);
|
|
448
|
+
expect(result).toEqual(expect.objectContaining(expected));
|
|
449
|
+
});
|
|
450
|
+
};
|
|
451
|
+
assertOutcome('element.partialScoring = true', {
|
|
452
|
+
partialScoring: true
|
|
453
|
+
}, {
|
|
454
|
+
value: {
|
|
455
|
+
0: 'calf',
|
|
456
|
+
1: 'under',
|
|
457
|
+
2: 'moon'
|
|
458
|
+
}
|
|
459
|
+
}, {
|
|
460
|
+
mode: 'evaluate'
|
|
461
|
+
}, {
|
|
462
|
+
score: 0.67
|
|
463
|
+
});
|
|
464
|
+
assertOutcome('element.partialScoring = false', {
|
|
465
|
+
partialScoring: false
|
|
466
|
+
}, {
|
|
467
|
+
value: {
|
|
468
|
+
0: 'calf',
|
|
469
|
+
1: 'under',
|
|
470
|
+
2: 'moon'
|
|
471
|
+
}
|
|
472
|
+
}, {
|
|
473
|
+
mode: 'evaluate'
|
|
474
|
+
}, {
|
|
475
|
+
score: 0
|
|
476
|
+
});
|
|
477
|
+
assertOutcome('element.partialScoring = false, env.partialScoring = true', {
|
|
478
|
+
partialScoring: false
|
|
479
|
+
}, {
|
|
480
|
+
value: {
|
|
481
|
+
0: 'calf',
|
|
482
|
+
1: 'under',
|
|
483
|
+
2: 'moon'
|
|
484
|
+
}
|
|
485
|
+
}, {
|
|
486
|
+
mode: 'evaluate',
|
|
487
|
+
partialScoring: true
|
|
488
|
+
}, {
|
|
489
|
+
score: 0
|
|
490
|
+
});
|
|
491
|
+
assertOutcome('element.partialScoring = true, env.partialScoring = false', {
|
|
492
|
+
partialScoring: true
|
|
493
|
+
}, {
|
|
494
|
+
value: {
|
|
495
|
+
0: 'calf',
|
|
496
|
+
1: 'under',
|
|
497
|
+
2: 'moon'
|
|
498
|
+
}
|
|
499
|
+
}, {
|
|
500
|
+
mode: 'evaluate',
|
|
501
|
+
partialScoring: false
|
|
502
|
+
}, {
|
|
503
|
+
score: 0
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
describe('outcome', () => {
|
|
507
|
+
const assertOutcome = (partialScoring, sessionValue, expected) => {
|
|
508
|
+
it(`partial score ${partialScoring ? 'enabled' : ''}`, async () => {
|
|
509
|
+
const result = await (0, _index.outcome)({
|
|
510
|
+
...question,
|
|
511
|
+
partialScoring
|
|
512
|
+
}, sessionValue);
|
|
513
|
+
expect(result).toEqual(expect.objectContaining(expected));
|
|
514
|
+
});
|
|
515
|
+
};
|
|
516
|
+
assertOutcome(true, {
|
|
517
|
+
value: {
|
|
518
|
+
0: 'cow',
|
|
519
|
+
1: 'over',
|
|
520
|
+
2: 'moon'
|
|
521
|
+
}
|
|
522
|
+
}, {
|
|
523
|
+
score: 1,
|
|
524
|
+
empty: false
|
|
525
|
+
});
|
|
526
|
+
assertOutcome(true, {
|
|
527
|
+
value: {
|
|
528
|
+
0: 'cattle',
|
|
529
|
+
1: 'over',
|
|
530
|
+
2: 'moon'
|
|
531
|
+
}
|
|
532
|
+
}, {
|
|
533
|
+
score: 1,
|
|
534
|
+
empty: false
|
|
535
|
+
});
|
|
536
|
+
assertOutcome(true, {
|
|
537
|
+
value: {
|
|
538
|
+
0: 'calf',
|
|
539
|
+
1: 'over',
|
|
540
|
+
2: 'moon'
|
|
541
|
+
}
|
|
542
|
+
}, {
|
|
543
|
+
score: 1,
|
|
544
|
+
empty: false
|
|
545
|
+
});
|
|
546
|
+
assertOutcome(true, {
|
|
547
|
+
value: {
|
|
548
|
+
0: 'cow',
|
|
549
|
+
1: 'past',
|
|
550
|
+
2: 'moon'
|
|
551
|
+
}
|
|
552
|
+
}, {
|
|
553
|
+
score: 1,
|
|
554
|
+
empty: false
|
|
555
|
+
});
|
|
556
|
+
assertOutcome(true, {
|
|
557
|
+
value: {
|
|
558
|
+
0: 'cattle',
|
|
559
|
+
1: 'past',
|
|
560
|
+
2: 'moon'
|
|
561
|
+
}
|
|
562
|
+
}, {
|
|
563
|
+
score: 1,
|
|
564
|
+
empty: false
|
|
565
|
+
});
|
|
566
|
+
assertOutcome(true, {
|
|
567
|
+
value: {
|
|
568
|
+
0: 'calf',
|
|
569
|
+
1: 'past',
|
|
570
|
+
2: 'moon'
|
|
571
|
+
}
|
|
572
|
+
}, {
|
|
573
|
+
score: 1,
|
|
574
|
+
empty: false
|
|
575
|
+
});
|
|
576
|
+
assertOutcome(true, {
|
|
577
|
+
value: {
|
|
578
|
+
0: 'cow',
|
|
579
|
+
1: 'beyond',
|
|
580
|
+
2: 'moon'
|
|
581
|
+
}
|
|
582
|
+
}, {
|
|
583
|
+
score: 1,
|
|
584
|
+
empty: false
|
|
585
|
+
});
|
|
586
|
+
assertOutcome(true, {
|
|
587
|
+
value: {
|
|
588
|
+
0: 'cattle',
|
|
589
|
+
1: 'beyond',
|
|
590
|
+
2: 'moon'
|
|
591
|
+
}
|
|
592
|
+
}, {
|
|
593
|
+
score: 1,
|
|
594
|
+
empty: false
|
|
595
|
+
});
|
|
596
|
+
assertOutcome(true, {
|
|
597
|
+
value: {
|
|
598
|
+
0: 'calf',
|
|
599
|
+
1: 'beyond',
|
|
600
|
+
2: 'moon'
|
|
601
|
+
}
|
|
602
|
+
}, {
|
|
603
|
+
score: 1,
|
|
604
|
+
empty: false
|
|
605
|
+
});
|
|
606
|
+
assertOutcome(true, {
|
|
607
|
+
value: {
|
|
608
|
+
0: 'calf',
|
|
609
|
+
1: 'under',
|
|
610
|
+
2: 'moon'
|
|
611
|
+
}
|
|
612
|
+
}, {
|
|
613
|
+
score: 0.67,
|
|
614
|
+
empty: false
|
|
615
|
+
});
|
|
616
|
+
assertOutcome(true, {
|
|
617
|
+
value: {
|
|
618
|
+
0: 'cat',
|
|
619
|
+
1: 'under',
|
|
620
|
+
2: 'moon'
|
|
621
|
+
}
|
|
622
|
+
}, {
|
|
623
|
+
score: 0.33,
|
|
624
|
+
empty: false
|
|
625
|
+
});
|
|
626
|
+
assertOutcome(true, {
|
|
627
|
+
value: {
|
|
628
|
+
0: 'cat',
|
|
629
|
+
1: 'under',
|
|
630
|
+
2: 'sun'
|
|
631
|
+
}
|
|
632
|
+
}, {
|
|
633
|
+
score: 0,
|
|
634
|
+
empty: false
|
|
635
|
+
});
|
|
636
|
+
assertOutcome(false, {
|
|
637
|
+
value: {
|
|
638
|
+
0: 'cow',
|
|
639
|
+
1: 'over',
|
|
640
|
+
2: 'moon'
|
|
641
|
+
}
|
|
642
|
+
}, {
|
|
643
|
+
score: 1,
|
|
644
|
+
empty: false
|
|
645
|
+
});
|
|
646
|
+
assertOutcome(false, {
|
|
647
|
+
value: {
|
|
648
|
+
0: 'cattle',
|
|
649
|
+
1: 'over',
|
|
650
|
+
2: 'moon'
|
|
651
|
+
}
|
|
652
|
+
}, {
|
|
653
|
+
score: 1,
|
|
654
|
+
empty: false
|
|
655
|
+
});
|
|
656
|
+
assertOutcome(false, {
|
|
657
|
+
value: {
|
|
658
|
+
0: 'calf',
|
|
659
|
+
1: 'over',
|
|
660
|
+
2: 'moon'
|
|
661
|
+
}
|
|
662
|
+
}, {
|
|
663
|
+
score: 1,
|
|
664
|
+
empty: false
|
|
665
|
+
});
|
|
666
|
+
assertOutcome(false, {
|
|
667
|
+
value: {
|
|
668
|
+
0: 'cow',
|
|
669
|
+
1: 'past',
|
|
670
|
+
2: 'moon'
|
|
671
|
+
}
|
|
672
|
+
}, {
|
|
673
|
+
score: 1,
|
|
674
|
+
empty: false
|
|
675
|
+
});
|
|
676
|
+
assertOutcome(false, {
|
|
677
|
+
value: {
|
|
678
|
+
0: 'cattle',
|
|
679
|
+
1: 'past',
|
|
680
|
+
2: 'moon'
|
|
681
|
+
}
|
|
682
|
+
}, {
|
|
683
|
+
score: 1,
|
|
684
|
+
empty: false
|
|
685
|
+
});
|
|
686
|
+
assertOutcome(false, {
|
|
687
|
+
value: {
|
|
688
|
+
0: 'calf',
|
|
689
|
+
1: 'past',
|
|
690
|
+
2: 'moon'
|
|
691
|
+
}
|
|
692
|
+
}, {
|
|
693
|
+
score: 1,
|
|
694
|
+
empty: false
|
|
695
|
+
});
|
|
696
|
+
assertOutcome(false, {
|
|
697
|
+
value: {
|
|
698
|
+
0: 'cow',
|
|
699
|
+
1: 'beyond',
|
|
700
|
+
2: 'moon'
|
|
701
|
+
}
|
|
702
|
+
}, {
|
|
703
|
+
score: 1,
|
|
704
|
+
empty: false
|
|
705
|
+
});
|
|
706
|
+
assertOutcome(false, {
|
|
707
|
+
value: {
|
|
708
|
+
0: 'cattle',
|
|
709
|
+
1: 'beyond',
|
|
710
|
+
2: 'moon'
|
|
711
|
+
}
|
|
712
|
+
}, {
|
|
713
|
+
score: 1,
|
|
714
|
+
empty: false
|
|
715
|
+
});
|
|
716
|
+
assertOutcome(false, {
|
|
717
|
+
value: {
|
|
718
|
+
0: 'calf',
|
|
719
|
+
1: 'beyond',
|
|
720
|
+
2: 'moon'
|
|
721
|
+
}
|
|
722
|
+
}, {
|
|
723
|
+
score: 1,
|
|
724
|
+
empty: false
|
|
725
|
+
});
|
|
726
|
+
assertOutcome(false, {
|
|
727
|
+
value: {
|
|
728
|
+
0: 'calf',
|
|
729
|
+
1: 'under',
|
|
730
|
+
2: 'moon'
|
|
731
|
+
}
|
|
732
|
+
}, {
|
|
733
|
+
score: 0,
|
|
734
|
+
empty: false
|
|
735
|
+
});
|
|
736
|
+
assertOutcome(false, {
|
|
737
|
+
value: {
|
|
738
|
+
0: 'cat',
|
|
739
|
+
1: 'under',
|
|
740
|
+
2: 'moon'
|
|
741
|
+
}
|
|
742
|
+
}, {
|
|
743
|
+
score: 0,
|
|
744
|
+
empty: false
|
|
745
|
+
});
|
|
746
|
+
assertOutcome(false, {
|
|
747
|
+
value: {
|
|
748
|
+
0: 'cat',
|
|
749
|
+
1: 'under',
|
|
750
|
+
2: 'sun'
|
|
751
|
+
}
|
|
752
|
+
}, {
|
|
753
|
+
score: 0,
|
|
754
|
+
empty: false
|
|
755
|
+
});
|
|
756
|
+
const returnModel = session => {
|
|
757
|
+
it(`empty: true when session is ${JSON.stringify(session)}`, async () => {
|
|
758
|
+
const m = await (0, _index.outcome)(question, session);
|
|
759
|
+
expect(m).toEqual({
|
|
760
|
+
score: 0,
|
|
761
|
+
empty: true,
|
|
762
|
+
traceLog: ['Student did not fill any response areas. Score: 0.']
|
|
763
|
+
});
|
|
764
|
+
});
|
|
765
|
+
};
|
|
766
|
+
returnModel(undefined);
|
|
767
|
+
returnModel(null);
|
|
768
|
+
returnModel({});
|
|
769
|
+
});
|
|
770
|
+
describe('prepareVal', () => {
|
|
771
|
+
it('should return empty string on null or undefined', () => {
|
|
772
|
+
expect((0, _index.prepareVal)(null)).toEqual('');
|
|
773
|
+
expect((0, _index.prepareVal)(undefined)).toEqual('');
|
|
774
|
+
});
|
|
775
|
+
it('should remove html tags', () => {
|
|
776
|
+
expect((0, _index.prepareVal)('<div>Foo Bar</div>')).toEqual('Foo Bar');
|
|
777
|
+
});
|
|
778
|
+
describe('correct response', () => {
|
|
779
|
+
let question;
|
|
780
|
+
beforeEach(() => {
|
|
781
|
+
question = {
|
|
782
|
+
choices
|
|
783
|
+
};
|
|
784
|
+
});
|
|
785
|
+
it('returns correct response if env is correct', async () => {
|
|
786
|
+
const sess = await (0, _index.createCorrectResponseSession)(question, {
|
|
787
|
+
mode: 'gather',
|
|
788
|
+
role: 'instructor'
|
|
789
|
+
});
|
|
790
|
+
expect(sess).toEqual({
|
|
791
|
+
id: '1',
|
|
792
|
+
value: {
|
|
793
|
+
0: 'cow',
|
|
794
|
+
1: 'over',
|
|
795
|
+
2: 'moon'
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
it('returns null env is student', async () => {
|
|
800
|
+
const noResult = await (0, _index.createCorrectResponseSession)(question, {
|
|
801
|
+
mode: 'gather',
|
|
802
|
+
role: 'student'
|
|
803
|
+
});
|
|
804
|
+
expect(noResult).toBeNull();
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
});
|
|
808
|
+
describe('correct response', () => {
|
|
809
|
+
it('returns correct response if role is instructor and mode is gather', async () => {
|
|
810
|
+
const sess = await (0, _index.createCorrectResponseSession)(question, {
|
|
811
|
+
mode: 'gather',
|
|
812
|
+
role: 'instructor'
|
|
813
|
+
});
|
|
814
|
+
expect(sess).toEqual({
|
|
815
|
+
id: '1',
|
|
816
|
+
value: {
|
|
817
|
+
0: 'cow',
|
|
818
|
+
1: 'over',
|
|
819
|
+
2: 'moon'
|
|
820
|
+
}
|
|
821
|
+
});
|
|
822
|
+
});
|
|
823
|
+
it('returns correct response if role is instructor and mode is view', async () => {
|
|
824
|
+
const sess = await (0, _index.createCorrectResponseSession)(question, {
|
|
825
|
+
mode: 'view',
|
|
826
|
+
role: 'instructor'
|
|
827
|
+
});
|
|
828
|
+
expect(sess).toEqual({
|
|
829
|
+
id: '1',
|
|
830
|
+
value: {
|
|
831
|
+
0: 'cow',
|
|
832
|
+
1: 'over',
|
|
833
|
+
2: 'moon'
|
|
834
|
+
}
|
|
835
|
+
});
|
|
836
|
+
});
|
|
837
|
+
it('returns null if mode is evaluate', async () => {
|
|
838
|
+
const noResult = await (0, _index.createCorrectResponseSession)(question, {
|
|
839
|
+
mode: 'evaluate',
|
|
840
|
+
role: 'instructor'
|
|
841
|
+
});
|
|
842
|
+
expect(noResult).toBeNull();
|
|
843
|
+
});
|
|
844
|
+
it('returns null if role is student', async () => {
|
|
845
|
+
const noResult = await (0, _index.createCorrectResponseSession)(question, {
|
|
846
|
+
mode: 'gather',
|
|
847
|
+
role: 'student'
|
|
848
|
+
});
|
|
849
|
+
expect(noResult).toBeNull();
|
|
850
|
+
});
|
|
851
|
+
});
|
|
852
|
+
describe('prepareChoice', () => {
|
|
853
|
+
const assertPrepareChoice = (env, defaultFeedback, choice, expected) => {
|
|
854
|
+
const preparChoiceFn = (0, _index.prepareChoice)(env.mode, defaultFeedback);
|
|
855
|
+
it(`prepare choices in ${env.mode} mode: ${JSON.stringify(choice)} -> ${JSON.stringify(expected)}`, () => {
|
|
856
|
+
expect(preparChoiceFn(choice)).toEqual(expected);
|
|
857
|
+
});
|
|
858
|
+
};
|
|
859
|
+
assertPrepareChoice({
|
|
860
|
+
mode: 'gather'
|
|
861
|
+
}, {
|
|
862
|
+
correct: 'Correct',
|
|
863
|
+
incorrect: 'Incorrect'
|
|
864
|
+
}, {
|
|
865
|
+
value: '0',
|
|
866
|
+
label: 'cow'
|
|
867
|
+
}, {
|
|
868
|
+
value: '0',
|
|
869
|
+
label: 'cow'
|
|
870
|
+
});
|
|
871
|
+
assertPrepareChoice({
|
|
872
|
+
mode: 'view'
|
|
873
|
+
}, {
|
|
874
|
+
correct: 'Correct',
|
|
875
|
+
incorrect: 'Incorrect'
|
|
876
|
+
}, {
|
|
877
|
+
value: '0',
|
|
878
|
+
label: 'cow'
|
|
879
|
+
}, {
|
|
880
|
+
value: '0',
|
|
881
|
+
label: 'cow'
|
|
882
|
+
});
|
|
883
|
+
assertPrepareChoice({
|
|
884
|
+
mode: 'evaluate'
|
|
885
|
+
}, {
|
|
886
|
+
correct: 'Correct',
|
|
887
|
+
incorrect: 'Incorrect'
|
|
888
|
+
}, {
|
|
889
|
+
value: '0',
|
|
890
|
+
label: 'cow'
|
|
891
|
+
}, {
|
|
892
|
+
value: '0',
|
|
893
|
+
label: 'cow',
|
|
894
|
+
correct: true
|
|
895
|
+
});
|
|
896
|
+
assertPrepareChoice({
|
|
897
|
+
mode: 'evaluate'
|
|
898
|
+
}, {
|
|
899
|
+
correct: 'Correct',
|
|
900
|
+
incorrect: 'Incorrect'
|
|
901
|
+
}, {
|
|
902
|
+
value: '0',
|
|
903
|
+
label: 'cow',
|
|
904
|
+
feedback: {
|
|
905
|
+
type: 'default'
|
|
906
|
+
}
|
|
907
|
+
}, {
|
|
908
|
+
value: '0',
|
|
909
|
+
label: 'cow',
|
|
910
|
+
correct: true,
|
|
911
|
+
feedback: 'Correct'
|
|
912
|
+
});
|
|
913
|
+
assertPrepareChoice({
|
|
914
|
+
mode: 'evaluate'
|
|
915
|
+
}, {
|
|
916
|
+
correct: 'Correct',
|
|
917
|
+
incorrect: 'Incorrect'
|
|
918
|
+
}, {
|
|
919
|
+
value: '0',
|
|
920
|
+
label: 'cow',
|
|
921
|
+
feedback: {
|
|
922
|
+
type: 'custom'
|
|
923
|
+
}
|
|
924
|
+
}, {
|
|
925
|
+
value: '0',
|
|
926
|
+
label: 'cow',
|
|
927
|
+
correct: true,
|
|
928
|
+
feedback: undefined
|
|
929
|
+
});
|
|
930
|
+
assertPrepareChoice({
|
|
931
|
+
mode: 'evaluate'
|
|
932
|
+
}, {
|
|
933
|
+
correct: 'Correct',
|
|
934
|
+
incorrect: 'Incorrect'
|
|
935
|
+
}, {
|
|
936
|
+
value: '0',
|
|
937
|
+
label: 'cow',
|
|
938
|
+
feedback: {
|
|
939
|
+
type: 'custom',
|
|
940
|
+
value: 'Custom Feedback'
|
|
941
|
+
}
|
|
942
|
+
}, {
|
|
943
|
+
value: '0',
|
|
944
|
+
label: 'cow',
|
|
945
|
+
correct: true,
|
|
946
|
+
feedback: 'Custom Feedback'
|
|
947
|
+
});
|
|
948
|
+
});
|
|
949
|
+
});
|
|
950
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImplc3QiLCJtb2NrIiwiZ2V0U2h1ZmZsZWRDaG9pY2VzIiwiY2hvaWNlcyIsInNlc3Npb24iLCJ1cGRhdGVTZXNzaW9uIiwia2V5IiwiY3VycmVudFNodWZmbGVkIiwic2h1ZmZsZWRWYWx1ZXMiLCJmaWx0ZXIiLCJ2IiwibGVuZ3RoIiwicGFydGlhbFNjb3JpbmciLCJlbmFibGVkIiwiY29uZmlnIiwiZW52IiwiY2hvaWNlIiwibCIsImxhYmVsIiwidmFsdWUiLCJxdWVzdGlvbiIsIm1hcmt1cCIsImRpc2FibGVkIiwicHJvbXB0Iiwibm90ZSIsImxhbmd1YWdlIiwibWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZCIsInBsYXllclNwZWxsQ2hlY2tFbmFibGVkIiwiZGlzcGxheVR5cGUiLCJkZXNjcmliZSIsInEiLCJpdCIsIm0iLCJtb2RlbCIsIm1vZGUiLCJleHBlY3QiLCJ0b0VxdWFsIiwib2JqZWN0Q29udGFpbmluZyIsImZlZWRiYWNrIiwicmVzcG9uc2VDb3JyZWN0IiwicmV0dXJuTW9kZWwiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwiYXNzZXJ0R2F0aGVyIiwiZXh0cmEiLCJleHBlY3RlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJyYXRpb25hbGUiLCJyZXN1bHQiLCJpZCIsImVsZW1lbnQiLCJtYXhMZW5ndGhQZXJDaG9pY2UiLCJkZWZhdWx0cyIsInNob3dOb3RlIiwicHJvbXB0RW5hYmxlZCIsInJhdGlvbmFsZUVuYWJsZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCIsInN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkIiwiYXNzZXJ0VmlldyIsInJvbGUiLCJhc3NlcnRWaWV3U3R1ZGVudCIsImFzc2VydEV2YWx1YXRlIiwiY29ycmVjdCIsImFzc2VydFNjb3JlIiwic2NvcmUiLCJnZXRTY29yZSIsInJldHVyblNjb3JlIiwiYXNzZXJ0T3V0Y29tZSIsIm1lc3NhZ2UiLCJzZXNzaW9uVmFsdWUiLCJvdXRjb21lIiwiZW1wdHkiLCJ0cmFjZUxvZyIsInByZXBhcmVWYWwiLCJiZWZvcmVFYWNoIiwic2VzcyIsImNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24iLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwiYXNzZXJ0UHJlcGFyZUNob2ljZSIsImRlZmF1bHRGZWVkYmFjayIsInByZXBhckNob2ljZUZuIiwicHJlcGFyZUNob2ljZSIsImluY29ycmVjdCIsInR5cGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW9kZWwsIGdldFNjb3JlLCBvdXRjb21lLCBwcmVwYXJlVmFsLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uLCBwcmVwYXJlQ2hvaWNlIH0gZnJvbSAnLi4vaW5kZXgnO1xuXG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbnRyb2xsZXItdXRpbHMnLCAoKSA9PiAoe1xuICBnZXRTaHVmZmxlZENob2ljZXM6IChjaG9pY2VzLCBzZXNzaW9uLCB1cGRhdGVTZXNzaW9uLCBrZXkpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U2h1ZmZsZWQgPSAoKHNlc3Npb24gfHwge30pLnNodWZmbGVkVmFsdWVzIHx8IFtdKS5maWx0ZXIoKHYpID0+IHYpO1xuXG4gICAgaWYgKHNlc3Npb24gJiYgIWN1cnJlbnRTaHVmZmxlZC5sZW5ndGggJiYgdXBkYXRlU2Vzc2lvbiAmJiB0eXBlb2YgdXBkYXRlU2Vzc2lvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlU2Vzc2lvbigpO1xuICAgIH1cblxuICAgIHJldHVybiBjaG9pY2VzO1xuICB9LFxuICBwYXJ0aWFsU2NvcmluZzoge1xuICAgIGVuYWJsZWQ6IChjb25maWcsIGVudikgPT4ge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgZW52ID0gZW52IHx8IHt9O1xuXG4gICAgICBpZiAoY29uZmlnLnBhcnRpYWxTY29yaW5nID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnYucGFydGlhbFNjb3JpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSxcbn0pKTtcblxuY29uc3QgY2hvaWNlID0gKGwsIHYpID0+ICh7IGxhYmVsOiBsLCB2YWx1ZTogdiB9KTtcbmNvbnN0IGNob2ljZXMgPSB7XG4gIDA6IFtjaG9pY2UoJ2NvdycsICcwJyksIGNob2ljZSgnY2F0dGxlJywgJzEnKSwgY2hvaWNlKCdjYWxmJywgJzInKV0sXG4gIDE6IFtjaG9pY2UoJ292ZXInLCAnMCcpLCBjaG9pY2UoJ3Bhc3QnLCAnMScpLCBjaG9pY2UoJ2JleW9uZCcsICcyJyldLFxuICAyOiBbY2hvaWNlKCdtb29uJywgJzAnKV0sXG59O1xuXG5jb25zdCBxdWVzdGlvbiA9IHtcbiAgbWFya3VwOiAnPHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+JyxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBjaG9pY2VzLFxuICBwcm9tcHQ6ICdDb21wbGV0ZSB0aGUgc2VudGVuY2UnLFxuICBub3RlOiAnVGhlIGFuc3dlciBzaG93biBhYm92ZSBpcyB0aGUgbW9zdCBjb21tb24gY29ycmVjdCBhbnN3ZXIgZm9yIHRoaXMgaXRlbS4nLFxuICBsYW5ndWFnZTogJ2VuZ2xpc2gnLFxuICBtYXhMZW5ndGhQZXJDaG9pY2VFbmFibGVkOiB0cnVlLFxuICBwbGF5ZXJTcGVsbENoZWNrRW5hYmxlZDogdHJ1ZSxcbiAgZGlzcGxheVR5cGU6ICdibG9jaycsXG59O1xuXG5kZXNjcmliZSgnY29udHJvbGxlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ21vZGVsJywgKCkgPT4ge1xuICAgIGxldCBxLCBlbnY7XG5cbiAgICBpdCgnb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyBkZWZpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcblxuICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2NvcnJlY3QnIH0sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Nb2RlbCh1bmRlZmluZWQpO1xuICAgIHJldHVybk1vZGVsKG51bGwpO1xuICAgIHJldHVybk1vZGVsKHt9KTtcblxuICAgIGNvbnN0IGFzc2VydEdhdGhlciA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IGdhdGhlciwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBub3Qgc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogZGVmYXVsdHMucmF0aW9uYWxlLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogZGVmYXVsdHMudGVhY2hlckluc3RydWN0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IGRlZmF1bHRzLnByb21wdCxcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0VmlldyA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBkZWZhdWx0cy5wcm9tcHQsXG4gICAgICAgIHJhdGlvbmFsZTogZGVmYXVsdHMucmF0aW9uYWxlLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogZGVmYXVsdHMudGVhY2hlckluc3RydWN0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3U3R1ZGVudCA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnIHN0dWRlbnQnIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgLi4uZW52LFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IGRlZmF1bHRzLnByb21wdCxcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0Vmlld1N0dWRlbnQoXG4gICAgICAnICsgcm9sZTogc3R1ZGVudCwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0dGxlJywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2FsZicsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdvdmVyJywgdmFsdWU6ICcwJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyOiBbeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NvdycsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdtb29uJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICdjb3cnLFxuICAgICAgICAgIDE6ICdvdmVyJyxcbiAgICAgICAgICAyOiAnc3VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyIHVzaW5nIGFsdGVybmF0ZXMnLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NhbGYnLFxuICAgICAgICAgIDE6ICdvdmVyJyxcbiAgICAgICAgICAyOiAnc3VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gaW5jb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnaGFuJyxcbiAgICAgICAgICAxOiAnYWJvdmUnLFxuICAgICAgICAgIDI6ICdjaGlja2VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdpbmNvcnJlY3QnLCAxOiAnaW5jb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlQ29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXQgc2NvcmUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0U2NvcmUgPSAoc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KCdyZXR1cm4gc2NvcmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjb3JlID0gZ2V0U2NvcmUocXVlc3Rpb24sIHNlc3Npb24pO1xuXG4gICAgICAgIGV4cGVjdChzY29yZSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgMC42Nyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgMC4zMyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ3N1bicgfSB9LCAwKTtcblxuICAgIGNvbnN0IHJldHVyblNjb3JlID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBzY29yZSA9IDAgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QoZ2V0U2NvcmUocXVlc3Rpb24sIHNlc3Npb24pKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVyblNjb3JlKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuU2NvcmUobnVsbCk7XG4gICAgcmV0dXJuU2NvcmUoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZSBwYXJ0aWFsU2NvcmluZyB0ZXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydE91dGNvbWUgPSAobWVzc2FnZSwgZXh0cmEsIHNlc3Npb25WYWx1ZSwgZW52LCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQobWVzc2FnZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoZXhwZWN0ZWQpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwLjY3IH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHBhcnRpYWxTY29yaW5nOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChwYXJ0aWFsU2NvcmluZywgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYHBhcnRpYWwgc2NvcmUgJHtwYXJ0aWFsU2NvcmluZyA/ICdlbmFibGVkJyA6ICcnfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIHBhcnRpYWxTY29yaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvblZhbHVlLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoZXhwZWN0ZWQpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcblxuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdCcsIDE6ICd1bmRlcicsIDI6ICdzdW4nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuTW9kZWwgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYGVtcHR5OiB0cnVlIHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHNlc3Npb24pO1xuXG4gICAgICAgIGV4cGVjdChtKS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5OiB0cnVlLCB0cmFjZUxvZzogWydTdHVkZW50IGRpZCBub3QgZmlsbCBhbnkgcmVzcG9uc2UgYXJlYXMuIFNjb3JlOiAwLiddIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlcGFyZVZhbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBzdHJpbmcgb24gbnVsbCBvciB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocHJlcGFyZVZhbChudWxsKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QocHJlcGFyZVZhbCh1bmRlZmluZWQpKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGh0bWwgdGFncycsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKCc8ZGl2PkZvbyBCYXI8L2Rpdj4nKSkudG9FcXVhbCgnRm9vIEJhcicpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICBsZXQgcXVlc3Rpb247XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgY2hvaWNlcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbnVsbCBlbnYgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG4gICAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyB2aWV3JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHtcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgbW9kZSBpcyBldmFsdWF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwgeyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgcm9sZSBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ByZXBhcmVDaG9pY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0UHJlcGFyZUNob2ljZSA9IChlbnYsIGRlZmF1bHRGZWVkYmFjaywgY2hvaWNlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgY29uc3QgcHJlcGFyQ2hvaWNlRm4gPSBwcmVwYXJlQ2hvaWNlKGVudi5tb2RlLCBkZWZhdWx0RmVlZGJhY2spO1xuXG4gICAgICBpdChgcHJlcGFyZSBjaG9pY2VzIGluICR7ZW52Lm1vZGV9IG1vZGU6ICR7SlNPTi5zdHJpbmdpZnkoY2hvaWNlKX0gLT4gJHtKU09OLnN0cmluZ2lmeShleHBlY3RlZCl9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QocHJlcGFyQ2hvaWNlRm4oY2hvaWNlKSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2dhdGhlcicgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ3ZpZXcnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFByZXBhcmVDaG9pY2UoXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBmZWVkYmFjazogeyB0eXBlOiAnZGVmYXVsdCcgfSB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUsIGZlZWRiYWNrOiAnQ29ycmVjdCcgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBmZWVkYmFjazogeyB0eXBlOiAnY3VzdG9tJyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6IHVuZGVmaW5lZCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZTogJ0N1c3RvbSBGZWVkYmFjaycgfSB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUsIGZlZWRiYWNrOiAnQ3VzdG9tIEZlZWRiYWNrJyB9LFxuICAgICk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBRyxJQUFJLENBQUNDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxPQUFPO0VBQzVDQyxrQkFBa0IsRUFBRUEsQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLEVBQUVDLGFBQWEsRUFBRUMsR0FBRyxLQUFLO0lBQzVELE1BQU1DLGVBQWUsR0FBRyxDQUFDLENBQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRUksY0FBYyxJQUFJLEVBQUUsRUFBRUMsTUFBTSxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQztJQUUvRSxJQUFJTixPQUFPLElBQUksQ0FBQ0csZUFBZSxDQUFDSSxNQUFNLElBQUlOLGFBQWEsSUFBSSxPQUFPQSxhQUFhLEtBQUssVUFBVSxFQUFFO01BQzlGQSxhQUFhLENBQUMsQ0FBQztJQUNqQjtJQUVBLE9BQU9GLE9BQU87RUFDaEIsQ0FBQztFQUNEUyxjQUFjLEVBQUU7SUFDZEMsT0FBTyxF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QyxFQUFFLENBQUMsQ0FBQztJQUM3RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLE1BQU07UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLEtBQUs7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLE1BQU07UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLEtBQUs7UUFBRSxDQUFDLEVBQUUsUUFBUTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsUUFBUTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FB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
|