@pie-element/explicit-constructed-response 6.1.0-next.1 → 6.1.1-next.12

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.
@@ -1,1207 +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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
-
11
- var _index = require("../index");
12
-
13
- 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; }
14
-
15
- 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; }
16
-
17
- jest.mock('@pie-lib/pie-toolbox/controller-utils', function () {
18
- return {
19
- getShuffledChoices: function getShuffledChoices(choices, session, updateSession, key) {
20
- var currentShuffled = ((session || {}).shuffledValues || []).filter(function (v) {
21
- return v;
22
- });
23
-
24
- if (session && !currentShuffled.length && updateSession && typeof updateSession === 'function') {
25
- updateSession();
26
- }
27
-
28
- return choices;
29
- },
30
- partialScoring: {
31
- enabled: function enabled(config, env) {
32
- config = config || {};
33
- env = env || {};
34
-
35
- if (config.partialScoring === false) {
36
- return false;
37
- }
38
-
39
- if (env.partialScoring === false) {
40
- return false;
41
- }
42
-
43
- return true;
44
- }
45
- }
46
- };
47
- });
48
-
49
- var choice = function choice(l, v) {
50
- return {
51
- label: l,
52
- value: v
53
- };
54
- };
55
-
56
- var choices = {
57
- 0: [choice('cow', '0'), choice('cattle', '1'), choice('calf', '2')],
58
- 1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
59
- 2: [choice('moon', '0')]
60
- };
61
- var question = {
62
- markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
63
- disabled: false,
64
- choices: choices,
65
- prompt: 'Complete the sentence',
66
- note: 'The answer shown above is the most common correct answer for this item.'
67
- };
68
- describe('controller', function () {
69
- describe('model', function () {
70
- var q, env;
71
- it('output when session is defined', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
72
- var m;
73
- return _regenerator["default"].wrap(function _callee$(_context) {
74
- while (1) {
75
- switch (_context.prev = _context.next) {
76
- case 0:
77
- _context.next = 2;
78
- return (0, _index.model)(question, {
79
- value: {
80
- 0: 'cow',
81
- 1: 'over',
82
- 2: 'moon'
83
- }
84
- }, {
85
- mode: 'evaluate'
86
- });
87
-
88
- case 2:
89
- m = _context.sent;
90
- expect(m).toEqual(expect.objectContaining({
91
- feedback: {
92
- 0: 'correct',
93
- 1: 'correct',
94
- 2: 'correct'
95
- },
96
- responseCorrect: true
97
- }));
98
-
99
- case 4:
100
- case "end":
101
- return _context.stop();
102
- }
103
- }
104
- }, _callee);
105
- })));
106
-
107
- var returnModel = function returnModel(session) {
108
- it("output when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
109
- var m;
110
- return _regenerator["default"].wrap(function _callee2$(_context2) {
111
- while (1) {
112
- switch (_context2.prev = _context2.next) {
113
- case 0:
114
- _context2.next = 2;
115
- return (0, _index.model)(question, session, {
116
- mode: 'evaluate'
117
- });
118
-
119
- case 2:
120
- m = _context2.sent;
121
- expect(m).toEqual(expect.objectContaining({
122
- feedback: {
123
- 0: 'incorrect',
124
- 1: 'incorrect',
125
- 2: 'incorrect'
126
- },
127
- responseCorrect: false
128
- }));
129
-
130
- case 4:
131
- case "end":
132
- return _context2.stop();
133
- }
134
- }
135
- }, _callee2);
136
- })));
137
- };
138
-
139
- returnModel(undefined);
140
- returnModel(null);
141
- returnModel({});
142
-
143
- var assertGather = function assertGather(label, extra, session, expected) {
144
- it("'mode: gather, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
145
- var result;
146
- return _regenerator["default"].wrap(function _callee3$(_context3) {
147
- while (1) {
148
- switch (_context3.prev = _context3.next) {
149
- case 0:
150
- q = _objectSpread(_objectSpread({}, question), {}, {
151
- teacherInstructions: 'Teacher Instructions',
152
- rationale: 'Rationale'
153
- }, extra);
154
- env = {
155
- mode: 'gather'
156
- };
157
- _context3.next = 4;
158
- return (0, _index.model)(q, _objectSpread({
159
- id: '1',
160
- element: 'explicit-constructed-response'
161
- }, session), env);
162
-
163
- case 4:
164
- result = _context3.sent;
165
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
166
- disabled: false,
167
- mode: 'gather',
168
- feedback: {},
169
- responseCorrect: undefined,
170
- maxLengthPerChoice: [10, 10, 7],
171
- env: env
172
- }, expected));
173
-
174
- case 6:
175
- case "end":
176
- return _context3.stop();
177
- }
178
- }
179
- }, _callee3);
180
- })));
181
- };
182
-
183
- assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
184
- rationale: null,
185
- showNote: true,
186
- teacherInstructions: null
187
- });
188
- assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
189
- promptEnabled: false,
190
- rationaleEnabled: false,
191
- teacherInstructionsEnabled: false,
192
- studentInstructionsEnabled: false
193
- }, {}, {
194
- prompt: null,
195
- rationale: null,
196
- showNote: true,
197
- teacherInstructions: null
198
- });
199
-
200
- var assertView = function assertView(label, extra, session, expected) {
201
- it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
202
- var result;
203
- return _regenerator["default"].wrap(function _callee4$(_context4) {
204
- while (1) {
205
- switch (_context4.prev = _context4.next) {
206
- case 0:
207
- q = _objectSpread(_objectSpread({}, question), {}, {
208
- teacherInstructions: 'Teacher Instructions',
209
- rationale: 'Rationale'
210
- }, extra);
211
- env = {
212
- mode: 'view',
213
- role: 'instructor'
214
- };
215
- _context4.next = 4;
216
- return (0, _index.model)(q, _objectSpread({
217
- id: '1',
218
- element: 'explicit-constructed-response'
219
- }, session), env);
220
-
221
- case 4:
222
- result = _context4.sent;
223
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
224
- mode: 'view',
225
- disabled: true,
226
- feedback: {},
227
- responseCorrect: undefined,
228
- env: env,
229
- maxLengthPerChoice: [10, 10, 7]
230
- }, expected));
231
-
232
- case 6:
233
- case "end":
234
- return _context4.stop();
235
- }
236
- }
237
- }, _callee4);
238
- })));
239
- };
240
-
241
- assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
242
- promptEnabled: false,
243
- rationaleEnabled: false,
244
- teacherInstructionsEnabled: false,
245
- studentInstructionsEnabled: false
246
- }, {}, {
247
- prompt: null,
248
- rationale: null,
249
- showNote: true,
250
- teacherInstructions: null
251
- });
252
- assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
253
- teacherInstructions: 'Teacher Instructions',
254
- showNote: true,
255
- rationale: 'Rationale'
256
- });
257
-
258
- var assertViewStudent = function assertViewStudent(label, extra, session, expected) {
259
- it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
260
- var result;
261
- return _regenerator["default"].wrap(function _callee5$(_context5) {
262
- while (1) {
263
- switch (_context5.prev = _context5.next) {
264
- case 0:
265
- q = _objectSpread(_objectSpread({}, question), {}, {
266
- teacherInstructions: 'Teacher Instructions',
267
- rationale: 'Rationale'
268
- }, extra);
269
- env = {
270
- mode: 'view',
271
- role: ' student'
272
- };
273
- _context5.next = 4;
274
- return (0, _index.model)(q, _objectSpread({
275
- id: '1',
276
- element: 'explicit-constructed-response'
277
- }, session), env);
278
-
279
- case 4:
280
- result = _context5.sent;
281
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
282
- mode: 'view',
283
- disabled: true,
284
- feedback: {},
285
- responseCorrect: undefined,
286
- maxLengthPerChoice: [10, 10, 7],
287
- env: env
288
- }, expected));
289
-
290
- case 6:
291
- case "end":
292
- return _context5.stop();
293
- }
294
- }
295
- }, _callee5);
296
- })));
297
- };
298
-
299
- assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
300
- promptEnabled: false,
301
- rationaleEnabled: false,
302
- teacherInstructionsEnabled: false,
303
- studentInstructionsEnabled: false
304
- }, {}, {
305
- prompt: null,
306
- rationale: null,
307
- showNote: true,
308
- teacherInstructions: null
309
- });
310
- assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
311
- rationale: null,
312
- showNote: true,
313
- teacherInstructions: null
314
- });
315
-
316
- var assertEvaluate = function assertEvaluate(label, extra, session, expected) {
317
- it("'mode: evaluate, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
318
- var result;
319
- return _regenerator["default"].wrap(function _callee6$(_context6) {
320
- while (1) {
321
- switch (_context6.prev = _context6.next) {
322
- case 0:
323
- q = _objectSpread(_objectSpread({}, question), {}, {
324
- teacherInstructions: 'Teacher Instructions',
325
- rationale: 'Rationale'
326
- }, extra);
327
- env = {
328
- mode: 'evaluate',
329
- role: 'instructor'
330
- };
331
- _context6.next = 4;
332
- return (0, _index.model)(q, _objectSpread({
333
- id: '1',
334
- element: 'explicit-constructed-response'
335
- }, session), env);
336
-
337
- case 4:
338
- result = _context6.sent;
339
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
340
- teacherInstructions: 'Teacher Instructions',
341
- rationale: 'Rationale',
342
- mode: 'evaluate',
343
- disabled: true,
344
- choices: {
345
- 0: [{
346
- label: 'cow',
347
- value: '0',
348
- correct: true
349
- }, {
350
- label: 'cattle',
351
- value: '1',
352
- correct: true
353
- }, {
354
- label: 'calf',
355
- value: '2',
356
- correct: true
357
- }],
358
- 1: [{
359
- label: 'over',
360
- value: '0',
361
- correct: true
362
- }, {
363
- label: 'past',
364
- value: '1',
365
- correct: true
366
- }, {
367
- label: 'beyond',
368
- value: '2',
369
- correct: true
370
- }],
371
- 2: [{
372
- label: 'moon',
373
- value: '0',
374
- correct: true
375
- }]
376
- },
377
- maxLengthPerChoice: [10, 10, 7],
378
- env: env
379
- }, expected));
380
-
381
- case 6:
382
- case "end":
383
- return _context6.stop();
384
- }
385
- }
386
- }, _callee6);
387
- })));
388
- };
389
-
390
- assertEvaluate('- correct answer', {}, {
391
- value: {
392
- 0: 'cow',
393
- 1: 'over',
394
- 2: 'moon'
395
- }
396
- }, {
397
- feedback: {
398
- 0: 'correct',
399
- 1: 'correct',
400
- 2: 'correct'
401
- },
402
- showNote: true,
403
- responseCorrect: true
404
- });
405
- assertEvaluate('- partially correct answer', {}, {
406
- value: {
407
- 0: 'cow',
408
- 1: 'over',
409
- 2: 'sun'
410
- }
411
- }, {
412
- feedback: {
413
- 0: 'correct',
414
- 1: 'correct',
415
- 2: 'incorrect'
416
- },
417
- showNote: true,
418
- responseCorrect: false
419
- });
420
- assertEvaluate('- partially correct answer using alternates', {}, {
421
- value: {
422
- 0: 'calf',
423
- 1: 'over',
424
- 2: 'sun'
425
- }
426
- }, {
427
- feedback: {
428
- 0: 'correct',
429
- 1: 'correct',
430
- 2: 'incorrect'
431
- },
432
- showNote: true,
433
- responseCorrect: false
434
- });
435
- assertEvaluate('- incorrect answer', {}, {
436
- value: {
437
- 0: 'han',
438
- 1: 'above',
439
- 2: 'chicken'
440
- }
441
- }, {
442
- feedback: {
443
- 0: 'incorrect',
444
- 1: 'incorrect',
445
- 2: 'incorrect'
446
- },
447
- showNote: true,
448
- responseCorrect: false
449
- });
450
- });
451
- describe('get score', function () {
452
- var assertScore = function assertScore(session, expected) {
453
- it('return score', function () {
454
- var score = (0, _index.getScore)(question, session);
455
- expect(score).toEqual(expected);
456
- });
457
- };
458
-
459
- assertScore({
460
- value: {
461
- 0: 'cow',
462
- 1: 'over',
463
- 2: 'moon'
464
- }
465
- }, 1);
466
- assertScore({
467
- value: {
468
- 0: 'cattle',
469
- 1: 'over',
470
- 2: 'moon'
471
- }
472
- }, 1);
473
- assertScore({
474
- value: {
475
- 0: 'calf',
476
- 1: 'over',
477
- 2: 'moon'
478
- }
479
- }, 1);
480
- assertScore({
481
- value: {
482
- 0: 'cow',
483
- 1: 'past',
484
- 2: 'moon'
485
- }
486
- }, 1);
487
- assertScore({
488
- value: {
489
- 0: 'cattle',
490
- 1: 'past',
491
- 2: 'moon'
492
- }
493
- }, 1);
494
- assertScore({
495
- value: {
496
- 0: 'calf',
497
- 1: 'past',
498
- 2: 'moon'
499
- }
500
- }, 1);
501
- assertScore({
502
- value: {
503
- 0: 'cow',
504
- 1: 'beyond',
505
- 2: 'moon'
506
- }
507
- }, 1);
508
- assertScore({
509
- value: {
510
- 0: 'cattle',
511
- 1: 'beyond',
512
- 2: 'moon'
513
- }
514
- }, 1);
515
- assertScore({
516
- value: {
517
- 0: 'calf',
518
- 1: 'beyond',
519
- 2: 'moon'
520
- }
521
- }, 1);
522
- assertScore({
523
- value: {
524
- 0: 'calf',
525
- 1: 'under',
526
- 2: 'moon'
527
- }
528
- }, 0.67);
529
- assertScore({
530
- value: {
531
- 0: 'cat',
532
- 1: 'under',
533
- 2: 'moon'
534
- }
535
- }, 0.33);
536
- assertScore({
537
- value: {
538
- 0: 'cat',
539
- 1: 'under',
540
- 2: 'sun'
541
- }
542
- }, 0);
543
-
544
- var returnScore = function returnScore(session) {
545
- it("score = 0 when session is ".concat(JSON.stringify(session)), function () {
546
- expect((0, _index.getScore)(question, session)).toEqual(0);
547
- });
548
- };
549
-
550
- returnScore(undefined);
551
- returnScore(null);
552
- returnScore({});
553
- });
554
- describe('outcome partialScoring test', function () {
555
- var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
556
- it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
557
- var result;
558
- return _regenerator["default"].wrap(function _callee7$(_context7) {
559
- while (1) {
560
- switch (_context7.prev = _context7.next) {
561
- case 0:
562
- _context7.next = 2;
563
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
564
-
565
- case 2:
566
- result = _context7.sent;
567
- expect(result).toEqual(expect.objectContaining(expected));
568
-
569
- case 4:
570
- case "end":
571
- return _context7.stop();
572
- }
573
- }
574
- }, _callee7);
575
- })));
576
- };
577
-
578
- assertOutcome('element.partialScoring = true', {
579
- partialScoring: true
580
- }, {
581
- value: {
582
- 0: 'calf',
583
- 1: 'under',
584
- 2: 'moon'
585
- }
586
- }, {
587
- mode: 'evaluate'
588
- }, {
589
- score: 0.67
590
- });
591
- assertOutcome('element.partialScoring = false', {
592
- partialScoring: false
593
- }, {
594
- value: {
595
- 0: 'calf',
596
- 1: 'under',
597
- 2: 'moon'
598
- }
599
- }, {
600
- mode: 'evaluate'
601
- }, {
602
- score: 0
603
- });
604
- assertOutcome('element.partialScoring = false, env.partialScoring = true', {
605
- partialScoring: false
606
- }, {
607
- value: {
608
- 0: 'calf',
609
- 1: 'under',
610
- 2: 'moon'
611
- }
612
- }, {
613
- mode: 'evaluate',
614
- partialScoring: true
615
- }, {
616
- score: 0
617
- });
618
- assertOutcome('element.partialScoring = true, env.partialScoring = false', {
619
- partialScoring: true
620
- }, {
621
- value: {
622
- 0: 'calf',
623
- 1: 'under',
624
- 2: 'moon'
625
- }
626
- }, {
627
- mode: 'evaluate',
628
- partialScoring: false
629
- }, {
630
- score: 0
631
- });
632
- });
633
- describe('outcome', function () {
634
- var assertOutcome = function assertOutcome(partialScoring, sessionValue, expected) {
635
- it("partial score ".concat(partialScoring ? 'enabled' : ''), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
636
- var result;
637
- return _regenerator["default"].wrap(function _callee8$(_context8) {
638
- while (1) {
639
- switch (_context8.prev = _context8.next) {
640
- case 0:
641
- _context8.next = 2;
642
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
643
- partialScoring: partialScoring
644
- }), sessionValue);
645
-
646
- case 2:
647
- result = _context8.sent;
648
- expect(result).toEqual(expected);
649
-
650
- case 4:
651
- case "end":
652
- return _context8.stop();
653
- }
654
- }
655
- }, _callee8);
656
- })));
657
- };
658
-
659
- assertOutcome(true, {
660
- value: {
661
- 0: 'cow',
662
- 1: 'over',
663
- 2: 'moon'
664
- }
665
- }, {
666
- score: 1,
667
- empty: false
668
- });
669
- assertOutcome(true, {
670
- value: {
671
- 0: 'cattle',
672
- 1: 'over',
673
- 2: 'moon'
674
- }
675
- }, {
676
- score: 1,
677
- empty: false
678
- });
679
- assertOutcome(true, {
680
- value: {
681
- 0: 'calf',
682
- 1: 'over',
683
- 2: 'moon'
684
- }
685
- }, {
686
- score: 1,
687
- empty: false
688
- });
689
- assertOutcome(true, {
690
- value: {
691
- 0: 'cow',
692
- 1: 'past',
693
- 2: 'moon'
694
- }
695
- }, {
696
- score: 1,
697
- empty: false
698
- });
699
- assertOutcome(true, {
700
- value: {
701
- 0: 'cattle',
702
- 1: 'past',
703
- 2: 'moon'
704
- }
705
- }, {
706
- score: 1,
707
- empty: false
708
- });
709
- assertOutcome(true, {
710
- value: {
711
- 0: 'calf',
712
- 1: 'past',
713
- 2: 'moon'
714
- }
715
- }, {
716
- score: 1,
717
- empty: false
718
- });
719
- assertOutcome(true, {
720
- value: {
721
- 0: 'cow',
722
- 1: 'beyond',
723
- 2: 'moon'
724
- }
725
- }, {
726
- score: 1,
727
- empty: false
728
- });
729
- assertOutcome(true, {
730
- value: {
731
- 0: 'cattle',
732
- 1: 'beyond',
733
- 2: 'moon'
734
- }
735
- }, {
736
- score: 1,
737
- empty: false
738
- });
739
- assertOutcome(true, {
740
- value: {
741
- 0: 'calf',
742
- 1: 'beyond',
743
- 2: 'moon'
744
- }
745
- }, {
746
- score: 1,
747
- empty: false
748
- });
749
- assertOutcome(true, {
750
- value: {
751
- 0: 'calf',
752
- 1: 'under',
753
- 2: 'moon'
754
- }
755
- }, {
756
- score: 0.67,
757
- empty: false
758
- });
759
- assertOutcome(true, {
760
- value: {
761
- 0: 'cat',
762
- 1: 'under',
763
- 2: 'moon'
764
- }
765
- }, {
766
- score: 0.33,
767
- empty: false
768
- });
769
- assertOutcome(true, {
770
- value: {
771
- 0: 'cat',
772
- 1: 'under',
773
- 2: 'sun'
774
- }
775
- }, {
776
- score: 0,
777
- empty: false
778
- });
779
- assertOutcome(false, {
780
- value: {
781
- 0: 'cow',
782
- 1: 'over',
783
- 2: 'moon'
784
- }
785
- }, {
786
- score: 1,
787
- empty: false
788
- });
789
- assertOutcome(false, {
790
- value: {
791
- 0: 'cattle',
792
- 1: 'over',
793
- 2: 'moon'
794
- }
795
- }, {
796
- score: 1,
797
- empty: false
798
- });
799
- assertOutcome(false, {
800
- value: {
801
- 0: 'calf',
802
- 1: 'over',
803
- 2: 'moon'
804
- }
805
- }, {
806
- score: 1,
807
- empty: false
808
- });
809
- assertOutcome(false, {
810
- value: {
811
- 0: 'cow',
812
- 1: 'past',
813
- 2: 'moon'
814
- }
815
- }, {
816
- score: 1,
817
- empty: false
818
- });
819
- assertOutcome(false, {
820
- value: {
821
- 0: 'cattle',
822
- 1: 'past',
823
- 2: 'moon'
824
- }
825
- }, {
826
- score: 1,
827
- empty: false
828
- });
829
- assertOutcome(false, {
830
- value: {
831
- 0: 'calf',
832
- 1: 'past',
833
- 2: 'moon'
834
- }
835
- }, {
836
- score: 1,
837
- empty: false
838
- });
839
- assertOutcome(false, {
840
- value: {
841
- 0: 'cow',
842
- 1: 'beyond',
843
- 2: 'moon'
844
- }
845
- }, {
846
- score: 1,
847
- empty: false
848
- });
849
- assertOutcome(false, {
850
- value: {
851
- 0: 'cattle',
852
- 1: 'beyond',
853
- 2: 'moon'
854
- }
855
- }, {
856
- score: 1,
857
- empty: false
858
- });
859
- assertOutcome(false, {
860
- value: {
861
- 0: 'calf',
862
- 1: 'beyond',
863
- 2: 'moon'
864
- }
865
- }, {
866
- score: 1,
867
- empty: false
868
- });
869
- assertOutcome(false, {
870
- value: {
871
- 0: 'calf',
872
- 1: 'under',
873
- 2: 'moon'
874
- }
875
- }, {
876
- score: 0,
877
- empty: false
878
- });
879
- assertOutcome(false, {
880
- value: {
881
- 0: 'cat',
882
- 1: 'under',
883
- 2: 'moon'
884
- }
885
- }, {
886
- score: 0,
887
- empty: false
888
- });
889
- assertOutcome(false, {
890
- value: {
891
- 0: 'cat',
892
- 1: 'under',
893
- 2: 'sun'
894
- }
895
- }, {
896
- score: 0,
897
- empty: false
898
- });
899
-
900
- var returnModel = function returnModel(session) {
901
- it("empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
902
- var m;
903
- return _regenerator["default"].wrap(function _callee9$(_context9) {
904
- while (1) {
905
- switch (_context9.prev = _context9.next) {
906
- case 0:
907
- _context9.next = 2;
908
- return (0, _index.outcome)(question, session);
909
-
910
- case 2:
911
- m = _context9.sent;
912
- expect(m).toEqual(expect.objectContaining({
913
- score: 0,
914
- empty: true
915
- }));
916
-
917
- case 4:
918
- case "end":
919
- return _context9.stop();
920
- }
921
- }
922
- }, _callee9);
923
- })));
924
- };
925
-
926
- returnModel(undefined);
927
- returnModel(null);
928
- returnModel({});
929
- });
930
- describe('prepareVal', function () {
931
- it('should return empty string on null or undefined', function () {
932
- expect((0, _index.prepareVal)(null)).toEqual('');
933
- expect((0, _index.prepareVal)(undefined)).toEqual('');
934
- });
935
- it('should remove html tags', function () {
936
- expect((0, _index.prepareVal)('<div>Foo Bar</div>')).toEqual('Foo Bar');
937
- });
938
- describe('correct response', function () {
939
- var question;
940
- beforeEach(function () {
941
- question = {
942
- choices: choices
943
- };
944
- });
945
- it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
946
- var sess;
947
- return _regenerator["default"].wrap(function _callee10$(_context10) {
948
- while (1) {
949
- switch (_context10.prev = _context10.next) {
950
- case 0:
951
- _context10.next = 2;
952
- return (0, _index.createCorrectResponseSession)(question, {
953
- mode: 'gather',
954
- role: 'instructor'
955
- });
956
-
957
- case 2:
958
- sess = _context10.sent;
959
- expect(sess).toEqual({
960
- id: '1',
961
- value: {
962
- 0: 'cow',
963
- 1: 'over',
964
- 2: 'moon'
965
- }
966
- });
967
-
968
- case 4:
969
- case "end":
970
- return _context10.stop();
971
- }
972
- }
973
- }, _callee10);
974
- })));
975
- it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
976
- var noResult;
977
- return _regenerator["default"].wrap(function _callee11$(_context11) {
978
- while (1) {
979
- switch (_context11.prev = _context11.next) {
980
- case 0:
981
- _context11.next = 2;
982
- return (0, _index.createCorrectResponseSession)(question, {
983
- mode: 'gather',
984
- role: 'student'
985
- });
986
-
987
- case 2:
988
- noResult = _context11.sent;
989
- expect(noResult).toBeNull();
990
-
991
- case 4:
992
- case "end":
993
- return _context11.stop();
994
- }
995
- }
996
- }, _callee11);
997
- })));
998
- });
999
- });
1000
- describe('correct response', function () {
1001
- it('returns correct response if role is instructor and mode is gather', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
1002
- var sess;
1003
- return _regenerator["default"].wrap(function _callee12$(_context12) {
1004
- while (1) {
1005
- switch (_context12.prev = _context12.next) {
1006
- case 0:
1007
- _context12.next = 2;
1008
- return (0, _index.createCorrectResponseSession)(question, {
1009
- mode: 'gather',
1010
- role: 'instructor'
1011
- });
1012
-
1013
- case 2:
1014
- sess = _context12.sent;
1015
- expect(sess).toEqual({
1016
- id: '1',
1017
- value: {
1018
- 0: 'cow',
1019
- 1: 'over',
1020
- 2: 'moon'
1021
- }
1022
- });
1023
-
1024
- case 4:
1025
- case "end":
1026
- return _context12.stop();
1027
- }
1028
- }
1029
- }, _callee12);
1030
- })));
1031
- it('returns correct response if role is instructor and mode is view', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
1032
- var sess;
1033
- return _regenerator["default"].wrap(function _callee13$(_context13) {
1034
- while (1) {
1035
- switch (_context13.prev = _context13.next) {
1036
- case 0:
1037
- _context13.next = 2;
1038
- return (0, _index.createCorrectResponseSession)(question, {
1039
- mode: 'view',
1040
- role: 'instructor'
1041
- });
1042
-
1043
- case 2:
1044
- sess = _context13.sent;
1045
- expect(sess).toEqual({
1046
- id: '1',
1047
- value: {
1048
- 0: 'cow',
1049
- 1: 'over',
1050
- 2: 'moon'
1051
- }
1052
- });
1053
-
1054
- case 4:
1055
- case "end":
1056
- return _context13.stop();
1057
- }
1058
- }
1059
- }, _callee13);
1060
- })));
1061
- it('returns null if mode is evaluate', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
1062
- var noResult;
1063
- return _regenerator["default"].wrap(function _callee14$(_context14) {
1064
- while (1) {
1065
- switch (_context14.prev = _context14.next) {
1066
- case 0:
1067
- _context14.next = 2;
1068
- return (0, _index.createCorrectResponseSession)(question, {
1069
- mode: 'evaluate',
1070
- role: 'instructor'
1071
- });
1072
-
1073
- case 2:
1074
- noResult = _context14.sent;
1075
- expect(noResult).toBeNull();
1076
-
1077
- case 4:
1078
- case "end":
1079
- return _context14.stop();
1080
- }
1081
- }
1082
- }, _callee14);
1083
- })));
1084
- it('returns null if role is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
1085
- var noResult;
1086
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1087
- while (1) {
1088
- switch (_context15.prev = _context15.next) {
1089
- case 0:
1090
- _context15.next = 2;
1091
- return (0, _index.createCorrectResponseSession)(question, {
1092
- mode: 'gather',
1093
- role: 'student'
1094
- });
1095
-
1096
- case 2:
1097
- noResult = _context15.sent;
1098
- expect(noResult).toBeNull();
1099
-
1100
- case 4:
1101
- case "end":
1102
- return _context15.stop();
1103
- }
1104
- }
1105
- }, _callee15);
1106
- })));
1107
- });
1108
- describe('prepareChoice', function () {
1109
- var assertPrepareChoice = function assertPrepareChoice(env, defaultFeedback, choice, expected) {
1110
- var preparChoiceFn = (0, _index.prepareChoice)(env.mode, defaultFeedback);
1111
- it("prepare choices in ".concat(env.mode, " mode: ").concat(JSON.stringify(choice), " -> ").concat(JSON.stringify(expected)), function () {
1112
- expect(preparChoiceFn(choice)).toEqual(expected);
1113
- });
1114
- };
1115
-
1116
- assertPrepareChoice({
1117
- mode: 'gather'
1118
- }, {
1119
- correct: 'Correct',
1120
- incorrect: 'Incorrect'
1121
- }, {
1122
- value: '0',
1123
- label: 'cow'
1124
- }, {
1125
- value: '0',
1126
- label: 'cow'
1127
- });
1128
- assertPrepareChoice({
1129
- mode: 'view'
1130
- }, {
1131
- correct: 'Correct',
1132
- incorrect: 'Incorrect'
1133
- }, {
1134
- value: '0',
1135
- label: 'cow'
1136
- }, {
1137
- value: '0',
1138
- label: 'cow'
1139
- });
1140
- assertPrepareChoice({
1141
- mode: 'evaluate'
1142
- }, {
1143
- correct: 'Correct',
1144
- incorrect: 'Incorrect'
1145
- }, {
1146
- value: '0',
1147
- label: 'cow'
1148
- }, {
1149
- value: '0',
1150
- label: 'cow',
1151
- correct: true
1152
- });
1153
- assertPrepareChoice({
1154
- mode: 'evaluate'
1155
- }, {
1156
- correct: 'Correct',
1157
- incorrect: 'Incorrect'
1158
- }, {
1159
- value: '0',
1160
- label: 'cow',
1161
- feedback: {
1162
- type: 'default'
1163
- }
1164
- }, {
1165
- value: '0',
1166
- label: 'cow',
1167
- correct: true,
1168
- feedback: 'Correct'
1169
- });
1170
- assertPrepareChoice({
1171
- mode: 'evaluate'
1172
- }, {
1173
- correct: 'Correct',
1174
- incorrect: 'Incorrect'
1175
- }, {
1176
- value: '0',
1177
- label: 'cow',
1178
- feedback: {
1179
- type: 'custom'
1180
- }
1181
- }, {
1182
- value: '0',
1183
- label: 'cow',
1184
- correct: true,
1185
- feedback: undefined
1186
- });
1187
- assertPrepareChoice({
1188
- mode: 'evaluate'
1189
- }, {
1190
- correct: 'Correct',
1191
- incorrect: 'Incorrect'
1192
- }, {
1193
- value: '0',
1194
- label: 'cow',
1195
- feedback: {
1196
- type: 'custom',
1197
- value: 'Custom Feedback'
1198
- }
1199
- }, {
1200
- value: '0',
1201
- label: 'cow',
1202
- correct: true,
1203
- feedback: 'Custom Feedback'
1204
- });
1205
- });
1206
- });
1207
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImdldFNodWZmbGVkQ2hvaWNlcyIsImNob2ljZXMiLCJzZXNzaW9uIiwidXBkYXRlU2Vzc2lvbiIsImtleSIsImN1cnJlbnRTaHVmZmxlZCIsInNodWZmbGVkVmFsdWVzIiwiZmlsdGVyIiwidiIsImxlbmd0aCIsInBhcnRpYWxTY29yaW5nIiwiZW5hYmxlZCIsImNvbmZpZyIsImVudiIsImNob2ljZSIsImwiLCJsYWJlbCIsInZhbHVlIiwicXVlc3Rpb24iLCJtYXJrdXAiLCJkaXNhYmxlZCIsInByb21wdCIsIm5vdGUiLCJkZXNjcmliZSIsInEiLCJpdCIsIm1vZGUiLCJtIiwiZXhwZWN0IiwidG9FcXVhbCIsIm9iamVjdENvbnRhaW5pbmciLCJmZWVkYmFjayIsInJlc3BvbnNlQ29ycmVjdCIsInJldHVybk1vZGVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsImFzc2VydEdhdGhlciIsImV4dHJhIiwiZXhwZWN0ZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwicmF0aW9uYWxlIiwiaWQiLCJlbGVtZW50IiwicmVzdWx0IiwibWF4TGVuZ3RoUGVyQ2hvaWNlIiwic2hvd05vdGUiLCJwcm9tcHRFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwic3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQiLCJhc3NlcnRWaWV3Iiwicm9sZSIsImFzc2VydFZpZXdTdHVkZW50IiwiYXNzZXJ0RXZhbHVhdGUiLCJjb3JyZWN0IiwiYXNzZXJ0U2NvcmUiLCJzY29yZSIsInJldHVyblNjb3JlIiwiYXNzZXJ0T3V0Y29tZSIsIm1lc3NhZ2UiLCJzZXNzaW9uVmFsdWUiLCJlbXB0eSIsImJlZm9yZUVhY2giLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCIsImFzc2VydFByZXBhcmVDaG9pY2UiLCJk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Q0FBUjtBQW1ERCxDQTdrQk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBnZXRTY29yZSwgb3V0Y29tZSwgcHJlcGFyZVZhbCwgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbiwgcHJlcGFyZUNob2ljZSB9IGZyb20gJy4uL2luZGV4JztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9waWUtdG9vbGJveC9jb250cm9sbGVyLXV0aWxzJywgKCkgPT4gKHtcbiAgZ2V0U2h1ZmZsZWRDaG9pY2VzOiAoY2hvaWNlcywgc2Vzc2lvbiwgdXBkYXRlU2Vzc2lvbiwga2V5KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFNodWZmbGVkID0gKChzZXNzaW9uIHx8IHt9KS5zaHVmZmxlZFZhbHVlcyB8fCBbXSkuZmlsdGVyKCh2KSA9PiB2KTtcblxuICAgIGlmIChzZXNzaW9uICYmICFjdXJyZW50U2h1ZmZsZWQubGVuZ3RoICYmIHVwZGF0ZVNlc3Npb24gJiYgdHlwZW9mIHVwZGF0ZVNlc3Npb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVwZGF0ZVNlc3Npb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hvaWNlcztcbiAgfSxcbiAgcGFydGlhbFNjb3Jpbmc6IHtcbiAgICBlbmFibGVkOiAoY29uZmlnLCBlbnYpID0+IHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGVudiA9IGVudiB8fCB7fTtcblxuICAgICAgaWYgKGNvbmZpZy5wYXJ0aWFsU2NvcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW52LnBhcnRpYWxTY29yaW5nID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0sXG59KSk7XG5cbmNvbnN0IGNob2ljZSA9IChsLCB2KSA9PiAoeyBsYWJlbDogbCwgdmFsdWU6IHYgfSk7XG5jb25zdCBjaG9pY2VzID0ge1xuICAwOiBbY2hvaWNlKCdjb3cnLCAnMCcpLCBjaG9pY2UoJ2NhdHRsZScsICcxJyksIGNob2ljZSgnY2FsZicsICcyJyldLFxuICAxOiBbY2hvaWNlKCdvdmVyJywgJzAnKSwgY2hvaWNlKCdwYXN0JywgJzEnKSwgY2hvaWNlKCdiZXlvbmQnLCAnMicpXSxcbiAgMjogW2Nob2ljZSgnbW9vbicsICcwJyldLFxufTtcblxuY29uc3QgcXVlc3Rpb24gPSB7XG4gIG1hcmt1cDogJzxwPlRoZSB7ezB9fSBqdW1wZWQge3sxfX0gdGhlIHt7Mn19PC9wPicsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgY2hvaWNlcyxcbiAgcHJvbXB0OiAnQ29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbiAgbm90ZTogJ1RoZSBhbnN3ZXIgc2hvd24gYWJvdmUgaXMgdGhlIG1vc3QgY29tbW9uIGNvcnJlY3QgYW5zd2VyIGZvciB0aGlzIGl0ZW0uJyxcbn07XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgbGV0IHEsIGVudjtcblxuICAgIGl0KCdvdXRwdXQgd2hlbiBzZXNzaW9uIGlzIGRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBtb2RlOiAnZXZhbHVhdGUnIH0pO1xuXG4gICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBvdXRwdXQgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBmZWVkYmFjazogeyAwOiAnaW5jb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuXG4gICAgY29uc3QgYXNzZXJ0R2F0aGVyID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogZ2F0aGVyLCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIG5vdCBzZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICdpbnN0cnVjdG9yJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBudWxsLFxuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXdTdHVkZW50ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICcgc3R1ZGVudCcgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXR0bGUnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnYmV5b25kJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY293JyxcbiAgICAgICAgICAxOiAnb3ZlcicsXG4gICAgICAgICAgMjogJ21vb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NvdycsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXIgdXNpbmcgYWx0ZXJuYXRlcycsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY2FsZicsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBpbmNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICdoYW4nLFxuICAgICAgICAgIDE6ICdhYm92ZScsXG4gICAgICAgICAgMjogJ2NoaWNrZW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCBzY29yZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTY29yZSA9IChzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoJ3JldHVybiBzY29yZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KHNjb3JlKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjY3KTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjMzKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIDApO1xuXG4gICAgY29uc3QgcmV0dXJuU2NvcmUgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHNjb3JlID0gMCB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbikpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuU2NvcmUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5TY29yZShudWxsKTtcbiAgICByZXR1cm5TY29yZSh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lIHBhcnRpYWxTY29yaW5nIHRlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChtZXNzYWdlLCBleHRyYSwgc2Vzc2lvblZhbHVlLCBlbnYsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAuNjcgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBlbnYucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBlbnYucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKHBhcnRpYWxTY29yaW5nLCBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgcGFydGlhbCBzY29yZSAke3BhcnRpYWxTY29yaW5nID8gJ2VuYWJsZWQnIDogJyd9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgcGFydGlhbFNjb3JpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC42NywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC4zMywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ3N1bicgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdCcsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBlbXB0eTogdHJ1ZSB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHNjb3JlOiAwLCBlbXB0eTogdHJ1ZSB9KSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuTW9kZWwodW5kZWZpbmVkKTtcbiAgICByZXR1cm5Nb2RlbChudWxsKTtcbiAgICByZXR1cm5Nb2RlbCh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcmVwYXJlVmFsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyBvbiBudWxsIG9yIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKG51bGwpKS50b0VxdWFsKCcnKTtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKHVuZGVmaW5lZCkpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgaHRtbCB0YWdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHByZXBhcmVWYWwoJzxkaXY+Rm9vIEJhcjwvZGl2PicpKS50b0VxdWFsKCdGb28gQmFyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICAgIGxldCBxdWVzdGlvbjtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBxdWVzdGlvbiA9IHtcbiAgICAgICAgICBjaG9pY2VzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgZW52IGlzIGNvcnJlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcbiAgICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0IHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIGdhdGhlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIHZpZXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IGlkOiAnMScsIHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdldmFsdWF0ZScsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiByb2xlIGlzIHN0dWRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlcGFyZUNob2ljZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRQcmVwYXJlQ2hvaWNlID0gKGVudiwgZGVmYXVsdEZlZWRiYWNrLCBjaG9pY2UsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCBwcmVwYXJDaG9pY2VGbiA9IHByZXBhcmVDaG9pY2UoZW52Lm1vZGUsIGRlZmF1bHRGZWVkYmFjayk7XG5cbiAgICAgIGl0KGBwcmVwYXJlIGNob2ljZXMgaW4gJHtlbnYubW9kZX0gbW9kZTogJHtKU09OLnN0cmluZ2lmeShjaG9pY2UpfSAtPiAke0pTT04uc3RyaW5naWZ5KGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChwcmVwYXJDaG9pY2VGbihjaG9pY2UpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZ2F0aGVyJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAndmlldycgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdkZWZhdWx0JyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDb3JyZWN0JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdjdXN0b20nIH0gfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBjb3JyZWN0OiB0cnVlLCBmZWVkYmFjazogdW5kZWZpbmVkIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFByZXBhcmVDaG9pY2UoXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgZmVlZGJhY2s6IHsgdHlwZTogJ2N1c3RvbScsIHZhbHVlOiAnQ3VzdG9tIEZlZWRiYWNrJyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDdXN0b20gRmVlZGJhY2snIH0sXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==