@pie-element/multiple-choice 7.0.0 → 7.1.0-test

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,864 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
6
+
7
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
+
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+
13
+ var _index = require("../index");
14
+
15
+ var _utils = require("../utils");
16
+
17
+ var _defaults = _interopRequireDefault(require("../defaults"));
18
+
19
+ var _templateObject, _templateObject2, _templateObject3;
20
+
21
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
22
+
23
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
+
25
+ jest.mock('../utils', function () {
26
+ return {
27
+ isResponseCorrect: jest.fn()
28
+ };
29
+ });
30
+ describe('controller', function () {
31
+ var result, question, session, env;
32
+ beforeEach(function () {
33
+ question = {
34
+ id: '1',
35
+ element: 'multiple-choice',
36
+ prompt: 'prompt',
37
+ promptEnabled: true,
38
+ choicePrefix: 'letters',
39
+ choiceMode: 'radio',
40
+ feedbackEnabled: true,
41
+ choices: [{
42
+ label: 'a',
43
+ value: 'apple',
44
+ correct: true,
45
+ feedback: {
46
+ type: 'custom',
47
+ value: 'foo'
48
+ }
49
+ }, {
50
+ label: 'b',
51
+ value: 'banana',
52
+ feedback: {
53
+ type: 'default'
54
+ }
55
+ }]
56
+ };
57
+ });
58
+ var stringify = JSON.stringify;
59
+ describe('model', function () {
60
+ describe('mode: gather', function () {
61
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
62
+ return _regenerator["default"].wrap(function _callee$(_context) {
63
+ while (1) {
64
+ switch (_context.prev = _context.next) {
65
+ case 0:
66
+ session = {};
67
+ env = {
68
+ mode: 'gather'
69
+ };
70
+ _context.next = 4;
71
+ return (0, _index.model)(question, session, env);
72
+
73
+ case 4:
74
+ result = _context.sent;
75
+
76
+ case 5:
77
+ case "end":
78
+ return _context.stop();
79
+ }
80
+ }
81
+ }, _callee);
82
+ })));
83
+ it('returns disabled', function () {
84
+ expect(result.disabled).toEqual(false);
85
+ });
86
+ it('returns mode', function () {
87
+ expect(result.mode).toEqual('gather');
88
+ });
89
+ it('returns prompt', function () {
90
+ expect(result.prompt).toEqual('prompt');
91
+ });
92
+ it('returns choiceMode', function () {
93
+ expect(result.choiceMode).toEqual('radio');
94
+ });
95
+ it('returns choicePrefix', function () {
96
+ expect(result.keyMode).toEqual('letters');
97
+ });
98
+ it('returns choices', function () {
99
+ expect(result.choices).toEqual(expect.arrayContaining([{
100
+ label: 'a',
101
+ value: 'apple',
102
+ rationale: null
103
+ }, {
104
+ label: 'b',
105
+ value: 'banana',
106
+ rationale: null
107
+ }]));
108
+ });
109
+ it('does not return responseCorrect', function () {
110
+ expect(result.responseCorrect).toBe(undefined);
111
+ });
112
+ });
113
+ describe('model - with updateSession', function () {
114
+ it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
115
+ var updateSession;
116
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
117
+ while (1) {
118
+ switch (_context2.prev = _context2.next) {
119
+ case 0:
120
+ session = {
121
+ id: '1',
122
+ element: 'multiple-choice'
123
+ };
124
+ env = {
125
+ mode: 'gather'
126
+ };
127
+ updateSession = jest.fn().mockResolvedValue();
128
+ _context2.next = 5;
129
+ return (0, _index.model)(question, session, env, updateSession);
130
+
131
+ case 5:
132
+ expect(updateSession).toHaveBeenCalledWith('1', 'multiple-choice', {
133
+ shuffledValues: expect.arrayContaining(['apple', 'banana'])
134
+ });
135
+
136
+ case 6:
137
+ case "end":
138
+ return _context2.stop();
139
+ }
140
+ }
141
+ }, _callee2);
142
+ })));
143
+ });
144
+ describe('mode: view', function () {
145
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
146
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
147
+ while (1) {
148
+ switch (_context3.prev = _context3.next) {
149
+ case 0:
150
+ session = {};
151
+ env = {
152
+ mode: 'view'
153
+ };
154
+ _context3.next = 4;
155
+ return (0, _index.model)(question, session, env);
156
+
157
+ case 4:
158
+ result = _context3.sent;
159
+
160
+ case 5:
161
+ case "end":
162
+ return _context3.stop();
163
+ }
164
+ }
165
+ }, _callee3);
166
+ })));
167
+ it('returns disabled', function () {
168
+ expect(result.disabled).toEqual(true);
169
+ });
170
+ });
171
+ describe('mode: evaluate', function () {
172
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
173
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
174
+ while (1) {
175
+ switch (_context4.prev = _context4.next) {
176
+ case 0:
177
+ session = {};
178
+ env = {
179
+ mode: 'evaluate'
180
+ };
181
+
182
+ _utils.isResponseCorrect.mockReturnValue(false);
183
+
184
+ _context4.next = 5;
185
+ return (0, _index.model)(question, session, env);
186
+
187
+ case 5:
188
+ result = _context4.sent;
189
+ return _context4.abrupt("return", result);
190
+
191
+ case 7:
192
+ case "end":
193
+ return _context4.stop();
194
+ }
195
+ }
196
+ }, _callee4);
197
+ })));
198
+ it('returns choices w/ correct', function () {
199
+ expect(result.choices).toEqual(expect.arrayContaining([{
200
+ label: 'a',
201
+ value: 'apple',
202
+ correct: true,
203
+ feedback: 'foo',
204
+ rationale: null
205
+ }, {
206
+ label: 'b',
207
+ value: 'banana',
208
+ correct: false,
209
+ feedback: 'Incorrect',
210
+ rationale: null
211
+ }]));
212
+ });
213
+ it('returns choices w/ correct even if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
214
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
215
+ while (1) {
216
+ switch (_context5.prev = _context5.next) {
217
+ case 0:
218
+ _context5.next = 2;
219
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
220
+ feedbackEnabled: false
221
+ }), session, env, jest.fn());
222
+
223
+ case 2:
224
+ result = _context5.sent;
225
+ expect(result.choices).toEqual(expect.arrayContaining([{
226
+ label: 'a',
227
+ value: 'apple',
228
+ correct: true,
229
+ feedback: undefined,
230
+ rationale: null
231
+ }, {
232
+ label: 'b',
233
+ value: 'banana',
234
+ correct: false,
235
+ feedback: undefined,
236
+ rationale: null
237
+ }]));
238
+
239
+ case 4:
240
+ case "end":
241
+ return _context5.stop();
242
+ }
243
+ }
244
+ }, _callee5);
245
+ })));
246
+ it('returns feedback undefined if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
247
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
248
+ while (1) {
249
+ switch (_context6.prev = _context6.next) {
250
+ case 0:
251
+ _context6.next = 2;
252
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
253
+ feedbackEnabled: false
254
+ }), session, env, jest.fn());
255
+
256
+ case 2:
257
+ result = _context6.sent;
258
+ expect(result.choices).toEqual(expect.arrayContaining([{
259
+ label: 'a',
260
+ value: 'apple',
261
+ correct: true,
262
+ feedback: undefined,
263
+ rationale: null
264
+ }, {
265
+ label: 'b',
266
+ value: 'banana',
267
+ correct: false,
268
+ feedback: undefined,
269
+ rationale: null
270
+ }]));
271
+
272
+ case 4:
273
+ case "end":
274
+ return _context6.stop();
275
+ }
276
+ }
277
+ }, _callee6);
278
+ })));
279
+ it('returns proper feedback if feedbackEnabled is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
280
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
281
+ while (1) {
282
+ switch (_context7.prev = _context7.next) {
283
+ case 0:
284
+ _context7.next = 2;
285
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
286
+ feedbackEnabled: true
287
+ }), session, env, jest.fn());
288
+
289
+ case 2:
290
+ result = _context7.sent;
291
+ expect(result.choices).toEqual(expect.arrayContaining([{
292
+ label: 'a',
293
+ value: 'apple',
294
+ correct: true,
295
+ feedback: 'foo',
296
+ rationale: null
297
+ }, {
298
+ label: 'b',
299
+ value: 'banana',
300
+ correct: false,
301
+ feedback: 'Incorrect',
302
+ rationale: null
303
+ }]));
304
+
305
+ case 4:
306
+ case "end":
307
+ return _context7.stop();
308
+ }
309
+ }
310
+ }, _callee7);
311
+ })));
312
+ it('returns is response correct', function () {
313
+ expect(result.responseCorrect).toEqual(false);
314
+ });
315
+
316
+ var returnsCorrectness = function returnsCorrectness(sess) {
317
+ it("returns responseCorrect: false if session is ".concat(stringify(sess)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
318
+ var o;
319
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
320
+ while (1) {
321
+ switch (_context8.prev = _context8.next) {
322
+ case 0:
323
+ _context8.next = 2;
324
+ return (0, _index.model)(question, sess, env);
325
+
326
+ case 2:
327
+ o = _context8.sent;
328
+ expect(o.responseCorrect).toEqual(false);
329
+
330
+ case 4:
331
+ case "end":
332
+ return _context8.stop();
333
+ }
334
+ }
335
+ }, _callee8);
336
+ })));
337
+ };
338
+
339
+ returnsCorrectness(undefined);
340
+ returnsCorrectness(null);
341
+ returnsCorrectness({});
342
+ });
343
+ describe('choicePrefix is undefined', function () {
344
+ var question = {
345
+ id: '1',
346
+ element: 'multiple-choice',
347
+ prompt: 'prompt',
348
+ promptEnabled: true,
349
+ choiceMode: 'radio',
350
+ feedbackEnabled: true,
351
+ choices: [{
352
+ label: 'a',
353
+ value: 'apple',
354
+ correct: true,
355
+ feedback: {
356
+ type: 'custom',
357
+ value: 'foo'
358
+ }
359
+ }, {
360
+ label: 'b',
361
+ value: 'banana',
362
+ feedback: {
363
+ type: 'default'
364
+ }
365
+ }]
366
+ };
367
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
368
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
369
+ while (1) {
370
+ switch (_context9.prev = _context9.next) {
371
+ case 0:
372
+ session = {};
373
+ env = {
374
+ mode: 'gather'
375
+ };
376
+ _context9.next = 4;
377
+ return (0, _index.model)(question, session, env);
378
+
379
+ case 4:
380
+ result = _context9.sent;
381
+
382
+ case 5:
383
+ case "end":
384
+ return _context9.stop();
385
+ }
386
+ }
387
+ }, _callee9);
388
+ })));
389
+ it('returns default letters', function () {
390
+ expect(result.keyMode).toEqual('letters');
391
+ });
392
+ });
393
+ });
394
+ describe('getScore', function () {
395
+ it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expectedDychotomous | expectedPartialScoring\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n "])), undefined, 0, 0, null, 0, 0, [], 0, 0, ['a'], 0, 0.5, ['e'], 0, 0.5, ['a', 'b'], 0, 0.5, ['a', 'c'], 0, 0.5, ['a', 'd'], 0, 0.5, ['a', 'e'], 1, 1, ['a', 'b', 'c'], 0, 0, ['a', 'b', 'd'], 0, 0, ['a', 'b', 'e'], 0, 0.5, ['a', 'b', 'c', 'd'], 0, 0, ['a', 'b', 'c', 'e'], 0, 0, ['a', 'b', 'c', 'd', 'e'], 0, 0, ['a', 'c', 'd', 'e'], 0, 0, ['a', 'd', 'e'], 0, 0.5)('session = $sessionValue; partial scoring = true => score = $expectedPartialScoring / partial scoring = false => score = $expectedDychotomous', /*#__PURE__*/function () {
396
+ var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(_ref10) {
397
+ var sessionValue, expectedPartialScoring, expectedDychotomous, q, resultPS, resultD;
398
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
399
+ while (1) {
400
+ switch (_context10.prev = _context10.next) {
401
+ case 0:
402
+ sessionValue = _ref10.sessionValue, expectedPartialScoring = _ref10.expectedPartialScoring, expectedDychotomous = _ref10.expectedDychotomous;
403
+ q = {
404
+ choiceMode: 'checkbox',
405
+ choices: [{
406
+ label: 'a',
407
+ value: 'a',
408
+ correct: true
409
+ }, {
410
+ label: 'b',
411
+ value: 'b'
412
+ }, {
413
+ label: 'c',
414
+ value: 'c'
415
+ }, {
416
+ label: 'd',
417
+ value: 'd'
418
+ }, {
419
+ label: 'e',
420
+ value: 'e',
421
+ correct: true
422
+ }]
423
+ };
424
+ _context10.next = 4;
425
+ return (0, _index.outcome)(q, {
426
+ value: sessionValue
427
+ }, {
428
+ mode: 'evaluate '
429
+ });
430
+
431
+ case 4:
432
+ resultPS = _context10.sent;
433
+ expect(resultPS.score).toEqual(expectedPartialScoring);
434
+ _context10.next = 8;
435
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, q), {}, {
436
+ partialScoring: false
437
+ }), {
438
+ value: sessionValue
439
+ }, {
440
+ mode: 'evaluate '
441
+ });
442
+
443
+ case 8:
444
+ resultD = _context10.sent;
445
+ expect(resultD.score).toEqual(expectedDychotomous);
446
+
447
+ case 10:
448
+ case "end":
449
+ return _context10.stop();
450
+ }
451
+ }
452
+ }, _callee10);
453
+ }));
454
+
455
+ return function (_x) {
456
+ return _ref11.apply(this, arguments);
457
+ };
458
+ }());
459
+ });
460
+ describe('outcome', function () {
461
+ it('returns score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
462
+ var result;
463
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
464
+ while (1) {
465
+ switch (_context11.prev = _context11.next) {
466
+ case 0:
467
+ _context11.next = 2;
468
+ return (0, _index.outcome)(question, {
469
+ value: ['banana']
470
+ }, {
471
+ mode: 'gather'
472
+ });
473
+
474
+ case 2:
475
+ result = _context11.sent;
476
+ expect(result.score).toEqual(0);
477
+
478
+ case 4:
479
+ case "end":
480
+ return _context11.stop();
481
+ }
482
+ }
483
+ }, _callee11);
484
+ })));
485
+ it('returns score of 1', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
486
+ var result;
487
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
488
+ while (1) {
489
+ switch (_context12.prev = _context12.next) {
490
+ case 0:
491
+ _context12.next = 2;
492
+ return (0, _index.outcome)(question, {
493
+ value: ['apple']
494
+ }, {
495
+ mode: 'gather'
496
+ });
497
+
498
+ case 2:
499
+ result = _context12.sent;
500
+ expect(result.score).toEqual(1);
501
+
502
+ case 4:
503
+ case "end":
504
+ return _context12.stop();
505
+ }
506
+ }
507
+ }, _callee12);
508
+ })));
509
+ describe('partial scoring', function () {
510
+ describe('choiceMode:radio is disabled', function () {
511
+ it('with defaults', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
512
+ var result;
513
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
514
+ while (1) {
515
+ switch (_context13.prev = _context13.next) {
516
+ case 0:
517
+ _context13.next = 2;
518
+ return (0, _index.outcome)(question, {}, {});
519
+
520
+ case 2:
521
+ result = _context13.sent;
522
+ expect(result.score).toEqual(0);
523
+
524
+ case 4:
525
+ case "end":
526
+ return _context13.stop();
527
+ }
528
+ }
529
+ }, _callee13);
530
+ })));
531
+ it('with defaults and correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
532
+ var result;
533
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
534
+ while (1) {
535
+ switch (_context14.prev = _context14.next) {
536
+ case 0:
537
+ _context14.next = 2;
538
+ return (0, _index.outcome)(question, {
539
+ value: ['apple']
540
+ }, {});
541
+
542
+ case 2:
543
+ result = _context14.sent;
544
+ expect(result.score).toEqual(1);
545
+
546
+ case 4:
547
+ case "end":
548
+ return _context14.stop();
549
+ }
550
+ }
551
+ }, _callee14);
552
+ })));
553
+ it('with env.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
554
+ var result;
555
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
556
+ while (1) {
557
+ switch (_context15.prev = _context15.next) {
558
+ case 0:
559
+ _context15.next = 2;
560
+ return (0, _index.outcome)(question, {
561
+ partialScoring: true
562
+ }, {});
563
+
564
+ case 2:
565
+ result = _context15.sent;
566
+ expect(result.score).toEqual(0);
567
+
568
+ case 4:
569
+ case "end":
570
+ return _context15.stop();
571
+ }
572
+ }
573
+ }, _callee15);
574
+ })));
575
+ it('with env.partialScoring: true + config.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
576
+ var result;
577
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
578
+ while (1) {
579
+ switch (_context16.prev = _context16.next) {
580
+ case 0:
581
+ _context16.next = 2;
582
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
583
+ partialScoring: true
584
+ }), {
585
+ partialScoring: true
586
+ }, {});
587
+
588
+ case 2:
589
+ result = _context16.sent;
590
+ expect(result.score).toEqual(0);
591
+
592
+ case 4:
593
+ case "end":
594
+ return _context16.stop();
595
+ }
596
+ }
597
+ }, _callee16);
598
+ })));
599
+ });
600
+ describe('checkbox', function () {
601
+ beforeEach(function () {
602
+ var choices = question.choices.concat({
603
+ value: 'c',
604
+ correct: true
605
+ });
606
+ question = _objectSpread(_objectSpread({}, question), {}, {
607
+ choiceMode: 'checkbox',
608
+ partialScoring: true,
609
+ choices: choices
610
+ });
611
+ });
612
+ it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expected\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, 0, null, 0, [], 0, ['apple'], 0.25, ['apple', 'cherry'], 0.5, ['apple', 'banana'], 0.5, ['apple', 'banana', 'cherry'], 0.75, ['apple', 'banana', 'grapes'], 0.75, ['apple', 'banana', 'grapes', 'cherry'], 1, ['cherry', 'banana', 'grapes'], 0.75, ['apple', 'durian'], 0.25, ['apple', 'durian', 'elderberries'], 0.25, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit'], 0, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit', 'kiwi'], 0.25, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit'], 0.5, ['apple', 'cherry', 'banana', 'grapes', 'durian'], 0.75)('outcome: partial scoring = true, sessionValue = $sessionValue => expected = $expected', /*#__PURE__*/function () {
613
+ var _ref19 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(_ref18) {
614
+ var sessionValue, expected, q, result;
615
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
616
+ while (1) {
617
+ switch (_context17.prev = _context17.next) {
618
+ case 0:
619
+ sessionValue = _ref18.sessionValue, expected = _ref18.expected;
620
+ q = {
621
+ choiceMode: 'checkbox',
622
+ choices: [{
623
+ label: 'a',
624
+ value: 'apple',
625
+ correct: true
626
+ }, {
627
+ label: 'b',
628
+ value: 'banana',
629
+ correct: true
630
+ }, {
631
+ label: 'c',
632
+ value: 'cherry',
633
+ correct: true
634
+ }, {
635
+ label: 'd',
636
+ value: 'durian'
637
+ }, {
638
+ label: 'e',
639
+ value: 'elderberries'
640
+ }, {
641
+ label: 'f',
642
+ value: 'feijoa'
643
+ }, {
644
+ label: 'g',
645
+ value: 'grapes',
646
+ correct: true
647
+ }, {
648
+ label: 'j',
649
+ value: 'jackfruit'
650
+ }, {
651
+ label: 'k',
652
+ value: 'kiwi'
653
+ }]
654
+ };
655
+ _context17.next = 4;
656
+ return (0, _index.outcome)(q, {
657
+ value: sessionValue
658
+ }, {
659
+ mode: 'evaluate '
660
+ });
661
+
662
+ case 4:
663
+ result = _context17.sent;
664
+ expect(result.score).toEqual(expected);
665
+
666
+ case 6:
667
+ case "end":
668
+ return _context17.stop();
669
+ }
670
+ }
671
+ }, _callee17);
672
+ }));
673
+
674
+ return function (_x2) {
675
+ return _ref19.apply(this, arguments);
676
+ };
677
+ }());
678
+ });
679
+ });
680
+ it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n session | empty\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", "| ", "\n "])), undefined, true, null, true, {}, true, {
681
+ value: []
682
+ }, false)('returns score: 0 and empty: true if session is $session', /*#__PURE__*/function () {
683
+ var _ref21 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(_ref20) {
684
+ var session, empty, o;
685
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
686
+ while (1) {
687
+ switch (_context18.prev = _context18.next) {
688
+ case 0:
689
+ session = _ref20.session, empty = _ref20.empty;
690
+ _context18.next = 3;
691
+ return (0, _index.outcome)(question, session, {
692
+ mode: 'evaluate'
693
+ });
694
+
695
+ case 3:
696
+ o = _context18.sent;
697
+ expect(o).toEqual({
698
+ score: 0,
699
+ empty: empty
700
+ });
701
+
702
+ case 5:
703
+ case "end":
704
+ return _context18.stop();
705
+ }
706
+ }
707
+ }, _callee18);
708
+ }));
709
+
710
+ return function (_x3) {
711
+ return _ref21.apply(this, arguments);
712
+ };
713
+ }());
714
+ });
715
+ describe('correct response', function () {
716
+ it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
717
+ var sess;
718
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
719
+ while (1) {
720
+ switch (_context19.prev = _context19.next) {
721
+ case 0:
722
+ _context19.next = 2;
723
+ return (0, _index.createCorrectResponseSession)(question, {
724
+ mode: 'gather',
725
+ role: 'instructor'
726
+ });
727
+
728
+ case 2:
729
+ sess = _context19.sent;
730
+ expect(sess).toEqual({
731
+ 'id': '1',
732
+ 'value': ['apple']
733
+ });
734
+
735
+ case 4:
736
+ case "end":
737
+ return _context19.stop();
738
+ }
739
+ }
740
+ }, _callee19);
741
+ })));
742
+ it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
743
+ var noResult;
744
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
745
+ while (1) {
746
+ switch (_context20.prev = _context20.next) {
747
+ case 0:
748
+ _context20.next = 2;
749
+ return (0, _index.createCorrectResponseSession)(question, {
750
+ mode: 'gather',
751
+ role: 'student'
752
+ });
753
+
754
+ case 2:
755
+ noResult = _context20.sent;
756
+ expect(noResult).toBeNull();
757
+
758
+ case 4:
759
+ case "end":
760
+ return _context20.stop();
761
+ }
762
+ }
763
+ }, _callee20);
764
+ })));
765
+ });
766
+ describe('normalize', function () {
767
+ it('sets choicesLayout: horizontal if verticalMode: false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
768
+ var sess;
769
+ return _regenerator["default"].wrap(function _callee21$(_context21) {
770
+ while (1) {
771
+ switch (_context21.prev = _context21.next) {
772
+ case 0:
773
+ _context21.next = 2;
774
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
775
+ verticalMode: false
776
+ }));
777
+
778
+ case 2:
779
+ sess = _context21.sent;
780
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
781
+ choicesLayout: 'horizontal'
782
+ }));
783
+
784
+ case 4:
785
+ case "end":
786
+ return _context21.stop();
787
+ }
788
+ }
789
+ }, _callee21);
790
+ })));
791
+ it('sets choicesLayout: vertical if verticalMode: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
792
+ var sess;
793
+ return _regenerator["default"].wrap(function _callee22$(_context22) {
794
+ while (1) {
795
+ switch (_context22.prev = _context22.next) {
796
+ case 0:
797
+ _context22.next = 2;
798
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
799
+ verticalMode: true
800
+ }));
801
+
802
+ case 2:
803
+ sess = _context22.sent;
804
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
805
+ choicesLayout: 'vertical'
806
+ }));
807
+
808
+ case 4:
809
+ case "end":
810
+ return _context22.stop();
811
+ }
812
+ }
813
+ }, _callee22);
814
+ })));
815
+ it('sets choicesLayout: grid if verticalMode: true && choicesLayout: grid', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
816
+ var sess;
817
+ return _regenerator["default"].wrap(function _callee23$(_context23) {
818
+ while (1) {
819
+ switch (_context23.prev = _context23.next) {
820
+ case 0:
821
+ _context23.next = 2;
822
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
823
+ verticalMode: true,
824
+ choicesLayout: 'grid'
825
+ }));
826
+
827
+ case 2:
828
+ sess = _context23.sent;
829
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
830
+ choicesLayout: 'grid'
831
+ }));
832
+
833
+ case 4:
834
+ case "end":
835
+ return _context23.stop();
836
+ }
837
+ }
838
+ }, _callee23);
839
+ })));
840
+ it('sets choicesLayout: vertical', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
841
+ var sess;
842
+ return _regenerator["default"].wrap(function _callee24$(_context24) {
843
+ while (1) {
844
+ switch (_context24.prev = _context24.next) {
845
+ case 0:
846
+ _context24.next = 2;
847
+ return (0, _index.normalize)(question);
848
+
849
+ case 2:
850
+ sess = _context24.sent;
851
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
852
+ choicesLayout: 'vertical'
853
+ }));
854
+
855
+ case 4:
856
+ case "end":
857
+ return _context24.stop();
858
+ }
859
+ }
860
+ }, _callee24);
861
+ })));
862
+ });
863
+ });
864
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJpZCIsImVsZW1lbnQiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiY2hvaWNlUHJlZml4IiwiY2hvaWNlTW9kZSIsImZlZWRiYWNrRW5hYmxlZCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwiY29ycmVjdCIsImZlZWRiYWNrIiwidHlwZSIsInN0cmluZ2lmeSIsIkpTT04iLCJtb2RlIiwiaXQiLCJleHBlY3QiLCJkaXNhYmxlZCIsInRvRXF1YWwiLCJrZXlNb2RlIiwiYXJyYXlDb250YWluaW5nIiwicmF0aW9uYWxlIiwicmVzcG9uc2VDb3JyZWN0IiwidG9CZSIsInVuZGVmaW5lZCIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJtb2NrUmV0dXJuVmFsdWUiLCJyZXR1cm5zQ29ycmVjdG5lc3MiLCJzZXNzIiwibyIsImVhY2giLCJzZXNzaW9uVmFsdWUiLCJleHBlY3RlZFBhcnRpYWxTY29yaW5nIiwiZXhwZWN0ZWREeWNob3RvbW91cyIsInEiLCJyZXN1bHRQUyIsInNjb3JlIiwicGFydGlhbFNjb3JpbmciLCJyZXN1bHREIiwiY29uY2F0IiwiZXhwZWN0ZWQiLCJlbXB0eSIsInJvbGUiLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwidmVydGljYWxNb2RlIiwiZGVmYXVsdHMiLCJjaG9pY2VzTGF5b3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsVUFBVixFQUFzQjtBQUFBLFNBQU87QUFDM0JDLElBQUFB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LEtBQTFFLEdBQUY7QUFNQW5DLElBQUFBLEVBQUUsQ0FBQyw4QkFBRCw2RkFBaUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDZCxzQkFBVXBCLFFBQVYsQ0FEYzs7QUFBQTtBQUMzQm9DLGNBQUFBLElBRDJCO0FBR2pDZixjQUFBQSxNQUFNLENBQUNlLElBQUQsQ0FBTixDQUFhYixPQUFiLCtDQUEwQitCLG9CQUExQixHQUF1Q3RELFFBQXZDO0FBQWlEdUQsZ0JBQUFBLGFBQWEsRUFBRTtBQUFoRTs7QUFIaUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBakMsR0FBRjtBQUtELEdBeEJPLENBQVI7QUF5QkQsQ0FsZE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBvdXRjb21lLCBnZXRTY29yZSwgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbiwgbm9ybWFsaXplIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNSZXNwb25zZUNvcnJlY3QgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuXG5qZXN0Lm1vY2soJy4uL3V0aWxzJywgKCkgPT4gKHtcbiAgaXNSZXNwb25zZUNvcnJlY3Q6IGplc3QuZm4oKVxufSkpO1xuXG5kZXNjcmliZSgnY29udHJvbGxlcicsICgpID0+IHtcbiAgbGV0IHJlc3VsdCwgcXVlc3Rpb24sIHNlc3Npb24sIGVudjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBxdWVzdGlvbiA9IHtcbiAgICAgIGlkOiAnMScsXG4gICAgICBlbGVtZW50OiAnbXVsdGlwbGUtY2hvaWNlJyxcbiAgICAgIHByb21wdDogJ3Byb21wdCcsXG4gICAgICBwcm9tcHRFbmFibGVkOiB0cnVlLFxuICAgICAgY2hvaWNlUHJlZml4OiAnbGV0dGVycycsXG4gICAgICBjaG9pY2VNb2RlOiAncmFkaW8nLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0cnVlLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9KTtcblxuICBjb25zdCB7IHN0cmluZ2lmeSB9ID0gSlNPTjtcblxuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ21vZGU6IGdhdGhlcicsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIG1vZGUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQubW9kZSkudG9FcXVhbCgnZ2F0aGVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnByb21wdCkudG9FcXVhbCgncHJvbXB0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlTW9kZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VNb2RlKS50b0VxdWFsKCdyYWRpbycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZVByZWZpeCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5rZXlNb2RlKS50b0VxdWFsKCdsZXR0ZXJzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlcycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAgeyBsYWJlbDogJ2EnLCB2YWx1ZTogJ2FwcGxlJywgcmF0aW9uYWxlOiBudWxsIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnYicsIHZhbHVlOiAnYmFuYW5hJywgcmF0aW9uYWxlOiBudWxsIH1cbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZXR1cm4gcmVzcG9uc2VDb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnJlc3BvbnNlQ29ycmVjdCkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZWwgLSB3aXRoIHVwZGF0ZVNlc3Npb24nLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgdXBkYXRlU2Vzc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHsgaWQ6ICcxJywgZWxlbWVudDogJ211bHRpcGxlLWNob2ljZScgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgICBjb25zdCB1cGRhdGVTZXNzaW9uID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKCk7XG4gICAgICAgIGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYsIHVwZGF0ZVNlc3Npb24pO1xuICAgICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAnbXVsdGlwbGUtY2hvaWNlJywge1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsnYXBwbGUnLCAnYmFuYW5hJ10pXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogdmlldycsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmRpc2FibGVkKS50b0VxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogZXZhbHVhdGUnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdldmFsdWF0ZScgfTtcbiAgICAgICAgaXNSZXNwb25zZUNvcnJlY3QubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlcyB3LyBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICBmZWVkYmFjazogJ2ZvbycsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdJbmNvcnJlY3QnLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCBldmVuIGlmIGZlZWRiYWNrRW5hYmxlZCBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogZmFsc2VcbiAgICAgICAgfSwgc2Vzc2lvbiwgZW52LCBqZXN0LmZuKCkpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBmZWVkYmFjayB1bmRlZmluZWQgaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZmVlZGJhY2tFbmFibGVkOiBmYWxzZVxuICAgICAgICB9LCBzZXNzaW9uLCBlbnYsIGplc3QuZm4oKSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBmZWVkYmFjazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIHByb3BlciBmZWVkYmFjayBpZiBmZWVkYmFja0VuYWJsZWQgaXMgdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZVxuICAgICAgICB9LCBzZXNzaW9uLCBlbnYsIGplc3QuZm4oKSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiAnSW5jb3JyZWN0JyxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBpcyByZXNwb25zZSBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnJlc3BvbnNlQ29ycmVjdCkudG9FcXVhbChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmV0dXJuc0NvcnJlY3RuZXNzID0gc2VzcyA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zIHJlc3BvbnNlQ29ycmVjdDogZmFsc2UgaWYgc2Vzc2lvbiBpcyAke3N0cmluZ2lmeShzZXNzKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbyA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzLCBlbnYpO1xuXG4gICAgICAgICAgZXhwZWN0KG8ucmVzcG9uc2VDb3JyZWN0KS50b0VxdWFsKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm5zQ29ycmVjdG5lc3ModW5kZWZpbmVkKTtcbiAgICAgIHJldHVybnNDb3JyZWN0bmVzcyhudWxsKTtcbiAgICAgIHJldHVybnNDb3JyZWN0bmVzcyh7fSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY2hvaWNlUHJlZml4IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0ge1xuICAgICAgICBpZDogJzEnLFxuICAgICAgICBlbGVtZW50OiAnbXVsdGlwbGUtY2hvaWNlJyxcbiAgICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlTW9kZTogJ3JhZGlvJyxcbiAgICAgICAgZmVlZGJhY2tFbmFibGVkOiB0cnVlLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2ZvbydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG5cbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcbiAgICAgIGl0KCdyZXR1cm5zIGRlZmF1bHQgbGV0dGVycycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5rZXlNb2RlKS50b0VxdWFsKCdsZXR0ZXJzJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFNjb3JlJywgKCkgPT4ge1xuICAgIGl0LmVhY2hgXG4gICAgICAgIHNlc3Npb25WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIGV4cGVjdGVkRHljaG90b21vdXMgICAgIHwgICAgIGV4cGVjdGVkUGFydGlhbFNjb3JpbmdcbiAgICAgICAgJHt1bmRlZmluZWR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke251bGx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9XG4gICAgICAgICR7W119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH0gICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH1cbiAgICAgICAgJHtbJ2EnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjV9XG4gICAgICAgICR7WydlJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH0gICAgICAgICAgICAgICAgICAgIHwgICAgICR7MC41fVxuICAgICAgICAke1snYScsICdiJ119ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuNX1cbiAgICAgICAgJHtbJ2EnLCAnYyddfSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjV9XG4gICAgICAgICR7WydhJywgJ2QnXX0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH0gICAgICAgICAgICAgICAgICAgIHwgICAgICR7MC41fVxuICAgICAgICAke1snYScsICdlJ119ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezF9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezF9XG4gICAgICAgICR7WydhJywgJ2InLCAnYyddfSAgICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH0gICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH1cbiAgICAgICAgJHtbJ2EnLCAnYicsICdkJ119ICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYScsICdiJywgJ2UnXX0gICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuNX1cbiAgICAgICAgJHtbJ2EnLCAnYicsICdjJywgJ2QnXX0gICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYScsICdiJywgJ2MnLCAnZSddfSAgICAgICAgICAgICAgICB8ICAgICAkezB9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9XG4gICAgICAgICR7WydhJywgJ2InLCAnYycsICdkJywgJ2UnXX0gICAgICAgICAgIHwgICAgICR7MH0gICAgICAgICAgICAgICAgICAgIHwgICAgICR7MH1cbiAgICAgICAgJHtbJ2EnLCAnYycsICdkJywgJ2UnXX0gICAgICAgICAgICAgICAgfCAgICAgJHswfSAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYScsICdkJywgJ2UnXX0gICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9ICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuNX1cbiAgICAgIGAoJ3Nlc3Npb24gPSAkc2Vzc2lvblZhbHVlOyBwYXJ0aWFsIHNjb3JpbmcgPSB0cnVlID0+IHNjb3JlID0gJGV4cGVjdGVkUGFydGlhbFNjb3JpbmcgLyBwYXJ0aWFsIHNjb3JpbmcgPSBmYWxzZSA9PiBzY29yZSA9ICRleHBlY3RlZER5Y2hvdG9tb3VzJyxcbiAgICAgIGFzeW5jICh7IHNlc3Npb25WYWx1ZSwgZXhwZWN0ZWRQYXJ0aWFsU2NvcmluZywgZXhwZWN0ZWREeWNob3RvbW91cyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSB7XG4gICAgICAgICAgY2hvaWNlTW9kZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnYScsIHZhbHVlOiAnYScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2MnLCB2YWx1ZTogJ2MnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnZCcsIHZhbHVlOiAnZCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdlJywgdmFsdWU6ICdlJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgIF1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHRQUyA9IGF3YWl0IG91dGNvbWUocSwgeyB2YWx1ZTogc2Vzc2lvblZhbHVlIH0sIHsgbW9kZTogJ2V2YWx1YXRlICcgfSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdFBTLnNjb3JlKS50b0VxdWFsKGV4cGVjdGVkUGFydGlhbFNjb3JpbmcpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdEQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHsgLi4ucSwgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICAgICAgeyB2YWx1ZTogc2Vzc2lvblZhbHVlIH0sXG4gICAgICAgICAgeyBtb2RlOiAnZXZhbHVhdGUgJyB9XG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdEQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWREeWNob3RvbW91cyk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgc2NvcmUgb2YgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICB7IHZhbHVlOiBbJ2JhbmFuYSddIH0sXG4gICAgICAgIHsgbW9kZTogJ2dhdGhlcicgfVxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBzY29yZSBvZiAxJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHsgdmFsdWU6IFsnYXBwbGUnXSB9LFxuICAgICAgICB7IG1vZGU6ICdnYXRoZXInIH1cbiAgICAgICk7XG4gICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3BhcnRpYWwgc2NvcmluZycsICgpID0+IHtcbiAgICAgIGRlc2NyaWJlKCdjaG9pY2VNb2RlOnJhZGlvIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBpdCgnd2l0aCBkZWZhdWx0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7fSwge30pO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnd2l0aCBkZWZhdWx0cyBhbmQgY29ycmVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IHZhbHVlOiBbJ2FwcGxlJ10gfSwge30pO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnd2l0aCBlbnYucGFydGlhbFNjb3Jpbmc6IHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LCB7fSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd3aXRoIGVudi5wYXJ0aWFsU2NvcmluZzogdHJ1ZSArIGNvbmZpZy5wYXJ0aWFsU2NvcmluZzogdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgICAgeyAuLi5xdWVzdGlvbiwgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNob2ljZXMgPSBxdWVzdGlvbi5jaG9pY2VzLmNvbmNhdCh7XG4gICAgICAgICAgICB2YWx1ZTogJ2MnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHF1ZXN0aW9uID0ge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICAgICAgICBjaG9pY2VzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQuZWFjaGBcbiAgICAgICAgc2Vzc2lvblZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIGV4cGVjdGVkXG4gICAgICAgICR7dW5kZWZpbmVkfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9XG4gICAgICAgICR7bnVsbH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9XG4gICAgICAgICR7W119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezB9XG4gICAgICAgICR7WydhcHBsZSddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuMjV9XG4gICAgICAgICR7WydhcHBsZScsICdjaGVycnknXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuNX1cbiAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYSddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICR7MC41fVxuICAgICAgICAke1snYXBwbGUnLCAnYmFuYW5hJywgJ2NoZXJyeSddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjc1fVxuICAgICAgICAke1snYXBwbGUnLCAnYmFuYW5hJywgJ2dyYXBlcyddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjc1fVxuICAgICAgICAke1snYXBwbGUnLCAnYmFuYW5hJywgJ2dyYXBlcycsICdjaGVycnknXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHsxfVxuICAgICAgICAke1snY2hlcnJ5JywgJ2JhbmFuYScsICdncmFwZXMnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjc1fVxuICAgICAgICAke1snYXBwbGUnLCAnZHVyaWFuJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjI1fVxuICAgICAgICAke1snYXBwbGUnLCAnZHVyaWFuJywgJ2VsZGVyYmVycmllcyddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjI1fVxuICAgICAgICAke1snYXBwbGUnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgICAgICAgfCAgICAgJHswfVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdncmFwZXMnLCAnZHVyaWFuJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjI1fVxuICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdncmFwZXMnLCAnZHVyaWFuJywgJ2phY2tmcnVpdCddfSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgJHswLjV9XG4gICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnYmFuYW5hJywgJ2dyYXBlcycsICdkdXJpYW4nXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAkezAuNzV9XG4gICAgICBgKCdvdXRjb21lOiBwYXJ0aWFsIHNjb3JpbmcgPSB0cnVlLCBzZXNzaW9uVmFsdWUgPSAkc2Vzc2lvblZhbHVlID0+IGV4cGVjdGVkID0gJGV4cGVjdGVkJyxcbiAgICAgICAgICBhc3luYyAoeyBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSB7XG4gICAgICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnYScsIHZhbHVlOiAnYXBwbGUnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2InLCB2YWx1ZTogJ2JhbmFuYScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnYycsIHZhbHVlOiAnY2hlcnJ5JywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdkJywgdmFsdWU6ICdkdXJpYW4nIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2UnLCB2YWx1ZTogJ2VsZGVyYmVycmllcycgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZicsIHZhbHVlOiAnZmVpam9hJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdnJywgdmFsdWU6ICdncmFwZXMnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2onLCB2YWx1ZTogJ2phY2tmcnVpdCcgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnaycsIHZhbHVlOiAna2l3aScgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHEsIHsgdmFsdWU6IHNlc3Npb25WYWx1ZSB9LCB7IG1vZGU6ICdldmFsdWF0ZSAnIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0LmVhY2hgXG4gICAgc2Vzc2lvbiAgICAgICAgIHwgICAgIGVtcHR5XG4gICAgJHt1bmRlZmluZWR9ICAgIHwgICAgICR7dHJ1ZX1cbiAgICAke251bGx9ICAgICAgICAgfCAgICAgJHt0cnVlfVxuICAgICR7e319ICAgICAgICAgICB8ICAgICAke3RydWV9XG4gICAgJHt7IHZhbHVlOiBbXSB9fXwgICAgICR7ZmFsc2V9XG4gICAgYCgncmV0dXJucyBzY29yZTogMCBhbmQgZW1wdHk6IHRydWUgaWYgc2Vzc2lvbiBpcyAkc2Vzc2lvbicsIGFzeW5jICh7IHNlc3Npb24sIGVtcHR5IH0pID0+IHtcbiAgICAgIGNvbnN0IG8gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG5cbiAgICAgIGV4cGVjdChvKS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5IH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgJ2lkJzogJzEnLCAndmFsdWUnOiBbJ2FwcGxlJ10gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub3JtYWxpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogaG9yaXpvbnRhbCBpZiB2ZXJ0aWNhbE1vZGU6IGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IGZhbHNlIH0pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IC4uLmRlZmF1bHRzLCAuLi5xdWVzdGlvbiwgY2hvaWNlc0xheW91dDogJ2hvcml6b250YWwnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogdmVydGljYWwgaWYgdmVydGljYWxNb2RlOiB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IHRydWUgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAndmVydGljYWwnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogZ3JpZCBpZiB2ZXJ0aWNhbE1vZGU6IHRydWUgJiYgY2hvaWNlc0xheW91dDogZ3JpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBub3JtYWxpemUoeyAuLi5xdWVzdGlvbiwgdmVydGljYWxNb2RlOiB0cnVlLCBjaG9pY2VzTGF5b3V0OiAnZ3JpZCcgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAnZ3JpZCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiB2ZXJ0aWNhbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBub3JtYWxpemUocXVlc3Rpb24pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IC4uLmRlZmF1bHRzLCAuLi5xdWVzdGlvbiwgY2hvaWNlc0xheW91dDogJ3ZlcnRpY2FsJyB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==