@pie-element/ebsr 9.2.0-next.1 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +5 -0
- package/configure/lib/defaults.js +1 -1
- package/configure/lib/index.js +1 -1
- package/configure/lib/main.js +1 -1
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +1 -1
- package/controller/lib/utils.js +1 -1
- package/lib/index.js +1 -1
- package/lib/print.js +1 -1
- package/package.json +2 -2
- package/configure/lib/__tests__/index.test.js +0 -434
- package/controller/lib/__tests__/index.test.js +0 -732
- package/controller/lib/__tests__/utils.test.js +0 -52
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/index.test.js +0 -147
- package/module/demo.js +0 -77
- package/module/element.js +0 -2294
- package/module/index.html +0 -21
- package/module/manifest.json +0 -10
- package/module/print-demo.js +0 -115
- package/module/print.html +0 -18
- package/module/print.js +0 -2299
|
@@ -1,732 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
-
|
|
7
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
8
|
-
|
|
9
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
-
|
|
11
|
-
var _index = require("../index");
|
|
12
|
-
|
|
13
|
-
var _utils = require("../utils");
|
|
14
|
-
|
|
15
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
16
|
-
|
|
17
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
18
|
-
|
|
19
|
-
var PART_A = 'partA';
|
|
20
|
-
var PART_B = 'partB';
|
|
21
|
-
jest.mock('../utils', function () {
|
|
22
|
-
return {
|
|
23
|
-
isResponseCorrect: jest.fn()
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
describe('controller', function () {
|
|
27
|
-
var result, question, session, env;
|
|
28
|
-
beforeEach(function () {
|
|
29
|
-
question = {
|
|
30
|
-
partA: {
|
|
31
|
-
choiceMode: 'checkbox',
|
|
32
|
-
feedbackEnabled: true,
|
|
33
|
-
choices: [{
|
|
34
|
-
value: 'yellow',
|
|
35
|
-
label: 'Yellow',
|
|
36
|
-
correct: true,
|
|
37
|
-
feedback: {
|
|
38
|
-
type: 'custom',
|
|
39
|
-
value: 'foo'
|
|
40
|
-
}
|
|
41
|
-
}, {
|
|
42
|
-
value: 'green',
|
|
43
|
-
label: 'Green',
|
|
44
|
-
feedback: {
|
|
45
|
-
type: 'default'
|
|
46
|
-
}
|
|
47
|
-
}],
|
|
48
|
-
choicePrefix: 'numbers',
|
|
49
|
-
prompt: "prompt ".concat(PART_A),
|
|
50
|
-
promptEnabled: true,
|
|
51
|
-
lockChoiceOrder: true,
|
|
52
|
-
partialScoring: false
|
|
53
|
-
},
|
|
54
|
-
partB: {
|
|
55
|
-
choiceMode: 'checkbox',
|
|
56
|
-
feedbackEnabled: true,
|
|
57
|
-
choices: [{
|
|
58
|
-
value: 'orange',
|
|
59
|
-
label: 'Orange',
|
|
60
|
-
correct: true,
|
|
61
|
-
feedback: {
|
|
62
|
-
type: 'custom',
|
|
63
|
-
value: 'foo'
|
|
64
|
-
}
|
|
65
|
-
}, {
|
|
66
|
-
value: 'purple',
|
|
67
|
-
label: 'Purple',
|
|
68
|
-
feedback: {
|
|
69
|
-
type: 'default'
|
|
70
|
-
}
|
|
71
|
-
}, {
|
|
72
|
-
value: 'c',
|
|
73
|
-
correct: true
|
|
74
|
-
}],
|
|
75
|
-
choicePrefix: 'numbers',
|
|
76
|
-
prompt: "prompt ".concat(PART_B),
|
|
77
|
-
promptEnabled: true,
|
|
78
|
-
lockChoiceOrder: true,
|
|
79
|
-
partialScoring: false
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
describe('outcome partialScoring test', function () {
|
|
84
|
-
var mkQuestion = function mkQuestion(extra) {
|
|
85
|
-
return _objectSpread({
|
|
86
|
-
partA: {
|
|
87
|
-
choiceMode: 'radio',
|
|
88
|
-
feedbackEnabled: true,
|
|
89
|
-
choices: [{
|
|
90
|
-
value: 'yellow',
|
|
91
|
-
label: 'Yellow',
|
|
92
|
-
correct: true,
|
|
93
|
-
feedback: {
|
|
94
|
-
type: 'custom',
|
|
95
|
-
value: 'foo'
|
|
96
|
-
}
|
|
97
|
-
}, {
|
|
98
|
-
value: 'blue',
|
|
99
|
-
label: 'Blue',
|
|
100
|
-
correct: true,
|
|
101
|
-
feedback: {
|
|
102
|
-
type: 'custom',
|
|
103
|
-
value: 'foo'
|
|
104
|
-
}
|
|
105
|
-
}, {
|
|
106
|
-
value: 'green',
|
|
107
|
-
label: 'Green',
|
|
108
|
-
feedback: {
|
|
109
|
-
type: 'default'
|
|
110
|
-
}
|
|
111
|
-
}],
|
|
112
|
-
choicePrefix: 'numbers',
|
|
113
|
-
prompt: "prompt ".concat(PART_A),
|
|
114
|
-
promptEnabled: true,
|
|
115
|
-
lockChoiceOrder: true
|
|
116
|
-
},
|
|
117
|
-
partB: {
|
|
118
|
-
choiceMode: 'radio',
|
|
119
|
-
feedbackEnabled: true,
|
|
120
|
-
choices: [{
|
|
121
|
-
value: 'orange',
|
|
122
|
-
label: 'Orange',
|
|
123
|
-
correct: true,
|
|
124
|
-
feedback: {
|
|
125
|
-
type: 'custom',
|
|
126
|
-
value: 'foo'
|
|
127
|
-
}
|
|
128
|
-
}, {
|
|
129
|
-
value: 'red',
|
|
130
|
-
label: 'Red',
|
|
131
|
-
correct: true,
|
|
132
|
-
feedback: {
|
|
133
|
-
type: 'custom',
|
|
134
|
-
value: 'foo'
|
|
135
|
-
}
|
|
136
|
-
}, {
|
|
137
|
-
value: 'purple',
|
|
138
|
-
label: 'Purple',
|
|
139
|
-
feedback: {
|
|
140
|
-
type: 'default'
|
|
141
|
-
}
|
|
142
|
-
}],
|
|
143
|
-
choicePrefix: 'numbers',
|
|
144
|
-
prompt: "prompt ".concat(PART_B),
|
|
145
|
-
promptEnabled: true,
|
|
146
|
-
lockChoiceOrder: true
|
|
147
|
-
},
|
|
148
|
-
partialScoring: false
|
|
149
|
-
}, extra);
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
var assertOutcome = function assertOutcome(message, extra, value1, value2, env, expected, expectedMax) {
|
|
153
|
-
it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
154
|
-
var question, result;
|
|
155
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
156
|
-
while (1) {
|
|
157
|
-
switch (_context.prev = _context.next) {
|
|
158
|
-
case 0:
|
|
159
|
-
question = mkQuestion(extra);
|
|
160
|
-
_context.next = 3;
|
|
161
|
-
return (0, _index.outcome)(question, {
|
|
162
|
-
value: {
|
|
163
|
-
partA: {
|
|
164
|
-
value: value1
|
|
165
|
-
},
|
|
166
|
-
partB: {
|
|
167
|
-
value: value2
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}, env);
|
|
171
|
-
|
|
172
|
-
case 3:
|
|
173
|
-
result = _context.sent;
|
|
174
|
-
expect(result.score).toEqual(expected);
|
|
175
|
-
expect(result.max).toEqual(expectedMax);
|
|
176
|
-
|
|
177
|
-
case 6:
|
|
178
|
-
case "end":
|
|
179
|
-
return _context.stop();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}, _callee);
|
|
183
|
-
})));
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
assertOutcome('element.partialScoring = true, partA correct, partB correct', {
|
|
187
|
-
partialScoring: true
|
|
188
|
-
}, ['yellow', 'blue'], ['orange', 'red'], {
|
|
189
|
-
mode: 'evaluate'
|
|
190
|
-
}, 2, 2);
|
|
191
|
-
assertOutcome('element.partialScoring = true, partA correct, partB partially correct', {
|
|
192
|
-
partialScoring: true
|
|
193
|
-
}, ['yellow', 'blue'], ['orange'], {
|
|
194
|
-
mode: 'evaluate'
|
|
195
|
-
}, 1, 2);
|
|
196
|
-
assertOutcome('element.partialScoring = true, partA correct, partB incorrect', {
|
|
197
|
-
partialScoring: true
|
|
198
|
-
}, ['yellow', 'blue'], [], {
|
|
199
|
-
mode: 'evaluate'
|
|
200
|
-
}, 1, 2);
|
|
201
|
-
assertOutcome('element.partialScoring = true, partA incorrect, partB correct', {
|
|
202
|
-
partialScoring: true
|
|
203
|
-
}, [], ['orange', 'red'], {
|
|
204
|
-
mode: 'evaluate'
|
|
205
|
-
}, 0, 2);
|
|
206
|
-
assertOutcome('element.partialScoring = true, partA partially correct, partB partially correct', {
|
|
207
|
-
partialScoring: true
|
|
208
|
-
}, ['yellow'], ['orange'], {
|
|
209
|
-
mode: 'evaluate'
|
|
210
|
-
}, 0, 2);
|
|
211
|
-
assertOutcome('element.partialScoring = true, partA incorrect, partB partially correct', {
|
|
212
|
-
partialScoring: true
|
|
213
|
-
}, ['yellow'], ['orange'], {
|
|
214
|
-
mode: 'evaluate'
|
|
215
|
-
}, 0, 2);
|
|
216
|
-
assertOutcome('element.partialScoring = true, partA incorrect, partB incorrect', {
|
|
217
|
-
partialScoring: true
|
|
218
|
-
}, ['yellow'], ['orange'], {
|
|
219
|
-
mode: 'evaluate'
|
|
220
|
-
}, 0, 2);
|
|
221
|
-
assertOutcome('element.partialScoring = false, partA correct, partB correct', {
|
|
222
|
-
partialScoring: false
|
|
223
|
-
}, ['yellow', 'blue'], ['orange', 'red'], {
|
|
224
|
-
mode: 'evaluate'
|
|
225
|
-
}, 1, 1);
|
|
226
|
-
assertOutcome('element.partialScoring = false, partA incorrect, partB correct', {
|
|
227
|
-
partialScoring: false
|
|
228
|
-
}, ['yellow'], ['orange', 'red'], {
|
|
229
|
-
mode: 'evaluate'
|
|
230
|
-
}, 0, 1);
|
|
231
|
-
assertOutcome('element.partialScoring = false, partA correct, partB incorrect', {
|
|
232
|
-
partialScoring: false
|
|
233
|
-
}, ['yellow', 'blue'], ['orange'], {
|
|
234
|
-
mode: 'evaluate'
|
|
235
|
-
}, 0, 1);
|
|
236
|
-
assertOutcome('element.partialScoring = false, partA incorrect, partB incorrect', {
|
|
237
|
-
partialScoring: false
|
|
238
|
-
}, [], [], {
|
|
239
|
-
mode: 'evaluate'
|
|
240
|
-
}, 0, 1);
|
|
241
|
-
});
|
|
242
|
-
describe('outcome', function () {
|
|
243
|
-
describe('dichotomous', function () {
|
|
244
|
-
var returnsScoreOf = function returnsScoreOf(message, values1, values2, score) {
|
|
245
|
-
it("".concat(message, " => ").concat(score), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
246
|
-
var result;
|
|
247
|
-
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
248
|
-
while (1) {
|
|
249
|
-
switch (_context2.prev = _context2.next) {
|
|
250
|
-
case 0:
|
|
251
|
-
_context2.next = 2;
|
|
252
|
-
return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
|
|
253
|
-
partialScoring: false
|
|
254
|
-
}), {
|
|
255
|
-
value: {
|
|
256
|
-
partA: {
|
|
257
|
-
value: values1
|
|
258
|
-
},
|
|
259
|
-
partB: {
|
|
260
|
-
value: values2
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
case 2:
|
|
266
|
-
result = _context2.sent;
|
|
267
|
-
expect(result.score).toEqual(score);
|
|
268
|
-
expect(result.max).toEqual(1);
|
|
269
|
-
|
|
270
|
-
case 5:
|
|
271
|
-
case "end":
|
|
272
|
-
return _context2.stop();
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}, _callee2);
|
|
276
|
-
})));
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
returnsScoreOf('both correct', ['yellow'], ['orange', 'c'], 1); // both correct
|
|
280
|
-
|
|
281
|
-
returnsScoreOf('both incorrect', ['green'], ['purple'], 0); // both wrong
|
|
282
|
-
|
|
283
|
-
returnsScoreOf('partA incorrect, partB correct', ['green'], ['orange', 'c'], 0); // first wrong, second correct
|
|
284
|
-
|
|
285
|
-
returnsScoreOf('partA correct, partB incorrect', ['yellow'], ['purple'], 0); // first correct, second wrong
|
|
286
|
-
});
|
|
287
|
-
describe('partial scoring', function () {
|
|
288
|
-
var returnsScoreOf = function returnsScoreOf(message, values1, values2, score) {
|
|
289
|
-
it("".concat(message, " => ").concat(score), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
290
|
-
var result;
|
|
291
|
-
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
292
|
-
while (1) {
|
|
293
|
-
switch (_context3.prev = _context3.next) {
|
|
294
|
-
case 0:
|
|
295
|
-
_context3.next = 2;
|
|
296
|
-
return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
|
|
297
|
-
partialScoring: true
|
|
298
|
-
}), {
|
|
299
|
-
value: {
|
|
300
|
-
partA: {
|
|
301
|
-
value: values1
|
|
302
|
-
},
|
|
303
|
-
partB: {
|
|
304
|
-
value: values2
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
case 2:
|
|
310
|
-
result = _context3.sent;
|
|
311
|
-
expect(result.score).toBeCloseTo(score);
|
|
312
|
-
expect(result.max).toEqual(2);
|
|
313
|
-
|
|
314
|
-
case 5:
|
|
315
|
-
case "end":
|
|
316
|
-
return _context3.stop();
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}, _callee3);
|
|
320
|
-
})));
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
returnsScoreOf('both correct', ['yellow'], ['orange', 'c'], 2);
|
|
324
|
-
returnsScoreOf('both incorrect', [], [], 0);
|
|
325
|
-
returnsScoreOf('partA correct, partB incorrect', ['yellow'], [], 1);
|
|
326
|
-
returnsScoreOf('partA correct, partB partially correct', ['yellow'], ['c'], 1);
|
|
327
|
-
returnsScoreOf('partA incorrect, partB correct', ['green'], ['orange', 'c'], 0);
|
|
328
|
-
returnsScoreOf('partA partially correct, partB correct', ['green', 'yellow'], ['orange', 'c'], 0);
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
var returnsScoreWhen = function returnsScoreWhen(session) {
|
|
332
|
-
it("returns empty: true if session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
333
|
-
var result;
|
|
334
|
-
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
335
|
-
while (1) {
|
|
336
|
-
switch (_context4.prev = _context4.next) {
|
|
337
|
-
case 0:
|
|
338
|
-
_context4.next = 2;
|
|
339
|
-
return (0, _index.outcome)(question, session);
|
|
340
|
-
|
|
341
|
-
case 2:
|
|
342
|
-
result = _context4.sent;
|
|
343
|
-
expect(result).toEqual({
|
|
344
|
-
score: 0,
|
|
345
|
-
scoreA: 0,
|
|
346
|
-
scoreB: 0,
|
|
347
|
-
empty: true
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
case 4:
|
|
351
|
-
case "end":
|
|
352
|
-
return _context4.stop();
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}, _callee4);
|
|
356
|
-
})));
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
returnsScoreWhen(undefined);
|
|
360
|
-
returnsScoreWhen(null);
|
|
361
|
-
returnsScoreWhen({});
|
|
362
|
-
});
|
|
363
|
-
describe('model', function () {
|
|
364
|
-
var capitalize = function capitalize(value) {
|
|
365
|
-
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
366
|
-
};
|
|
367
|
-
|
|
368
|
-
describe('mode: gather', function () {
|
|
369
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
370
|
-
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
371
|
-
while (1) {
|
|
372
|
-
switch (_context5.prev = _context5.next) {
|
|
373
|
-
case 0:
|
|
374
|
-
session = {};
|
|
375
|
-
env = {
|
|
376
|
-
mode: 'gather'
|
|
377
|
-
};
|
|
378
|
-
_context5.next = 4;
|
|
379
|
-
return (0, _index.model)(question, session, env);
|
|
380
|
-
|
|
381
|
-
case 4:
|
|
382
|
-
result = _context5.sent;
|
|
383
|
-
|
|
384
|
-
case 5:
|
|
385
|
-
case "end":
|
|
386
|
-
return _context5.stop();
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}, _callee5);
|
|
390
|
-
})));
|
|
391
|
-
it('returns disabled', function () {
|
|
392
|
-
expect(result.disabled).toEqual(false);
|
|
393
|
-
});
|
|
394
|
-
it('returns mode', function () {
|
|
395
|
-
expect(result.mode).toEqual('gather');
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
var returnsPrompt = function returnsPrompt(part) {
|
|
399
|
-
it("returns ".concat(part, " prompt"), function () {
|
|
400
|
-
expect(result[part].prompt).toEqual("prompt ".concat(part));
|
|
401
|
-
});
|
|
402
|
-
};
|
|
403
|
-
|
|
404
|
-
var returnsChoiceMode = function returnsChoiceMode(part) {
|
|
405
|
-
it("returns ".concat(part, " choiceMode"), function () {
|
|
406
|
-
expect(result[part].choiceMode).toEqual('checkbox');
|
|
407
|
-
});
|
|
408
|
-
};
|
|
409
|
-
|
|
410
|
-
var returnsKeyMode = function returnsKeyMode(part) {
|
|
411
|
-
it("returns ".concat(part, " choicePrefix"), function () {
|
|
412
|
-
expect(result[part].choicePrefix).toEqual('numbers');
|
|
413
|
-
});
|
|
414
|
-
};
|
|
415
|
-
|
|
416
|
-
var returnsComplete = function returnsComplete(part, min) {
|
|
417
|
-
it("returns ".concat(part, " complete"), function () {
|
|
418
|
-
expect(result[part].complete).toEqual({
|
|
419
|
-
min: min
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
};
|
|
423
|
-
|
|
424
|
-
var doesNotReturnCorrect = function doesNotReturnCorrect(part) {
|
|
425
|
-
it("does not return ".concat(part, " responseCorrect"), function () {
|
|
426
|
-
expect(result[part].responseCorrect).toBe(undefined);
|
|
427
|
-
});
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
var returnsChoices = function returnsChoices(part, value1, value2) {
|
|
431
|
-
it("returns ".concat(part, " choices"), function () {
|
|
432
|
-
expect(result[part].choices).toEqual(expect.arrayContaining([{
|
|
433
|
-
value: value1,
|
|
434
|
-
label: capitalize(value1),
|
|
435
|
-
rationale: null
|
|
436
|
-
}, {
|
|
437
|
-
value: value2,
|
|
438
|
-
label: capitalize(value2),
|
|
439
|
-
rationale: null
|
|
440
|
-
}]));
|
|
441
|
-
});
|
|
442
|
-
};
|
|
443
|
-
|
|
444
|
-
returnsPrompt(PART_A);
|
|
445
|
-
returnsPrompt(PART_B);
|
|
446
|
-
returnsChoiceMode(PART_A);
|
|
447
|
-
returnsChoiceMode(PART_B);
|
|
448
|
-
returnsKeyMode(PART_A);
|
|
449
|
-
returnsKeyMode(PART_B);
|
|
450
|
-
returnsComplete(PART_A, 1);
|
|
451
|
-
returnsComplete(PART_B, 2);
|
|
452
|
-
returnsChoices(PART_A, 'yellow', 'green');
|
|
453
|
-
returnsChoices(PART_B, 'orange', 'purple');
|
|
454
|
-
doesNotReturnCorrect(PART_A);
|
|
455
|
-
doesNotReturnCorrect(PART_B);
|
|
456
|
-
});
|
|
457
|
-
describe('model - with updateSession', function () {
|
|
458
|
-
it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
459
|
-
var updateSession;
|
|
460
|
-
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
461
|
-
while (1) {
|
|
462
|
-
switch (_context6.prev = _context6.next) {
|
|
463
|
-
case 0:
|
|
464
|
-
session = {
|
|
465
|
-
id: '1',
|
|
466
|
-
element: 'ebsr-element'
|
|
467
|
-
};
|
|
468
|
-
env = {
|
|
469
|
-
mode: 'gather'
|
|
470
|
-
};
|
|
471
|
-
updateSession = jest.fn().mockResolvedValue();
|
|
472
|
-
_context6.next = 5;
|
|
473
|
-
return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
|
|
474
|
-
partA: _objectSpread(_objectSpread({}, question.partA), {}, {
|
|
475
|
-
lockChoiceOrder: false
|
|
476
|
-
}),
|
|
477
|
-
partB: _objectSpread(_objectSpread({}, question.partB), {}, {
|
|
478
|
-
lockChoiceOrder: false
|
|
479
|
-
})
|
|
480
|
-
}), session, env, updateSession);
|
|
481
|
-
|
|
482
|
-
case 5:
|
|
483
|
-
expect(updateSession).toHaveBeenCalledWith('1', 'ebsr-element', {
|
|
484
|
-
shuffledValues: {
|
|
485
|
-
partA: expect.arrayContaining(['yellow', 'green']),
|
|
486
|
-
partB: expect.arrayContaining(['orange', 'purple'])
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
case 6:
|
|
491
|
-
case "end":
|
|
492
|
-
return _context6.stop();
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
}, _callee6);
|
|
496
|
-
})));
|
|
497
|
-
});
|
|
498
|
-
describe('model - without valid updateSession', function () {
|
|
499
|
-
var assertModel = function assertModel(updateSession) {
|
|
500
|
-
it("does not throw error if updateSession is ".concat(updateSession), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
501
|
-
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
502
|
-
while (1) {
|
|
503
|
-
switch (_context7.prev = _context7.next) {
|
|
504
|
-
case 0:
|
|
505
|
-
session = {
|
|
506
|
-
id: '1',
|
|
507
|
-
element: 'ebsr-element',
|
|
508
|
-
shuffledValues: {
|
|
509
|
-
partA: [],
|
|
510
|
-
partB: []
|
|
511
|
-
}
|
|
512
|
-
};
|
|
513
|
-
env = {
|
|
514
|
-
mode: 'gather'
|
|
515
|
-
};
|
|
516
|
-
_context7.next = 4;
|
|
517
|
-
return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
|
|
518
|
-
partA: _objectSpread(_objectSpread({}, question.partA), {}, {
|
|
519
|
-
lockChoiceOrder: false
|
|
520
|
-
}),
|
|
521
|
-
partB: _objectSpread(_objectSpread({}, question.partB), {}, {
|
|
522
|
-
lockChoiceOrder: false
|
|
523
|
-
})
|
|
524
|
-
}), session, env);
|
|
525
|
-
|
|
526
|
-
case 4:
|
|
527
|
-
case "end":
|
|
528
|
-
return _context7.stop();
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
}, _callee7);
|
|
532
|
-
})));
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
assertModel(undefined);
|
|
536
|
-
assertModel(null);
|
|
537
|
-
assertModel('text');
|
|
538
|
-
});
|
|
539
|
-
describe('mode: view', function () {
|
|
540
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
541
|
-
return _regenerator["default"].wrap(function _callee8$(_context8) {
|
|
542
|
-
while (1) {
|
|
543
|
-
switch (_context8.prev = _context8.next) {
|
|
544
|
-
case 0:
|
|
545
|
-
session = {};
|
|
546
|
-
env = {
|
|
547
|
-
mode: 'view'
|
|
548
|
-
};
|
|
549
|
-
_context8.next = 4;
|
|
550
|
-
return (0, _index.model)(question, session, env);
|
|
551
|
-
|
|
552
|
-
case 4:
|
|
553
|
-
result = _context8.sent;
|
|
554
|
-
|
|
555
|
-
case 5:
|
|
556
|
-
case "end":
|
|
557
|
-
return _context8.stop();
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
}, _callee8);
|
|
561
|
-
})));
|
|
562
|
-
it('returns disabled', function () {
|
|
563
|
-
expect(result.disabled).toEqual(true);
|
|
564
|
-
});
|
|
565
|
-
});
|
|
566
|
-
describe('mode: evaluate', function () {
|
|
567
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
568
|
-
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
569
|
-
while (1) {
|
|
570
|
-
switch (_context9.prev = _context9.next) {
|
|
571
|
-
case 0:
|
|
572
|
-
session = {};
|
|
573
|
-
env = {
|
|
574
|
-
mode: 'evaluate'
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
_utils.isResponseCorrect.mockReturnValue(false);
|
|
578
|
-
|
|
579
|
-
_context9.next = 5;
|
|
580
|
-
return (0, _index.model)(question, session, env);
|
|
581
|
-
|
|
582
|
-
case 5:
|
|
583
|
-
result = _context9.sent;
|
|
584
|
-
return _context9.abrupt("return", result);
|
|
585
|
-
|
|
586
|
-
case 7:
|
|
587
|
-
case "end":
|
|
588
|
-
return _context9.stop();
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
}, _callee9);
|
|
592
|
-
})));
|
|
593
|
-
|
|
594
|
-
var returnsChoicesWCorrect = function returnsChoicesWCorrect(part, value1, value2) {
|
|
595
|
-
it("returns ".concat(part, " choices w/ correct"), function () {
|
|
596
|
-
expect(result[part].choices).toEqual(expect.arrayContaining([{
|
|
597
|
-
value: value1,
|
|
598
|
-
label: capitalize(value1),
|
|
599
|
-
correct: true,
|
|
600
|
-
feedback: 'foo',
|
|
601
|
-
rationale: null
|
|
602
|
-
}, {
|
|
603
|
-
value: value2,
|
|
604
|
-
label: capitalize(value2),
|
|
605
|
-
correct: false,
|
|
606
|
-
feedback: 'Incorrect',
|
|
607
|
-
rationale: null
|
|
608
|
-
}]));
|
|
609
|
-
});
|
|
610
|
-
};
|
|
611
|
-
|
|
612
|
-
var returnsChoicesWCorrectFeedbackDisabled = function returnsChoicesWCorrectFeedbackDisabled(part, value1, value2) {
|
|
613
|
-
// feedback enabled for partB and disabled for partA
|
|
614
|
-
it("returns ".concat(part, " choices w/ correct even if feedbackEnabled is false"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
615
|
-
var res;
|
|
616
|
-
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
617
|
-
while (1) {
|
|
618
|
-
switch (_context10.prev = _context10.next) {
|
|
619
|
-
case 0:
|
|
620
|
-
_context10.next = 2;
|
|
621
|
-
return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
|
|
622
|
-
partA: _objectSpread(_objectSpread({}, question.partA), {}, {
|
|
623
|
-
feedbackEnabled: false
|
|
624
|
-
}),
|
|
625
|
-
partB: _objectSpread(_objectSpread({}, question.partB), {}, {
|
|
626
|
-
feedbackEnabled: false
|
|
627
|
-
})
|
|
628
|
-
}), session, env);
|
|
629
|
-
|
|
630
|
-
case 2:
|
|
631
|
-
res = _context10.sent;
|
|
632
|
-
expect(result[part].choices).toEqual(expect.arrayContaining([{
|
|
633
|
-
value: value1,
|
|
634
|
-
label: capitalize(value1),
|
|
635
|
-
correct: true,
|
|
636
|
-
feedback: 'foo',
|
|
637
|
-
rationale: null
|
|
638
|
-
}, {
|
|
639
|
-
value: value2,
|
|
640
|
-
label: capitalize(value2),
|
|
641
|
-
correct: false,
|
|
642
|
-
feedback: 'Incorrect',
|
|
643
|
-
rationale: null
|
|
644
|
-
}]));
|
|
645
|
-
|
|
646
|
-
case 4:
|
|
647
|
-
case "end":
|
|
648
|
-
return _context10.stop();
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
}, _callee10);
|
|
652
|
-
})));
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
var returnsIsResponseCorrect = function returnsIsResponseCorrect(part) {
|
|
656
|
-
it("returns ".concat(part, " is response correct"), function () {
|
|
657
|
-
expect(result[part].responseCorrect).toEqual(false);
|
|
658
|
-
});
|
|
659
|
-
}; // Second param will be correct (yellow for A; orange for B)
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
returnsChoicesWCorrect(PART_A, 'yellow', 'green');
|
|
663
|
-
returnsChoicesWCorrect(PART_B, 'orange', 'purple'); // Second param will be correct (yellow for A; orange for B)
|
|
664
|
-
|
|
665
|
-
returnsChoicesWCorrectFeedbackDisabled(PART_A, 'yellow', 'green');
|
|
666
|
-
returnsChoicesWCorrectFeedbackDisabled(PART_B, 'orange', 'purple');
|
|
667
|
-
returnsIsResponseCorrect(PART_A);
|
|
668
|
-
returnsIsResponseCorrect(PART_B);
|
|
669
|
-
});
|
|
670
|
-
describe('correct response', function () {
|
|
671
|
-
it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
672
|
-
var sess;
|
|
673
|
-
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
674
|
-
while (1) {
|
|
675
|
-
switch (_context11.prev = _context11.next) {
|
|
676
|
-
case 0:
|
|
677
|
-
_context11.next = 2;
|
|
678
|
-
return (0, _index.createCorrectResponseSession)(question, {
|
|
679
|
-
mode: 'gather',
|
|
680
|
-
role: 'instructor'
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
case 2:
|
|
684
|
-
sess = _context11.sent;
|
|
685
|
-
expect(sess).toEqual({
|
|
686
|
-
id: '1',
|
|
687
|
-
value: {
|
|
688
|
-
partA: {
|
|
689
|
-
id: 'partA',
|
|
690
|
-
value: ['yellow']
|
|
691
|
-
},
|
|
692
|
-
partB: {
|
|
693
|
-
id: 'partB',
|
|
694
|
-
value: ['orange', 'c']
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
});
|
|
698
|
-
|
|
699
|
-
case 4:
|
|
700
|
-
case "end":
|
|
701
|
-
return _context11.stop();
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}, _callee11);
|
|
705
|
-
})));
|
|
706
|
-
it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
707
|
-
var noResult;
|
|
708
|
-
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
709
|
-
while (1) {
|
|
710
|
-
switch (_context12.prev = _context12.next) {
|
|
711
|
-
case 0:
|
|
712
|
-
_context12.next = 2;
|
|
713
|
-
return (0, _index.createCorrectResponseSession)(question, {
|
|
714
|
-
mode: 'gather',
|
|
715
|
-
role: 'student'
|
|
716
|
-
});
|
|
717
|
-
|
|
718
|
-
case 2:
|
|
719
|
-
noResult = _context12.sent;
|
|
720
|
-
expect(noResult).toBeNull();
|
|
721
|
-
|
|
722
|
-
case 4:
|
|
723
|
-
case "end":
|
|
724
|
-
return _context12.stop();
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
}, _callee12);
|
|
728
|
-
})));
|
|
729
|
-
});
|
|
730
|
-
});
|
|
731
|
-
});
|
|
732
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJQQVJUX0EiLCJQQVJUX0IiLCJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJwYXJ0QSIsImNob2ljZU1vZGUiLCJmZWVkYmFja0VuYWJsZWQiLCJjaG9pY2VzIiwidmFsdWUiLCJsYWJlbCIsImNvcnJlY3QiLCJmZWVkYmFjayIsInR5cGUiLCJjaG9pY2VQcmVmaXgiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwibG9ja0Nob2ljZU9yZGVyIiwicGFydGlhbFNjb3JpbmciLCJwYXJ0QiIsIm1rUXVlc3Rpb24iLCJleHRyYSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwidmFsdWUxIiwidmFsdWUyIiwiZXhwZWN0ZWQiLCJleHBlY3RlZE1heCIsIml0IiwiZXhwZWN0Iiwic2NvcmUiLCJ0b0VxdWFsIiwibWF4IiwibW9kZSIsInJldHVybnNTY29yZU9mIiwidmFsdWVzMSIsInZhbHVlczIiLCJ0b0JlQ2xvc2VUbyIsInJldHVybnNTY29yZVdoZW4iLCJKU09OIiwic3RyaW5naWZ5Iiwic2NvcmVBIiwic2NvcmVCIiwiZW1wdHkiLCJ1bmRlZmluZWQiLCJjYXBpdGFsaXplIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsImRpc2FibGVkIiwicmV0dXJuc1Byb21wdCIsInBhcnQiLCJyZXR1cm5zQ2hvaWNlTW9kZSIsInJldHVybnNLZXlNb2RlIiwicmV0dXJuc0NvbXBsZXRlIiwibWluIiwiY29tcGxldGUiLCJkb2VzTm90UmV0dXJuQ29ycmVjdCIsInJlc3BvbnNlQ29ycmVjdCIsInRvQmUiLCJyZXR1cm5zQ2hvaWNlcyIsImFycmF5Q29udGFpbmluZyIsInJhdGlvbmFsZSIsImlkIiwiZWxlbWVudCIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJhc3NlcnRNb2RlbCIsIm1vY2tSZXR1cm5WYWx1ZSIsInJldHVybnNDaG9pY2VzV0NvcnJlY3QiLCJyZXR1cm5zQ2hvaWNlc1dDb3JyZWN0RmVlZGJhY2tEaXNhYmxlZCIsInJlcyIsInJldHVybnNJc1Jlc3BvbnNlQ29ycmVjdCIsInJvbGUiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQSxJQUFNQSxNQUFNLEdBQUcsT0FBZjtBQUNBLElBQU1DLE1BQU0sR0FBRyxPQUFmO0FBRUFDLElBQUksQ0FBQ0MsSUFBTCxDQUFVLFVBQVYsRUFBc0I7QUFBQSxTQUFPO0FBQzNCQyxJQUFBQSxpQkFBaUIsRUFBRUYsSUFBSSxDQUFDRyxFQUFMO0FBRFEsR0FBUDtBQUFBLENBQXRCO0FBSUFDLFFBQVEsQ0FBQyxZQUFELEVBQWUsWUFBTTtBQUMzQixNQUFJQyxNQUFKLEVBQVlDLFFBQVosRUFBc0JDLE9BQXRCLEVBQStCQyxHQUEvQjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNmSCxJQUFBQSxRQUFRLEdBQUc7QUFDVEksTUFBQUEsS0FBSyxFQUFFO0FBQ0xDLFFBQUFBLFVBQVUsRUFBRSxVQURQO0FBRUxDLFFBQUFBLGVBQWUsRUFBRSxJQUZaO0FBR0xDLFFBQUFBLE9BQU8sRUFBRSxDQUNQO0FBQ0VDLFVBQUFBLEtBQUssRUFBRSxRQURUO0FBRUVDLFVBQUFBLEtBQUssRUFBRSxRQUZUO0FBR0VDLFVBQUFBLE9BQU8sRUFBRSxJQUhYO0FBSUVDLFVBQUFBLFFBQVEsRUFBRTtBQUNSQyxZQUFBQSxJQUFJLEVBQUUsUUFERTtBQUVSSixZQUFBQSxLQUFLLEVBQUU7QUFGQztBQUpaLFNBRE8sRUFVUDtBQUNFQSxVQUFBQSxLQUFLLEVBQUUsT0FEVDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsT0FGVDtBQUdFRSxV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QUFDZ0QsUUFBRCxDQUFOLENBQWlCQyxRQUFqQjs7QUFMZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBaEMsR0FBRjtBQU9ELEtBdEJPLENBQVI7QUF1QkQsR0ExUU8sQ0FBUjtBQTJRRCxDQXBrQk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNSZXNwb25zZUNvcnJlY3QgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IFBBUlRfQSA9ICdwYXJ0QSc7XG5jb25zdCBQQVJUX0IgPSAncGFydEInO1xuXG5qZXN0Lm1vY2soJy4uL3V0aWxzJywgKCkgPT4gKHtcbiAgaXNSZXNwb25zZUNvcnJlY3Q6IGplc3QuZm4oKSxcbn0pKTtcblxuZGVzY3JpYmUoJ2NvbnRyb2xsZXInLCAoKSA9PiB7XG4gIGxldCByZXN1bHQsIHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnY7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcXVlc3Rpb24gPSB7XG4gICAgICBwYXJ0QToge1xuICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ3llbGxvdycsXG4gICAgICAgICAgICBsYWJlbDogJ1llbGxvdycsXG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2dyZWVuJyxcbiAgICAgICAgICAgIGxhYmVsOiAnR3JlZW4nLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICAgICAgcHJvbXB0OiBgcHJvbXB0ICR7UEFSVF9BfWAsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHBhcnRCOiB7XG4gICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnb3JhbmdlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncHVycGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJyxcbiAgICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2MnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICAgICAgcHJvbXB0OiBgcHJvbXB0ICR7UEFSVF9CfWAsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZSBwYXJ0aWFsU2NvcmluZyB0ZXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IG1rUXVlc3Rpb24gPSAoZXh0cmEpID0+ICh7XG4gICAgICBwYXJ0QToge1xuICAgICAgICBjaG9pY2VNb2RlOiAncmFkaW8nLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ3llbGxvdycsXG4gICAgICAgICAgICBsYWJlbDogJ1llbGxvdycsXG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2JsdWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdCbHVlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnZ3JlZW4nLFxuICAgICAgICAgICAgbGFiZWw6ICdHcmVlbicsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNob2ljZVByZWZpeDogJ251bWJlcnMnLFxuICAgICAgICBwcm9tcHQ6IGBwcm9tcHQgJHtQQVJUX0F9YCxcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHBhcnRCOiB7XG4gICAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnb3JhbmdlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncmVkJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncHVycGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJyxcbiAgICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY2hvaWNlUHJlZml4OiAnbnVtYmVycycsXG4gICAgICAgIHByb21wdDogYHByb21wdCAke1BBUlRfQn1gLFxuICAgICAgICBwcm9tcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICB9LFxuICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgLi4uZXh0cmEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCB2YWx1ZTEsIHZhbHVlMiwgZW52LCBleHBlY3RlZCwgZXhwZWN0ZWRNYXgpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBta1F1ZXN0aW9uKGV4dHJhKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyB2YWx1ZTogeyBwYXJ0QTogeyB2YWx1ZTogdmFsdWUxIH0sIHBhcnRCOiB7IHZhbHVlOiB2YWx1ZTIgfSB9IH0sIGVudik7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgICBleHBlY3QocmVzdWx0Lm1heCkudG9FcXVhbChleHBlY3RlZE1heCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgcGFydEEgY29ycmVjdCwgcGFydEIgY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdycsICdibHVlJ10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMixcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIGNvcnJlY3QsIHBhcnRCIHBhcnRpYWxseSBjb3JyZWN0JyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIFsneWVsbG93JywgJ2JsdWUnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgWyd5ZWxsb3cnLCAnYmx1ZSddLFxuICAgICAgW10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgW10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIHBhcnRpYWxseSBjb3JyZWN0LCBwYXJ0QiBwYXJ0aWFsbHkgY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdyddLFxuICAgICAgWydvcmFuZ2UnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIGluY29ycmVjdCwgcGFydEIgcGFydGlhbGx5IGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgWyd5ZWxsb3cnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGluY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdyddLFxuICAgICAgWydvcmFuZ2UnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICBbJ3llbGxvdycsICdibHVlJ10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFsneWVsbG93J10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFsneWVsbG93JywgJ2JsdWUnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgcGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdkaWNob3RvbW91cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJldHVybnNTY29yZU9mID0gKG1lc3NhZ2UsIHZhbHVlczEsIHZhbHVlczIsIHNjb3JlKSA9PiB7XG4gICAgICAgIGl0KGAke21lc3NhZ2V9ID0+ICR7c2NvcmV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAgICB7IC4uLnF1ZXN0aW9uLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6IHsgcGFydEE6IHsgdmFsdWU6IHZhbHVlczEgfSwgcGFydEI6IHsgdmFsdWU6IHZhbHVlczIgfSB9IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKHNjb3JlKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0Lm1heCkudG9FcXVhbCgxKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm5zU2NvcmVPZignYm90aCBjb3JyZWN0JywgWyd5ZWxsb3cnXSwgWydvcmFuZ2UnLCAnYyddLCAxKTsgLy8gYm90aCBjb3JyZWN0XG4gICAgICByZXR1cm5zU2NvcmVPZignYm90aCBpbmNvcnJlY3QnLCBbJ2dyZWVuJ10sIFsncHVycGxlJ10sIDApOyAvLyBib3RoIHdyb25nXG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbiddLCBbJ29yYW5nZScsICdjJ10sIDApOyAvLyBmaXJzdCB3cm9uZywgc2Vjb25kIGNvcnJlY3RcbiAgICAgIHJldHVybnNTY29yZU9mKCdwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ3B1cnBsZSddLCAwKTsgLy8gZmlyc3QgY29ycmVjdCwgc2Vjb25kIHdyb25nXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFydGlhbCBzY29yaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmV0dXJuc1Njb3JlT2YgPSAobWVzc2FnZSwgdmFsdWVzMSwgdmFsdWVzMiwgc2NvcmUpID0+IHtcbiAgICAgICAgaXQoYCR7bWVzc2FnZX0gPT4gJHtzY29yZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICAgIHsgLi4ucXVlc3Rpb24sIHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiB7IHBhcnRBOiB7IHZhbHVlOiB2YWx1ZXMxIH0sIHBhcnRCOiB7IHZhbHVlOiB2YWx1ZXMyIH0gfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9CZUNsb3NlVG8oc2NvcmUpO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQubWF4KS50b0VxdWFsKDIpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybnNTY29yZU9mKCdib3RoIGNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ29yYW5nZScsICdjJ10sIDIpO1xuICAgICAgcmV0dXJuc1Njb3JlT2YoJ2JvdGggaW5jb3JyZWN0JywgW10sIFtdLCAwKTtcbiAgICAgIHJldHVybnNTY29yZU9mKCdwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLCBbJ3llbGxvdyddLCBbXSwgMSk7XG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgY29ycmVjdCwgcGFydEIgcGFydGlhbGx5IGNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ2MnXSwgMSk7XG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbiddLCBbJ29yYW5nZScsICdjJ10sIDApO1xuICAgICAgcmV0dXJuc1Njb3JlT2YoJ3BhcnRBIHBhcnRpYWxseSBjb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbicsICd5ZWxsb3cnXSwgWydvcmFuZ2UnLCAnYyddLCAwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybnNTY29yZVdoZW4gPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHJldHVybnMgZW1wdHk6IHRydWUgaWYgc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyBzY29yZTogMCwgc2NvcmVBOiAwLCBzY29yZUI6IDAsIGVtcHR5OiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybnNTY29yZVdoZW4odW5kZWZpbmVkKTtcbiAgICByZXR1cm5zU2NvcmVXaGVuKG51bGwpO1xuICAgIHJldHVybnNTY29yZVdoZW4oe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgY29uc3QgY2FwaXRhbGl6ZSA9ICh2YWx1ZSkgPT4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiBnYXRoZXInLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmRpc2FibGVkKS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBtb2RlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0Lm1vZGUpLnRvRXF1YWwoJ2dhdGhlcicpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJldHVybnNQcm9tcHQgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IHByb21wdGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLnByb21wdCkudG9FcXVhbChgcHJvbXB0ICR7cGFydH1gKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlTW9kZSA9IChwYXJ0KSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlTW9kZWAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZU1vZGUpLnRvRXF1YWwoJ2NoZWNrYm94Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmV0dXJuc0tleU1vZGUgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IGNob2ljZVByZWZpeGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZVByZWZpeCkudG9FcXVhbCgnbnVtYmVycycpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJldHVybnNDb21wbGV0ZSA9IChwYXJ0LCBtaW4pID0+IHtcbiAgICAgICAgaXQoYHJldHVybnMgJHtwYXJ0fSBjb21wbGV0ZWAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNvbXBsZXRlKS50b0VxdWFsKHsgbWluIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGRvZXNOb3RSZXR1cm5Db3JyZWN0ID0gKHBhcnQpID0+IHtcbiAgICAgICAgaXQoYGRvZXMgbm90IHJldHVybiAke3BhcnR9IHJlc3BvbnNlQ29ycmVjdGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLnJlc3BvbnNlQ29ycmVjdCkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJldHVybnNDaG9pY2VzID0gKHBhcnQsIHZhbHVlMSwgdmFsdWUyKSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlc2AsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgeyB2YWx1ZTogdmFsdWUxLCBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogdmFsdWUyLCBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTIpLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuc1Byb21wdChQQVJUX0EpO1xuICAgICAgcmV0dXJuc1Byb21wdChQQVJUX0IpO1xuXG4gICAgICByZXR1cm5zQ2hvaWNlTW9kZShQQVJUX0EpO1xuICAgICAgcmV0dXJuc0Nob2ljZU1vZGUoUEFSVF9CKTtcblxuICAgICAgcmV0dXJuc0tleU1vZGUoUEFSVF9BKTtcbiAgICAgIHJldHVybnNLZXlNb2RlKFBBUlRfQik7XG5cbiAgICAgIHJldHVybnNDb21wbGV0ZShQQVJUX0EsIDEpO1xuICAgICAgcmV0dXJuc0NvbXBsZXRlKFBBUlRfQiwgMik7XG5cbiAgICAgIHJldHVybnNDaG9pY2VzKFBBUlRfQSwgJ3llbGxvdycsICdncmVlbicpO1xuICAgICAgcmV0dXJuc0Nob2ljZXMoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICBkb2VzTm90UmV0dXJuQ29ycmVjdChQQVJUX0EpO1xuICAgICAgZG9lc05vdFJldHVybkNvcnJlY3QoUEFSVF9CKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlbCAtIHdpdGggdXBkYXRlU2Vzc2lvbicsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyB1cGRhdGVTZXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0geyBpZDogJzEnLCBlbGVtZW50OiAnZWJzci1lbGVtZW50JyB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcbiAgICAgICAgYXdhaXQgbW9kZWwoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBwYXJ0QToge1xuICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QSxcbiAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJ0Qjoge1xuICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QixcbiAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAnZWJzci1lbGVtZW50Jywge1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiB7XG4gICAgICAgICAgICBwYXJ0QTogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbJ3llbGxvdycsICdncmVlbiddKSxcbiAgICAgICAgICAgIHBhcnRCOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsnb3JhbmdlJywgJ3B1cnBsZSddKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aG91dCB2YWxpZCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXNzZXJ0TW9kZWwgPSAodXBkYXRlU2Vzc2lvbikgPT4ge1xuICAgICAgICBpdChgZG9lcyBub3QgdGhyb3cgZXJyb3IgaWYgdXBkYXRlU2Vzc2lvbiBpcyAke3VwZGF0ZVNlc3Npb259YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2Vic3ItZWxlbWVudCcsXG4gICAgICAgICAgICBzaHVmZmxlZFZhbHVlczogeyBwYXJ0QTogW10sIHBhcnRCOiBbXSB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuXG4gICAgICAgICAgYXdhaXQgbW9kZWwoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICBwYXJ0QToge1xuICAgICAgICAgICAgICAgIC4uLnF1ZXN0aW9uLnBhcnRBLFxuICAgICAgICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcnRCOiB7XG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb24ucGFydEIsXG4gICAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgYXNzZXJ0TW9kZWwodW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydE1vZGVsKG51bGwpO1xuICAgICAgYXNzZXJ0TW9kZWwoJ3RleHQnKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiB2aWV3JywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiBldmFsdWF0ZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2V2YWx1YXRlJyB9O1xuICAgICAgICBpc1Jlc3BvbnNlQ29ycmVjdC5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlc1dDb3JyZWN0ID0gKHBhcnQsIHZhbHVlMSwgdmFsdWUyKSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlcyB3LyBjb3JyZWN0YCwgKCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHRbcGFydF0uY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlMSxcbiAgICAgICAgICAgICAgICBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZTIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNhcGl0YWxpemUodmFsdWUyKSxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlc1dDb3JyZWN0RmVlZGJhY2tEaXNhYmxlZCA9IChwYXJ0LCB2YWx1ZTEsIHZhbHVlMikgPT4ge1xuICAgICAgICAvLyBmZWVkYmFjayBlbmFibGVkIGZvciBwYXJ0QiBhbmQgZGlzYWJsZWQgZm9yIHBhcnRBXG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlcyB3LyBjb3JyZWN0IGV2ZW4gaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAgIHBhcnRBOiB7XG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb24ucGFydEEsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGFydEI6IHtcbiAgICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QixcbiAgICAgICAgICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChyZXN1bHRbcGFydF0uY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlMSxcbiAgICAgICAgICAgICAgICBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZTIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNhcGl0YWxpemUodmFsdWUyKSxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zSXNSZXNwb25zZUNvcnJlY3QgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IGlzIHJlc3BvbnNlIGNvcnJlY3RgLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdFtwYXJ0XS5yZXNwb25zZUNvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFNlY29uZCBwYXJhbSB3aWxsIGJlIGNvcnJlY3QgKHllbGxvdyBmb3IgQTsgb3JhbmdlIGZvciBCKVxuICAgICAgcmV0dXJuc0Nob2ljZXNXQ29ycmVjdChQQVJUX0EsICd5ZWxsb3cnLCAnZ3JlZW4nKTtcbiAgICAgIHJldHVybnNDaG9pY2VzV0NvcnJlY3QoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICAvLyBTZWNvbmQgcGFyYW0gd2lsbCBiZSBjb3JyZWN0ICh5ZWxsb3cgZm9yIEE7IG9yYW5nZSBmb3IgQilcbiAgICAgIHJldHVybnNDaG9pY2VzV0NvcnJlY3RGZWVkYmFja0Rpc2FibGVkKFBBUlRfQSwgJ3llbGxvdycsICdncmVlbicpO1xuICAgICAgcmV0dXJuc0Nob2ljZXNXQ29ycmVjdEZlZWRiYWNrRGlzYWJsZWQoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICByZXR1cm5zSXNSZXNwb25zZUNvcnJlY3QoUEFSVF9BKTtcbiAgICAgIHJldHVybnNJc1Jlc3BvbnNlQ29ycmVjdChQQVJUX0IpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHtcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBwYXJ0QTogeyBpZDogJ3BhcnRBJywgdmFsdWU6IFsneWVsbG93J10gfSxcbiAgICAgICAgICAgIHBhcnRCOiB7IGlkOiAncGFydEInLCB2YWx1ZTogWydvcmFuZ2UnLCAnYyddIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbnVsbCBlbnYgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|