@pie-element/inline-dropdown 10.1.7 → 10.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,705 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _index = require("../index");
5
+ var _defaults = _interopRequireDefault(require("../defaults"));
6
+ describe('inline-dropdown', () => {
7
+ let result, question, session, env;
8
+ beforeEach(() => {
9
+ question = {
10
+ displayType: 'block',
11
+ language: 'english',
12
+ lockChoiceOrder: false,
13
+ choices: {
14
+ 0: [{
15
+ correct: false,
16
+ value: '9719395',
17
+ label: '20,000'
18
+ }, {
19
+ correct: false,
20
+ value: '9719396',
21
+ label: '17,000'
22
+ }, {
23
+ correct: false,
24
+ value: '9719397',
25
+ label: '16,100'
26
+ }, {
27
+ correct: true,
28
+ value: '9719398',
29
+ label: '16,000',
30
+ rationale: 'rationale for choice'
31
+ }]
32
+ },
33
+ element: 'inline-dropdown-element',
34
+ rationale: '',
35
+ prompt: '<p>\n <strong><span style="color: #000000; font-family: Arial;">El número 16,101</span></strong> <strong><span style="color: #000000; font-family: Arial;">redondeado al</span></strong> <strong><span style="color: #000000; font-family: Arial;">millar más cercano es&nbsp;______________.</span></strong>\n</p>\n<p>\n <strong><span style="color: #000000;">&nbsp;</span></strong>\n</p>',
36
+ scoringType: 'auto',
37
+ teacherInstructions: true,
38
+ studentInstructions: false,
39
+ partialScoring: false,
40
+ markup: '{{0}}',
41
+ id: '2421310',
42
+ alternateResponses: null
43
+ };
44
+ });
45
+ describe('edge cases', () => {
46
+ it('is ok is session is empty', async () => {
47
+ session = {};
48
+ env = {
49
+ mode: 'evaluate'
50
+ };
51
+ const r = await (0, _index.model)(question, {}, {
52
+ mode: 'evaluate'
53
+ });
54
+ expect(r).toBeDefined();
55
+ });
56
+ });
57
+ describe('model - with updateSession', () => {
58
+ it('calls updateSession', async () => {
59
+ session = {
60
+ id: '1',
61
+ element: 'inline-dropdown-element'
62
+ };
63
+ env = {
64
+ mode: 'gather'
65
+ };
66
+ const updateSession = jest.fn().mockResolvedValue();
67
+ await (0, _index.model)(question, session, env, updateSession);
68
+ expect(updateSession).toHaveBeenCalledWith('1', 'inline-dropdown-element', expect.objectContaining({
69
+ shuffledValues: {
70
+ 0: expect.arrayContaining(['9719395', '9719396', '9719397', '9719398'])
71
+ }
72
+ }));
73
+ });
74
+ });
75
+ });
76
+ const question = {
77
+ displayType: 'block',
78
+ language: 'english',
79
+ prompt: 'Use the drop-downs to complete the sentence',
80
+ markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
81
+ choices: {
82
+ 0: [{
83
+ label: 'cow ',
84
+ value: '0',
85
+ correct: true,
86
+ rationale: 'rationale cow'
87
+ }, {
88
+ label: 'dog ',
89
+ value: '1',
90
+ correct: false,
91
+ rationale: 'rationale dog'
92
+ }, {
93
+ label: 'cat ',
94
+ value: '2',
95
+ correct: false,
96
+ rationale: 'rationale cat'
97
+ }],
98
+ 1: [{
99
+ label: 'over ',
100
+ value: '0',
101
+ correct: true,
102
+ rationale: 'rationale over'
103
+ }, {
104
+ label: 'under ',
105
+ value: '1',
106
+ correct: false,
107
+ rationale: 'rationale under'
108
+ }, {
109
+ label: 'across ',
110
+ value: '2',
111
+ correct: false,
112
+ rationale: 'rationale across'
113
+ }],
114
+ 2: [{
115
+ label: 'moon ',
116
+ value: '0',
117
+ correct: true,
118
+ rationale: 'rationale moon'
119
+ }, {
120
+ label: 'sun',
121
+ value: '2',
122
+ correct: false,
123
+ rationale: 'rationale sun'
124
+ }, {
125
+ label: 'house ',
126
+ value: '3',
127
+ correct: false,
128
+ rationale: 'rationale house'
129
+ }]
130
+ }
131
+ };
132
+ describe('controller', () => {
133
+ describe('model', () => {
134
+ let q;
135
+ const updateSession = jest.fn().mockResolvedValue();
136
+ it('output when session is defined', async () => {
137
+ const m = await (0, _index.model)(question, {
138
+ value: {
139
+ 0: '0',
140
+ 1: '0',
141
+ 2: '0'
142
+ }
143
+ }, {
144
+ mode: 'evaluate'
145
+ }, updateSession);
146
+ expect(m).toEqual(expect.objectContaining({
147
+ feedback: {
148
+ 0: 'correct',
149
+ 1: 'correct',
150
+ 2: 'correct'
151
+ },
152
+ responseCorrect: true
153
+ }));
154
+ });
155
+ const returnModel = session => {
156
+ it(`output when session is ${JSON.stringify(session)}`, async () => {
157
+ const m = await (0, _index.model)(question, session, {
158
+ mode: 'evaluate'
159
+ }, updateSession);
160
+ expect(m).toEqual(expect.objectContaining({
161
+ feedback: {
162
+ 0: 'incorrect',
163
+ 1: 'incorrect',
164
+ 2: 'incorrect'
165
+ },
166
+ responseCorrect: false
167
+ }));
168
+ });
169
+ };
170
+ returnModel(undefined);
171
+ returnModel(null);
172
+ returnModel({});
173
+ const choicesWithNullRationale = {
174
+ 0: [{
175
+ label: 'cow ',
176
+ value: '0',
177
+ correct: true,
178
+ rationale: null
179
+ }, {
180
+ label: 'dog ',
181
+ value: '1',
182
+ correct: false,
183
+ rationale: null
184
+ }, {
185
+ label: 'cat ',
186
+ value: '2',
187
+ correct: false,
188
+ rationale: null
189
+ }],
190
+ 1: [{
191
+ label: 'over ',
192
+ value: '0',
193
+ correct: true,
194
+ rationale: null
195
+ }, {
196
+ label: 'under ',
197
+ value: '1',
198
+ correct: false,
199
+ rationale: null
200
+ }, {
201
+ label: 'across ',
202
+ value: '2',
203
+ correct: false,
204
+ rationale: null
205
+ }],
206
+ 2: [{
207
+ label: 'moon ',
208
+ value: '0',
209
+ correct: true,
210
+ rationale: null
211
+ }, {
212
+ label: 'sun',
213
+ value: '2',
214
+ correct: false,
215
+ rationale: null
216
+ }, {
217
+ label: 'house ',
218
+ value: '3',
219
+ correct: false,
220
+ rationale: null
221
+ }]
222
+ };
223
+ const assertGather = (label, extra, session, expected) => {
224
+ it(`'mode: gather, ${label}'`, async () => {
225
+ q = {
226
+ ...question,
227
+ alternateResponse: {
228
+ 2: ['2']
229
+ },
230
+ lockChoiceOrder: true,
231
+ teacherInstructions: 'Teacher Instructions',
232
+ rationale: 'Rationale',
233
+ ...extra
234
+ };
235
+ const result = await (0, _index.model)(q, {
236
+ id: '1',
237
+ element: 'explicit-constructed-response',
238
+ ...session
239
+ }, {
240
+ mode: 'gather'
241
+ }, updateSession);
242
+ expect(result).toEqual({
243
+ ...question,
244
+ disabled: false,
245
+ mode: 'gather',
246
+ feedback: {},
247
+ responseCorrect: undefined,
248
+ choices: choicesWithNullRationale,
249
+ ...expected
250
+ });
251
+ });
252
+ };
253
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
254
+ rationale: null,
255
+ teacherInstructions: null
256
+ });
257
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
258
+ promptEnabled: false,
259
+ rationaleEnabled: false,
260
+ teacherInstructionsEnabled: false,
261
+ studentInstructionsEnabled: false
262
+ }, {}, {
263
+ prompt: null,
264
+ rationale: null,
265
+ teacherInstructions: null
266
+ });
267
+ const assertView = (label, extra, session, expected) => {
268
+ it(`'mode: view, ${label}'`, async () => {
269
+ q = {
270
+ ...question,
271
+ alternateResponse: {
272
+ 2: ['2']
273
+ },
274
+ lockChoiceOrder: true,
275
+ teacherInstructions: 'Teacher Instructions',
276
+ rationale: 'Rationale',
277
+ ...extra
278
+ };
279
+ const result = await (0, _index.model)(q, {
280
+ id: '1',
281
+ element: 'explicit-constructed-response',
282
+ ...session
283
+ }, {
284
+ mode: 'view',
285
+ role: 'instructor'
286
+ }, updateSession);
287
+ expect(result).toEqual({
288
+ ...question,
289
+ mode: 'view',
290
+ disabled: true,
291
+ feedback: {},
292
+ responseCorrect: undefined,
293
+ ...expected
294
+ });
295
+ });
296
+ };
297
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled set to false', {
298
+ promptEnabled: false,
299
+ rationaleEnabled: false,
300
+ teacherInstructionsEnabled: false,
301
+ studentInstructionsEnabled: false,
302
+ choiceRationaleEnabled: false
303
+ }, {}, {
304
+ prompt: null,
305
+ rationale: null,
306
+ teacherInstructions: null,
307
+ choices: choicesWithNullRationale
308
+ });
309
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled unset', {}, {}, {
310
+ teacherInstructions: 'Teacher Instructions',
311
+ rationale: 'Rationale'
312
+ });
313
+ const assertViewStudent = (label, extra, session, expected) => {
314
+ it(`'mode: view, ${label}'`, async () => {
315
+ q = {
316
+ ...question,
317
+ alternateResponse: {
318
+ 2: ['2']
319
+ },
320
+ lockChoiceOrder: true,
321
+ teacherInstructions: 'Teacher Instructions',
322
+ rationale: 'Rationale',
323
+ ...extra
324
+ };
325
+ const result = await (0, _index.model)(q, {
326
+ id: '1',
327
+ element: 'explicit-constructed-response',
328
+ ...session
329
+ }, {
330
+ mode: 'view',
331
+ role: 'student'
332
+ });
333
+ expect(result).toEqual({
334
+ ...question,
335
+ mode: 'view',
336
+ disabled: true,
337
+ feedback: {},
338
+ responseCorrect: undefined,
339
+ choices: choicesWithNullRationale,
340
+ ...expected
341
+ });
342
+ });
343
+ };
344
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
345
+ promptEnabled: false,
346
+ rationaleEnabled: false,
347
+ teacherInstructionsEnabled: false,
348
+ studentInstructionsEnabled: false
349
+ }, {}, {
350
+ prompt: null,
351
+ rationale: null,
352
+ teacherInstructions: null
353
+ });
354
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
355
+ rationale: null,
356
+ teacherInstructions: null
357
+ });
358
+ const assertEvaluate = (label, extra, session, expected) => {
359
+ it(`'mode: evaluate, ${label}'`, async () => {
360
+ q = {
361
+ ...question,
362
+ alternateResponse: {
363
+ 0: ['2'],
364
+ 1: ['2'],
365
+ 2: ['2']
366
+ },
367
+ lockChoiceOrder: true,
368
+ teacherInstructions: 'Teacher Instructions',
369
+ rationale: 'Rationale',
370
+ choiceRationaleEnabled: true,
371
+ ...extra
372
+ };
373
+ const result = await (0, _index.model)(q, {
374
+ id: '1',
375
+ element: 'explicit-constructed-response',
376
+ ...session
377
+ }, {
378
+ mode: 'evaluate',
379
+ role: 'instructor'
380
+ }, updateSession);
381
+ expect(result).toEqual({
382
+ ...question,
383
+ teacherInstructions: 'Teacher Instructions',
384
+ rationale: 'Rationale',
385
+ mode: 'evaluate',
386
+ disabled: true,
387
+ ...expected
388
+ });
389
+ });
390
+ };
391
+ assertEvaluate('- correct answer', {}, {
392
+ value: {
393
+ 0: '0',
394
+ 1: '0',
395
+ 2: '0'
396
+ }
397
+ }, {
398
+ feedback: {
399
+ 0: 'correct',
400
+ 1: 'correct',
401
+ 2: 'correct'
402
+ },
403
+ responseCorrect: true
404
+ });
405
+ assertEvaluate('- partially correct answer', {}, {
406
+ value: {
407
+ 0: '0',
408
+ 1: '0',
409
+ 2: '1'
410
+ }
411
+ }, {
412
+ feedback: {
413
+ 0: 'correct',
414
+ 1: 'correct',
415
+ 2: 'incorrect'
416
+ },
417
+ responseCorrect: false
418
+ });
419
+ assertEvaluate('- partially correct answer using alternates', {}, {
420
+ value: {
421
+ 0: '2',
422
+ 1: '1',
423
+ 2: '2'
424
+ }
425
+ }, {
426
+ feedback: {
427
+ 0: 'correct',
428
+ 1: 'incorrect',
429
+ 2: 'correct'
430
+ },
431
+ responseCorrect: false
432
+ });
433
+ assertEvaluate('- incorrect answer', {}, {
434
+ value: {
435
+ 0: '1',
436
+ 1: '1',
437
+ 2: '1'
438
+ }
439
+ }, {
440
+ feedback: {
441
+ 0: 'incorrect',
442
+ 1: 'incorrect',
443
+ 2: 'incorrect'
444
+ },
445
+ responseCorrect: false
446
+ });
447
+ });
448
+ describe('get score', () => {
449
+ const assertScore = (session, expected) => {
450
+ it('return score', () => {
451
+ const score = (0, _index.getScore)(question, session);
452
+ expect(score).toEqual(expected);
453
+ });
454
+ };
455
+ assertScore({
456
+ value: {
457
+ 0: '0',
458
+ 1: '0',
459
+ 2: '0'
460
+ }
461
+ }, 1);
462
+ assertScore({
463
+ value: {
464
+ 0: '0',
465
+ 1: '0',
466
+ 2: '1'
467
+ }
468
+ }, 0.67);
469
+ assertScore({
470
+ value: {
471
+ 0: '0',
472
+ 1: '1',
473
+ 2: '1'
474
+ }
475
+ }, 0.33);
476
+ assertScore({
477
+ value: {
478
+ 0: '1',
479
+ 1: '1',
480
+ 2: '1'
481
+ }
482
+ }, 0);
483
+ const returnScore = session => {
484
+ it(`score = 0 when session is ${JSON.stringify(session)}`, () => {
485
+ expect((0, _index.getScore)(question, session)).toEqual(0);
486
+ });
487
+ };
488
+ returnScore(undefined);
489
+ returnScore(null);
490
+ returnScore({});
491
+ });
492
+ describe('outcome partialScoring test', () => {
493
+ const assertOutcome = (message, extra, sessionValue, env, expected) => {
494
+ it(message, async () => {
495
+ const result = await (0, _index.outcome)({
496
+ ...question,
497
+ ...extra
498
+ }, sessionValue, env);
499
+ expect(result).toEqual(expect.objectContaining(expected));
500
+ });
501
+ };
502
+ assertOutcome('element.partialScoring = true', {
503
+ partialScoring: true
504
+ }, {
505
+ value: {
506
+ 0: '0',
507
+ 1: '0',
508
+ 2: '1'
509
+ }
510
+ }, {
511
+ mode: 'evaluate'
512
+ }, {
513
+ score: 0.67
514
+ });
515
+ assertOutcome('element.partialScoring = false', {
516
+ partialScoring: false
517
+ }, {
518
+ value: {
519
+ 0: '0',
520
+ 1: '0',
521
+ 2: '1'
522
+ }
523
+ }, {
524
+ mode: 'evaluate'
525
+ }, {
526
+ score: 0
527
+ });
528
+ assertOutcome('element.partialScoring = false, env.partialScoring = true', {
529
+ partialScoring: false
530
+ }, {
531
+ value: {
532
+ 0: '0',
533
+ 1: '0',
534
+ 2: '1'
535
+ }
536
+ }, {
537
+ mode: 'evaluate',
538
+ partialScoring: true
539
+ }, {
540
+ score: 0
541
+ });
542
+ assertOutcome('element.partialScoring = true, env.partialScoring = false', {
543
+ partialScoring: true
544
+ }, {
545
+ value: {
546
+ 0: '0',
547
+ 1: '0',
548
+ 2: '1'
549
+ }
550
+ }, {
551
+ mode: 'evaluate',
552
+ partialScoring: false
553
+ }, {
554
+ score: 0
555
+ });
556
+ });
557
+ describe('outcome', () => {
558
+ const assertOutcome = (partialScoring, sessionValue, expected) => {
559
+ it(`partial score ${partialScoring ? 'enabled' : 'disabled'}`, async () => {
560
+ const result = await (0, _index.outcome)({
561
+ ...question,
562
+ partialScoring
563
+ }, sessionValue);
564
+ expect(result).toEqual(expect.objectContaining(expected));
565
+ });
566
+ };
567
+ assertOutcome(true, {
568
+ value: {
569
+ 0: '0',
570
+ 1: '0',
571
+ 2: '0'
572
+ }
573
+ }, {
574
+ score: 1,
575
+ empty: false
576
+ });
577
+ assertOutcome(true, {
578
+ value: {
579
+ 0: '0',
580
+ 1: '0',
581
+ 2: '1'
582
+ }
583
+ }, {
584
+ score: 0.67,
585
+ empty: false
586
+ });
587
+ assertOutcome(true, {
588
+ value: {
589
+ 0: '0',
590
+ 1: '1',
591
+ 2: '1'
592
+ }
593
+ }, {
594
+ score: 0.33,
595
+ empty: false
596
+ });
597
+ assertOutcome(true, {
598
+ value: {
599
+ 0: '1',
600
+ 1: '1',
601
+ 2: '1'
602
+ }
603
+ }, {
604
+ score: 0,
605
+ empty: false
606
+ });
607
+ assertOutcome(false, {
608
+ value: {
609
+ 0: '0',
610
+ 1: '0',
611
+ 2: '0'
612
+ }
613
+ }, {
614
+ score: 1,
615
+ empty: false
616
+ });
617
+ assertOutcome(false, {
618
+ value: {
619
+ 0: '0',
620
+ 1: '0',
621
+ 2: '1'
622
+ }
623
+ }, {
624
+ score: 0,
625
+ empty: false
626
+ });
627
+ assertOutcome(false, {
628
+ value: {
629
+ 0: '0',
630
+ 1: '1',
631
+ 2: '1'
632
+ }
633
+ }, {
634
+ score: 0,
635
+ empty: false
636
+ });
637
+ assertOutcome(false, {
638
+ value: {
639
+ 0: '1',
640
+ 1: '1',
641
+ 2: '1'
642
+ }
643
+ }, {
644
+ score: 0,
645
+ empty: false
646
+ });
647
+ const returnModel = session => {
648
+ it(`empty: true when session is ${JSON.stringify(session)}`, async () => {
649
+ const m = await (0, _index.outcome)(question, session);
650
+ expect(m).toEqual(expect.objectContaining({
651
+ score: 0,
652
+ empty: true
653
+ }));
654
+ });
655
+ };
656
+ returnModel(undefined);
657
+ returnModel(null);
658
+ returnModel({});
659
+ });
660
+ describe('correct response', () => {
661
+ it('returns correct response if role is instructor and mode is gather', async () => {
662
+ const sess = await (0, _index.createCorrectResponseSession)(question, {
663
+ mode: 'gather',
664
+ role: 'instructor'
665
+ });
666
+ expect(sess).toEqual({
667
+ id: '1',
668
+ value: {
669
+ 0: '0',
670
+ 1: '0',
671
+ 2: '0'
672
+ }
673
+ });
674
+ });
675
+ it('returns correct response if role is instructor and mode is view', async () => {
676
+ const sess = await (0, _index.createCorrectResponseSession)(question, {
677
+ mode: 'view',
678
+ role: 'instructor'
679
+ });
680
+ expect(sess).toEqual({
681
+ id: '1',
682
+ value: {
683
+ 0: '0',
684
+ 1: '0',
685
+ 2: '0'
686
+ }
687
+ });
688
+ });
689
+ it('returns null if mode is evaluate', async () => {
690
+ const noResult = await (0, _index.createCorrectResponseSession)(question, {
691
+ mode: 'evaluate',
692
+ role: 'instructor'
693
+ });
694
+ expect(noResult).toBeNull();
695
+ });
696
+ it('returns null if role is student', async () => {
697
+ const noResult = await (0, _index.createCorrectResponseSession)(question, {
698
+ mode: 'gather',
699
+ role: 'student'
700
+ });
701
+ expect(noResult).toBeNull();
702
+ });
703
+ });
704
+ });
705
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImRlc2NyaWJlIiwicmVzdWx0IiwicXVlc3Rpb24iLCJzZXNzaW9uIiwiZW52IiwiYmVmb3JlRWFjaCIsImRpc3BsYXlUeXBlIiwibGFuZ3VhZ2UiLCJsb2NrQ2hvaWNlT3JkZXIiLCJjaG9pY2VzIiwiY29ycmVjdCIsInZhbHVlIiwibGFiZWwiLCJyYXRpb25hbGUiLCJlbGVtZW50IiwicHJvbXB0Iiwic2NvcmluZ1R5cGUiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwic3R1ZGVudEluc3RydWN0aW9ucyIsInBhcnRpYWxTY29yaW5nIiwibWFya3VwIiwiaWQiLCJhbHRlcm5hdGVSZXNwb25zZXMiLCJpdCIsIm1vZGUiLCJyIiwibW9kZWwiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInVwZGF0ZVNlc3Npb24iLCJqZXN0IiwiZm4iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInNodWZmbGVkVmFsdWVzIiwiYXJyYXlDb250YWluaW5nIiwicSIsIm0iLCJ0b0VxdWFsIiwiZmVlZGJhY2siLCJyZXNwb25zZUNvcnJlY3QiLCJyZXR1cm5Nb2RlbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUiLCJhc3NlcnRHYXRoZXIiLCJleHRyYSIsImV4cGVjdGVkIiwiYWx0ZXJuYXRlUmVzcG9uc2UiLCJkaXNhYmxlZCIsInByb21wdEVuYWJsZWQiLCJyYXRpb25hbGVFbmFibGVkIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZCIsImFzc2VydFZpZXciLCJyb2xlIiwiY2hvaWNlUmF0aW9uYWxlRW5hYmxlZCIsImFzc2VydFZpZXdTdHVkZW50IiwiYXNzZXJ0RXZhbHVhdGUiLCJhc3NlcnRTY29yZSIsInNjb3JlIiwiZ2V0U2NvcmUiLCJyZXR1cm5TY29yZSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwic2Vzc2lvblZhbHVlIiwib3V0Y29tZSIsImVtcHR5Iiwic2VzcyIsImNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24iLCJub1Jlc3VsdCIsInRvQmVOdWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9pbmRleC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNjb3JlLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uLCBtb2RlbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5cbmRlc2NyaWJlKCdpbmxpbmUtZHJvcGRvd24nLCAoKSA9PiB7XG4gIGxldCByZXN1bHQsIHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnY7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcXVlc3Rpb24gPSB7XG4gICAgICBkaXNwbGF5VHlwZTogJ2Jsb2NrJyxcbiAgICAgIGxhbmd1YWdlOiAnZW5nbGlzaCcsXG4gICAgICBsb2NrQ2hvaWNlT3JkZXI6IGZhbHNlLFxuICAgICAgY2hvaWNlczoge1xuICAgICAgICAwOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTUnLFxuICAgICAgICAgICAgbGFiZWw6ICcyMCwwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTYnLFxuICAgICAgICAgICAgbGFiZWw6ICcxNywwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTcnLFxuICAgICAgICAgICAgbGFiZWw6ICcxNiwxMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5OCcsXG4gICAgICAgICAgICBsYWJlbDogJzE2LDAwMCcsXG4gICAgICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIGNob2ljZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBlbGVtZW50OiAnaW5saW5lLWRyb3Bkb3duLWVsZW1lbnQnLFxuICAgICAgcmF0aW9uYWxlOiAnJyxcbiAgICAgIHByb21wdDpcbiAgICAgICAgJzxwPlxcbiAgPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+RWwgbsO6bWVybyAxNiwxMDE8L3NwYW4+PC9zdHJvbmc+IDxzdHJvbmc+PHNwYW4gc3R5bGU9XCJjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IEFyaWFsO1wiPnJlZG9uZGVhZG8gYWw8L3NwYW4+PC9zdHJvbmc+IDxzdHJvbmc+PHNwYW4gc3R5bGU9XCJjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IEFyaWFsO1wiPm1pbGxhciBtw6FzIGNlcmNhbm8gZXMmbmJzcDtfX19fX19fX19fX19fXy48L3NwYW4+PC9zdHJvbmc+XFxuPC9wPlxcbjxwPlxcbiAgPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiPiZuYnNwOzwvc3Bhbj48L3N0cm9uZz5cXG48L3A+JyxcbiAgICAgIHNjb3JpbmdUeXBlOiAnYXV0bycsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiB0cnVlLFxuICAgICAgc3R1ZGVudEluc3RydWN0aW9uczogZmFsc2UsXG4gICAgICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG4gICAgICBtYXJrdXA6ICd7ezB9fScsXG4gICAgICBpZDogJzI0MjEzMTAnLFxuICAgICAgYWx0ZXJuYXRlUmVzcG9uc2VzOiBudWxsLFxuICAgIH07XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdpcyBvayBpcyBzZXNzaW9uIGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICBjb25zdCByID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHt9LCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG4gICAgICBleHBlY3QocikudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyB1cGRhdGVTZXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHsgaWQ6ICcxJywgZWxlbWVudDogJ2lubGluZS1kcm9wZG93bi1lbGVtZW50JyB9O1xuICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgY29uc3QgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuICAgICAgYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudiwgdXBkYXRlU2Vzc2lvbik7XG4gICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICcxJyxcbiAgICAgICAgJ2lubGluZS1kcm9wZG93bi1lbGVtZW50JyxcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiB7IDA6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWyc5NzE5Mzk1JywgJzk3MTkzOTYnLCAnOTcxOTM5NycsICc5NzE5Mzk4J10pIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuY29uc3QgcXVlc3Rpb24gPSB7XG4gIGRpc3BsYXlUeXBlOiAnYmxvY2snLFxuICBsYW5ndWFnZTogJ2VuZ2xpc2gnLFxuICBwcm9tcHQ6ICdVc2UgdGhlIGRyb3AtZG93bnMgdG8gY29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbiAgbWFya3VwOiAnPGRpdj48cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD48L2Rpdj4nLFxuICBjaG9pY2VzOiB7XG4gICAgMDogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvdyAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgY293JyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZG9nICcsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZG9nJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgY2F0JyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAxOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnb3ZlciAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgb3ZlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3VuZGVyICcsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgdW5kZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdhY3Jvc3MgJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBhY3Jvc3MnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIDI6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBtb29uJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBzdW4nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdob3VzZSAnLFxuICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGhvdXNlJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgbGV0IHE7XG4gICAgY29uc3QgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuXG4gICAgaXQoJ291dHB1dCB3aGVuIHNlc3Npb24gaXMgZGVmaW5lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzAnIH0gfSwgeyBtb2RlOiAnZXZhbHVhdGUnIH0sIHVwZGF0ZVNlc3Npb24pO1xuXG4gICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBvdXRwdXQgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIHsgbW9kZTogJ2V2YWx1YXRlJyB9LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBmZWVkYmFjazogeyAwOiAnaW5jb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuXG4gICAgY29uc3QgY2hvaWNlc1dpdGhOdWxsUmF0aW9uYWxlID0ge1xuICAgICAgMDogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdkb2cgJyxcbiAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdvdmVyICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAndW5kZXIgJyxcbiAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2VydEdhdGhlciA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IGdhdGhlciwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG1vZGU6ICdnYXRoZXInIH0sXG4gICAgICAgICAgdXBkYXRlU2Vzc2lvbixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNob2ljZXM6IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIG5vdCBzZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0VmlldyA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAndmlldycsIHJvbGU6ICdpbnN0cnVjdG9yJyB9LFxuICAgICAgICAgIHVwZGF0ZVNlc3Npb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkLCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBhbmQgY2hvaWNlUmF0aW9uYWxlRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBjaG9pY2VSYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBudWxsLFxuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICAgIGNob2ljZXM6IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCwgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgYW5kIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXdTdHVkZW50ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7IGlkOiAnMScsIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsIC4uLnNlc3Npb24gfSxcbiAgICAgICAgICB7IG1vZGU6ICd2aWV3Jywgcm9sZTogJ3N0dWRlbnQnIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXdTdHVkZW50KFxuICAgICAgJyArIHJvbGU6IHN0dWRlbnQsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0Vmlld1N0dWRlbnQoXG4gICAgICAnICsgcm9sZTogc3R1ZGVudCwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDA6IFsnMiddLCAxOiBbJzInXSwgMjogWycyJ10gfSxcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSxcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICBtb2RlOiAnZXZhbHVhdGUnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRFdmFsdWF0ZShcbiAgICAgICctIGNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgICAxOiAnMCcsXG4gICAgICAgICAgMjogJzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRFdmFsdWF0ZShcbiAgICAgICctIHBhcnRpYWxseSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgMTogJzAnLFxuICAgICAgICAgIDI6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXIgdXNpbmcgYWx0ZXJuYXRlcycsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMicsXG4gICAgICAgICAgMTogJzEnLFxuICAgICAgICAgIDI6ICcyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBpbmNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICcxJyxcbiAgICAgICAgICAxOiAnMScsXG4gICAgICAgICAgMjogJzEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0IHNjb3JlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydFNjb3JlID0gKHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdCgncmV0dXJuIHNjb3JlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzY29yZSA9IGdldFNjb3JlKHF1ZXN0aW9uLCBzZXNzaW9uKTtcblxuICAgICAgICBleHBlY3Qoc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0sIDEpO1xuXG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgMC42Nyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcxJywgMjogJzEnIH0gfSwgMC4zMyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMScsIDE6ICcxJywgMjogJzEnIH0gfSwgMCk7XG5cbiAgICBjb25zdCByZXR1cm5TY29yZSA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgc2NvcmUgPSAwIHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KGdldFNjb3JlKHF1ZXN0aW9uLCBzZXNzaW9uKSkudG9FcXVhbCgwKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5TY29yZSh1bmRlZmluZWQpO1xuICAgIHJldHVyblNjb3JlKG51bGwpO1xuICAgIHJldHVyblNjb3JlKHt9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUgcGFydGlhbFNjb3JpbmcgdGVzdCcsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCBzZXNzaW9uVmFsdWUsIGVudiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvblZhbHVlLFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKGV4cGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwLjY3IH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBlbnYucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBlbnYucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKHBhcnRpYWxTY29yaW5nLCBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgcGFydGlhbCBzY29yZSAke3BhcnRpYWxTY29yaW5nID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBwYXJ0aWFsU2NvcmluZyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKGV4cGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgZW1wdHk6IHRydWUgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBzY29yZTogMCwgZW1wdHk6IHRydWUgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiByb2xlIGlzIGluc3RydWN0b3IgYW5kIG1vZGUgaXMgdmlldycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHJvbGUgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBQyxzQkFBQSxD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LENBQUMsa0JBQWtCLEVBQUUsTUFBTTtJQUNqQ3VCLEVBQUUsQ0FBQyxtRUFBbUUsRUFBRSxZQUFZO01BQ2xGLE1BQU0rQyxJQUFJLEdBQUcsTUFBTSxJQUFBQyxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUN4RHNCLElBQUksRUFBRSxRQUFRO1FBQ2RpQyxJQUFJLEVBQUU7TUFDUixDQUFDLENBQUM7TUFFRjlCLE1BQU0sQ0FBQzJDLElBQUksQ0FBQyxDQUFDL0IsT0FBTyxDQUFDO1FBQUVsQixFQUFFLEVBQUUsR0FBRztRQUFFVixLQUFLLEVBQUU7VUFBRSxDQUFDLEVBQUUsR0FBRztVQUFFLENBQUMsRUFBRSxHQUFHO1VBQUUsQ0FBQyxFQUFFO1FBQUk7TUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUZZLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxZQUFZO01BQ2hGLE1BQU0rQyxJQUFJLEdBQUcsTUFBTSxJQUFBQyxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUN4RHNCLElBQUksRUFBRSxNQUFNO1FBQ1ppQyxJQUFJLEVBQUU7TUFDUixDQUFDLENBQUM7TUFFRjlCLE1BQU0sQ0FBQzJDLElBQUksQ0FBQyxDQUFDL0IsT0FBTyxDQUFDO1FBQUVsQixFQUFFLEVBQUUsR0FBRztRQUFFVixLQUFLLEVBQUU7VUFBRSxDQUFDLEVBQUUsR0FBRztVQUFFLENBQUMsRUFBRSxHQUFHO1VBQUUsQ0FBQyxFQUFFO1FBQUk7TUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUZZLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFZO01BQ2pELE1BQU1pRCxRQUFRLEdBQUcsTUFBTSxJQUFBRCxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUM1RHNCLElBQUksRUFBRSxVQUFVO1FBQ2hCaUMsSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BRUY5QixNQUFNLENBQUM2QyxRQUFRLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBRUZsRCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsWUFBWTtNQUNoRCxNQUFNaUQsUUFBUSxHQUFHLE1BQU0sSUFBQUQsbUNBQTRCLEVBQUNyRSxRQUFRLEVBQUU7UUFDNURzQixJQUFJLEVBQUUsUUFBUTtRQUNkaUMsSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BRUY5QixNQUFNLENBQUM2QyxRQUFRLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119