@rudderstack/integrations-lib 0.2.17 → 0.2.19

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,1290 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const errors_1 = require("../errors");
4
- const json_1 = require("./json");
5
- describe('JSON utils', () => {
6
- describe('construct payload happy paths', () => {
7
- it('should construct payload with valid mapping JSON and message object containing all required source keys', () => {
8
- const message = {
9
- event: 'purchase',
10
- properties: {
11
- orderId: '12345',
12
- totalAmount: 100,
13
- products: [
14
- { id: 'p1', name: 'Product 1', price: 50 },
15
- { id: 'p2', name: 'Product 2', price: 50 },
16
- ],
17
- },
18
- };
19
- const mappingJson = [
20
- {
21
- sourceKeys: ['event'],
22
- destKey: 'event',
23
- required: true,
24
- metadata: {},
25
- },
26
- {
27
- sourceKeys: ['properties.orderId'],
28
- destKey: 'orderId',
29
- required: true,
30
- metadata: {},
31
- },
32
- {
33
- sourceKeys: ['properties.totalAmount'],
34
- destKey: 'totalAmount',
35
- required: true,
36
- metadata: {},
37
- },
38
- {
39
- sourceKeys: ['properties.products'],
40
- destKey: 'products',
41
- required: true,
42
- metadata: {},
43
- },
44
- ];
45
- const expectedPayload = {
46
- event: 'purchase',
47
- orderId: '12345',
48
- totalAmount: 100,
49
- products: [
50
- { id: 'p1', name: 'Product 1', price: 50 },
51
- { id: 'p2', name: 'Product 2', price: 50 },
52
- ],
53
- };
54
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
55
- expect(payload).toEqual(expectedPayload);
56
- });
57
- it('should construct payload with valid mapping JSON and message object containing some optional source keys', () => {
58
- const message = {
59
- event: 'purchase',
60
- properties: {
61
- orderId: '12345',
62
- totalAmount: 100,
63
- },
64
- };
65
- const mappingJson = [
66
- {
67
- sourceKeys: ['event'],
68
- destKey: 'event',
69
- required: true,
70
- metadata: {},
71
- },
72
- {
73
- sourceKeys: ['properties.orderId'],
74
- destKey: 'orderId',
75
- required: true,
76
- metadata: {},
77
- },
78
- {
79
- sourceKeys: ['properties.totalAmount'],
80
- destKey: 'totalAmount',
81
- required: true,
82
- metadata: {},
83
- },
84
- {
85
- sourceKeys: ['properties.products'],
86
- destKey: 'products',
87
- required: false,
88
- metadata: {},
89
- },
90
- ];
91
- const expectedPayload = {
92
- event: 'purchase',
93
- orderId: '12345',
94
- totalAmount: 100,
95
- };
96
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
97
- expect(payload).toEqual(expectedPayload);
98
- });
99
- it('should construct payload with valid mapping JSON and message object containing nested source keys', () => {
100
- const message = {
101
- event: 'purchase',
102
- properties: {
103
- order: {
104
- id: '12345',
105
- totalAmount: 100,
106
- },
107
- },
108
- };
109
- const mappingJson = [
110
- {
111
- sourceKeys: ['event'],
112
- destKey: 'event',
113
- required: true,
114
- metadata: {},
115
- },
116
- {
117
- sourceKeys: ['properties.order.id'],
118
- destKey: 'orderId',
119
- required: true,
120
- metadata: {},
121
- },
122
- {
123
- sourceKeys: ['properties.order.totalAmount'],
124
- destKey: 'totalAmount',
125
- required: true,
126
- metadata: {},
127
- },
128
- ];
129
- const expectedPayload = {
130
- event: 'purchase',
131
- orderId: '12345',
132
- totalAmount: 100,
133
- };
134
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
135
- expect(payload).toEqual(expectedPayload);
136
- });
137
- it('should construct payload with valid mapping JSON and message object containing source keys with different data types', () => {
138
- const message = {
139
- event: 'purchase',
140
- properties: {
141
- orderId: 12345,
142
- totalAmount: '100',
143
- },
144
- };
145
- const mappingJson = [
146
- {
147
- sourceKeys: ['event'],
148
- destKey: 'event',
149
- required: true,
150
- metadata: {},
151
- },
152
- {
153
- sourceKeys: ['properties.orderId'],
154
- destKey: 'orderId',
155
- required: true,
156
- metadata: {},
157
- },
158
- {
159
- sourceKeys: ['properties.totalAmount'],
160
- destKey: 'totalAmount',
161
- required: true,
162
- metadata: {},
163
- },
164
- ];
165
- const expectedPayload = {
166
- event: 'purchase',
167
- orderId: 12345,
168
- totalAmount: '100',
169
- };
170
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
171
- expect(payload).toEqual(expectedPayload);
172
- });
173
- it('should construct payload with valid mapping JSON and message object containing source keys with arrays of values', () => {
174
- const message = {
175
- event: 'purchase',
176
- properties: {
177
- products: [
178
- { id: 'p1', name: 'Product 1', price: 50 },
179
- { id: 'p2', name: 'Product 2', price: 50 },
180
- ],
181
- },
182
- };
183
- const mappingJson = [
184
- {
185
- sourceKeys: ['event'],
186
- destKey: 'event',
187
- required: true,
188
- metadata: {},
189
- },
190
- {
191
- sourceKeys: ['properties.products'],
192
- destKey: 'products',
193
- required: true,
194
- metadata: {},
195
- },
196
- ];
197
- const expectedPayload = {
198
- event: 'purchase',
199
- products: [
200
- { id: 'p1', name: 'Product 1', price: 50 },
201
- { id: 'p2', name: 'Product 2', price: 50 },
202
- ],
203
- };
204
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
205
- expect(payload).toEqual(expectedPayload);
206
- });
207
- it('should construct payload with valid mapping JSON and message object containing source keys with for operations', () => {
208
- const message = {
209
- event: 'purchase',
210
- properties: {
211
- orderId: '12345',
212
- price: 100,
213
- quantity: 2,
214
- addon1: 10,
215
- addon2: 20,
216
- },
217
- };
218
- const mappingJson = [
219
- {
220
- sourceKeys: ['event'],
221
- destKey: 'event',
222
- required: true,
223
- metadata: {},
224
- },
225
- {
226
- sourceKeys: ['properties.orderId'],
227
- destKey: 'orderId',
228
- required: true,
229
- },
230
- {
231
- sourceKeys: [
232
- {
233
- operation: 'multiplication',
234
- args: [
235
- {
236
- sourceKeys: 'properties.price',
237
- },
238
- {
239
- sourceKeys: 'properties.quantity',
240
- default: 1,
241
- },
242
- ],
243
- },
244
- ],
245
- destKey: 'totalAmount',
246
- required: true,
247
- },
248
- {
249
- sourceKeys: [
250
- {
251
- operation: 'addition',
252
- args: [
253
- {
254
- sourceKeys: 'properties.addon1',
255
- },
256
- {
257
- sourceKeys: 'properties.addon2',
258
- default: 1,
259
- },
260
- ],
261
- },
262
- ],
263
- destKey: 'totalAddon',
264
- required: true,
265
- },
266
- ];
267
- const expectedPayload = {
268
- event: 'purchase',
269
- orderId: '12345',
270
- totalAmount: 200,
271
- totalAddon: 30,
272
- };
273
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
274
- expect(payload).toEqual(expectedPayload);
275
- });
276
- it('should construct payload with valid mapping JSON and message object containing source keys with metadata configs', () => {
277
- const message = {
278
- event: 'purchase',
279
- properties: {
280
- orderId: 12345,
281
- totalAmount: '100',
282
- item: 'Mobile',
283
- products: [
284
- { id: 'p1', name: 'Product 1', price: 50 },
285
- { id: 'p2', name: 'Product 2', price: 50 },
286
- ],
287
- inventory: {
288
- item1: 'item1',
289
- item2: 'item2',
290
- },
291
- },
292
- timeStamp: '2021-09-01T00:00:00.000Z',
293
- };
294
- const mappingJson = [
295
- {
296
- sourceKeys: ['event'],
297
- destKey: 'event',
298
- required: true,
299
- metadata: {
300
- type: 'toString',
301
- },
302
- },
303
- {
304
- sourceKeys: ['properties.orderId'],
305
- destKey: 'orderId',
306
- required: true,
307
- metadata: {
308
- type: 'toString',
309
- },
310
- },
311
- {
312
- sourceKeys: ['properties.totalAmount'],
313
- destKey: 'totalAmount',
314
- required: true,
315
- metadata: {
316
- type: 'toNumber',
317
- },
318
- },
319
- {
320
- sourceKeys: ['properties.products'],
321
- destKey: 'products',
322
- required: true,
323
- },
324
- {
325
- sourceKeys: 'timeStamp',
326
- required: true,
327
- metadata: {
328
- type: 'timestamp',
329
- typeFormat: 'yyyy-MM-DDTHH:mm:ssZZ',
330
- },
331
- destKey: 'timestamp',
332
- },
333
- {
334
- sourceKeys: ['random'],
335
- destKey: 'random',
336
- metadata: {
337
- defaultValue: 'random',
338
- },
339
- },
340
- {
341
- sourceKeys: ['properties.inventory'],
342
- destKey: 'inventory',
343
- metadata: {
344
- excludes: ['item2'],
345
- },
346
- },
347
- // warning log
348
- {
349
- sourceKeys: ['properties.orderId'],
350
- destKey: 'inventory2',
351
- metadata: {
352
- excludes: ['item2'],
353
- },
354
- },
355
- {
356
- sourceKeys: ['properties.item'],
357
- destKey: 'itemName',
358
- metadata: {
359
- multikeyMap: [
360
- {
361
- sourceVal: ['Mobile', 'Telephone'],
362
- destVal: 'mob',
363
- },
364
- ],
365
- },
366
- },
367
- ];
368
- const expectedPayload = {
369
- event: 'purchase',
370
- orderId: '12345',
371
- totalAmount: 100,
372
- products: [
373
- { id: 'p1', name: 'Product 1', price: 50 },
374
- { id: 'p2', name: 'Product 2', price: 50 },
375
- ],
376
- inventory: {
377
- item1: 'item1',
378
- },
379
- inventory2: 12345,
380
- itemName: 'mob',
381
- random: 'random',
382
- timestamp: '2021-09-01T00:00:00+0000',
383
- };
384
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
385
- expect(payload).toEqual(expectedPayload);
386
- });
387
- it('should return proper value when allowedKeyCheck contains the value', () => {
388
- const message = {
389
- event: 'purchase',
390
- properties: {
391
- item: 'Mobile',
392
- },
393
- timeStamp: '2021-09-01T00:00:00.000Z',
394
- };
395
- const mappingJson = [
396
- {
397
- sourceKeys: ['properties.item'],
398
- destKey: 'itemName',
399
- metadata: {
400
- allowedKeyCheck: [
401
- {
402
- sourceVal: ['Mobile', 'Telephone'],
403
- },
404
- ],
405
- },
406
- },
407
- ];
408
- const expectedPayload = {
409
- itemName: 'Mobile',
410
- };
411
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
412
- expect(payload).toEqual(expectedPayload);
413
- });
414
- it('should return undefined when allowedKeyCheck does not contains the value', () => {
415
- const message = {
416
- event: 'purchase',
417
- properties: {
418
- item: 'Mobile',
419
- },
420
- timeStamp: '2021-09-01T00:00:00.000Z',
421
- };
422
- const mappingJson = [
423
- {
424
- sourceKeys: ['properties.item'],
425
- destKey: 'itemName',
426
- metadata: {
427
- allowedKeyCheck: [
428
- {
429
- sourceVal: ['Dum', 'Telephone'],
430
- },
431
- ],
432
- },
433
- },
434
- ];
435
- const expectedPayload = {
436
- itemName: undefined,
437
- };
438
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
439
- expect(payload).toEqual(expectedPayload);
440
- });
441
- it('should return lowercased value when allowedKeyCheck does not contains the value', () => {
442
- const message = {
443
- event: 'purchase',
444
- properties: {
445
- item: 'Mobile',
446
- },
447
- timeStamp: '2021-09-01T00:00:00.000Z',
448
- };
449
- const mappingJson = [
450
- {
451
- sourceKeys: ['properties.item'],
452
- destKey: 'itemName',
453
- metadata: {
454
- allowedKeyCheck: [
455
- {
456
- sourceVal: ['mobile', 'telephone'],
457
- type: 'toLowerCase',
458
- },
459
- ],
460
- },
461
- },
462
- ];
463
- const expectedPayload = {
464
- itemName: 'mobile',
465
- };
466
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
467
- expect(payload).toEqual(expectedPayload);
468
- });
469
- it('should return uppercased value when allowedKeyCheck does not contains the value', () => {
470
- const message = {
471
- event: 'purchase',
472
- properties: {
473
- item: 'Mobile',
474
- },
475
- timeStamp: '2021-09-01T00:00:00.000Z',
476
- };
477
- const mappingJson = [
478
- {
479
- sourceKeys: ['properties.item'],
480
- destKey: 'itemName',
481
- metadata: {
482
- allowedKeyCheck: [
483
- {
484
- sourceVal: ['MOBILE', 'TEL'],
485
- type: 'toUpperCase',
486
- },
487
- ],
488
- },
489
- },
490
- ];
491
- const expectedPayload = {
492
- itemName: 'MOBILE',
493
- };
494
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
495
- expect(payload).toEqual(expectedPayload);
496
- });
497
- it('should return correctly validated timestamp values', () => {
498
- // @ts-expect-error: this is a mock
499
- Date.now = jest.fn(() => new Date('2021-09-01T02:00:01.000Z'));
500
- const message = {
501
- timeStamp1: 1630461600000,
502
- timeStamp2: 1630461542000,
503
- timeStamp3: 1630465140000,
504
- timeStamp4: 1630465140000, // '2021-09-01T02:59:00.000Z',
505
- };
506
- const mappingJson = [
507
- {
508
- sourceKeys: ['timeStamp1'],
509
- destKey: 'time1',
510
- metadata: {
511
- validateTimestamp: {
512
- allowedFutureTimeDifference: 1,
513
- allowedFutureTimeUnit: 'seconds',
514
- },
515
- },
516
- },
517
- {
518
- sourceKeys: ['timeStamp2'],
519
- destKey: 'time2',
520
- metadata: {
521
- validateTimestamp: {
522
- allowedPastTimeDifference: 1,
523
- allowedPastTimeUnit: 'minutes',
524
- },
525
- },
526
- },
527
- {
528
- sourceKeys: ['timeStamp3'],
529
- destKey: 'time3',
530
- metadata: {
531
- validateTimestamp: {
532
- allowedFutureTimeDifference: 1,
533
- allowedFutureTimeUnit: 'hours',
534
- },
535
- },
536
- },
537
- {
538
- sourceKeys: ['timeStamp2'],
539
- destKey: 'time4',
540
- metadata: {
541
- validateTimestamp: {
542
- allowedPastTimeDifference: 75,
543
- allowedPastTimeUnit: 'seconds',
544
- },
545
- },
546
- },
547
- {
548
- sourceKeys: ['timeStamp2'],
549
- destKey: 'time5',
550
- metadata: {
551
- validateTimestamp: {
552
- allowedPastTimeDifference: 1,
553
- allowedPastTimeUnit: 'hours',
554
- },
555
- },
556
- },
557
- {
558
- sourceKeys: ['timeStamp4'],
559
- destKey: 'time6',
560
- metadata: {
561
- validateTimestamp: {
562
- allowedFutureTimeDifference: 1,
563
- allowedFutureTimeUnit: 'days',
564
- },
565
- },
566
- },
567
- {
568
- sourceKeys: ['timeStamp2'],
569
- destKey: 'time7',
570
- metadata: {
571
- validateTimestamp: {
572
- allowedPastTimeDifference: 1,
573
- allowedPastTimeUnit: 'days',
574
- },
575
- },
576
- },
577
- ];
578
- const expectedPayload = {
579
- time1: 1630461600000,
580
- time2: 1630461542000,
581
- time4: 1630461542000,
582
- time5: 1630461542000,
583
- time3: 1630465140000,
584
- time6: 1630465140000,
585
- time7: 1630461542000, // '2021-09-01T02:59:00.000Z',
586
- };
587
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
588
- expect(payload).toEqual(expectedPayload);
589
- });
590
- it('should throw when the timestamp is more than allowed into the past', () => {
591
- // @ts-expect-error: this is a mock
592
- Date.now = jest.fn(() => new Date('2021-09-01T02:00:01.000Z'));
593
- const message = {
594
- timeStamp2: 1630461545000, // '2021-09-01T01:59:05.000Z',
595
- };
596
- const mappingJson = [
597
- {
598
- sourceKeys: ['timeStamp2'],
599
- destKey: 'time1',
600
- metadata: {
601
- validateTimestamp: {
602
- allowedPastTimeDifference: 1,
603
- allowedPastTimeUnit: 'seconds',
604
- },
605
- },
606
- },
607
- ];
608
- expect(() => {
609
- json_1.JsonUtils.constructPayload(message, mappingJson);
610
- }).toThrow('Allowed timestamp is [1 seconds] into the past');
611
- });
612
- it('should throw when the timestamp is more than allowed into the future', () => {
613
- // @ts-expect-error: this is a mock
614
- Date.now = jest.fn(() => new Date('2021-09-01T01:50:01.000Z'));
615
- const message = {
616
- timeStamp2: 1630461545000, // '2021-09-01T01:59:05.000Z',
617
- };
618
- const mappingJson = [
619
- {
620
- sourceKeys: ['timeStamp2'],
621
- destKey: 'time1',
622
- metadata: {
623
- validateTimestamp: {
624
- allowedFutureTimeDifference: 2,
625
- allowedFutureTimeUnit: 'minutes',
626
- },
627
- },
628
- },
629
- ];
630
- expect(() => {
631
- json_1.JsonUtils.constructPayload(message, mappingJson);
632
- }).toThrow('Allowed timestamp is [2 minutes] into the future');
633
- });
634
- it('should throw when the timestamp is string and not a number', () => {
635
- // @ts-expect-error: this is a mock
636
- Date.now = jest.fn(() => new Date('2021-09-01T01:50:01.000Z'));
637
- const message = {
638
- timeStamp2: '2021-09-01T01:50:01.000Z', // '2021-09-01T01:59:05.000Z',
639
- };
640
- const mappingJson = [
641
- {
642
- sourceKeys: ['timeStamp2'],
643
- destKey: 'time1',
644
- metadata: {
645
- validateTimestamp: {
646
- allowedFutureTimeDifference: 2,
647
- allowedFutureTimeUnit: 'minutes',
648
- },
649
- },
650
- },
651
- ];
652
- expect(() => {
653
- json_1.JsonUtils.constructPayload(message, mappingJson);
654
- }).toThrow('Timestamp is not a number, cannot validate');
655
- });
656
- it('should perform trim, secondTimestamp & micro, dobInMMDD, toInt, toLower, toFloat, IsBoolean, domainUrlV2, domainUrl, getOffsetInSec, jsonStringifyOnObject', () => {
657
- const message = {
658
- trimm: ' Spaced string ',
659
- bool: true,
660
- url: 'https://www.ggoole.com',
661
- tz: 'America/New_York',
662
- etz: 'Am0',
663
- obj: { a: 1, b: 'ball' },
664
- fl: '12.8818',
665
- dob: '2012-01-01',
666
- time: '2021-09-01T01:59:05.000Z',
667
- };
668
- const mappingJson = [
669
- {
670
- sourceKeys: ['trimm'],
671
- destKey: 'trimmed',
672
- metadata: {
673
- type: ['trim', 'toLower'],
674
- },
675
- },
676
- {
677
- sourceKeys: ['trimm'],
678
- destKey: 'isbool',
679
- metadata: {
680
- type: ['IsBoolean'],
681
- },
682
- },
683
- {
684
- sourceKeys: ['bool'],
685
- destKey: 'isbool2',
686
- metadata: {
687
- type: ['IsBoolean'],
688
- },
689
- },
690
- {
691
- sourceKeys: ['url'],
692
- destKey: 'UrlV2',
693
- metadata: {
694
- type: ['domainUrlV2'],
695
- },
696
- },
697
- {
698
- sourceKeys: ['url'],
699
- destKey: 'Url',
700
- metadata: {
701
- type: ['domainUrl'],
702
- },
703
- },
704
- {
705
- sourceKeys: ['tz'],
706
- destKey: 'offset',
707
- metadata: {
708
- type: ['getOffsetInSec'],
709
- },
710
- },
711
- {
712
- sourceKeys: ['obj'],
713
- destKey: 'object',
714
- metadata: {
715
- type: ['jsonStringifyOnObject'],
716
- },
717
- },
718
- {
719
- sourceKeys: ['etz'],
720
- destKey: 'eoffset',
721
- metadata: {
722
- type: ['getOffsetInSec'],
723
- },
724
- },
725
- {
726
- sourceKeys: ['fl'],
727
- destKey: 'flV',
728
- metadata: {
729
- type: ['toFloat'],
730
- },
731
- },
732
- {
733
- sourceKeys: ['fl'],
734
- destKey: 'intV',
735
- metadata: {
736
- type: ['toInt'],
737
- },
738
- },
739
- {
740
- sourceKeys: ['dob'],
741
- destKey: 'mmdd',
742
- metadata: {
743
- type: ['dobInMMDD'],
744
- },
745
- },
746
- {
747
- sourceKeys: ['time'],
748
- destKey: 'ts',
749
- metadata: {
750
- type: ['secondTimestamp'],
751
- },
752
- },
753
- {
754
- sourceKeys: ['time'],
755
- destKey: 'mts',
756
- metadata: {
757
- type: ['microSecondTimestamp'],
758
- },
759
- },
760
- ];
761
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
762
- trimmed: 'spaced string',
763
- isbool: false,
764
- isbool2: true,
765
- Url: 'www.ggoole.com',
766
- UrlV2: 'ggoole.com',
767
- offset: -14400,
768
- eoffset: undefined,
769
- object: '{"a":1,"b":"ball"}',
770
- flV: 12.8818,
771
- intV: 12,
772
- mmdd: '01/01',
773
- ts: 1630461545,
774
- mts: 1630461545000000,
775
- });
776
- });
777
- it('should perform flatJson, jsonStringify, jsonStringifyOnFlatten, encodeURIComponent successfully', () => {
778
- const message = {
779
- obj: { a: 1, b: { w1: 'ball', w2: 'bat' } },
780
- param: '?x=test?',
781
- };
782
- const mappingJson = [
783
- {
784
- sourceKeys: ['obj'],
785
- destKey: 'object',
786
- metadata: {
787
- type: ['flatJson'],
788
- },
789
- },
790
- {
791
- sourceKeys: ['obj'],
792
- destKey: 'sobj',
793
- metadata: {
794
- type: ['jsonStringify'],
795
- },
796
- },
797
- {
798
- sourceKeys: ['obj'],
799
- destKey: 'sobjf',
800
- metadata: {
801
- type: ['jsonStringifyOnFlatten'],
802
- },
803
- },
804
- {
805
- sourceKeys: ['param'],
806
- destKey: 'q',
807
- metadata: {
808
- type: ['encodeURIComponent'],
809
- },
810
- },
811
- ];
812
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
813
- object: { a: 1, 'b.w1': 'ball', 'b.w2': 'bat' },
814
- sobjf: '{"a":1,"b.w1":"ball","b.w2":"bat"}',
815
- q: '%3Fx%3Dtest%3F',
816
- sobj: '{"a":1,"b":{"w1":"ball","w2":"bat"}}',
817
- });
818
- });
819
- it('should perform numberForRevenue successfully', () => {
820
- const message = {
821
- rev: '$124',
822
- };
823
- const mappingJson = [
824
- {
825
- sourceKeys: ['rev'],
826
- destKey: 'revenue',
827
- metadata: {
828
- type: ['numberForRevenue'],
829
- },
830
- },
831
- ];
832
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
833
- revenue: 124.0,
834
- });
835
- });
836
- it('should throw when revenue is not sent as a number', () => {
837
- const message = {
838
- rev: '$12a',
839
- };
840
- const mappingJson = [
841
- {
842
- sourceKeys: ['rev'],
843
- destKey: 'revenue',
844
- metadata: {
845
- type: ['numberForRevenue'],
846
- },
847
- },
848
- ];
849
- expect(() => {
850
- json_1.JsonUtils.constructPayload(message, mappingJson);
851
- }).toThrow('Revenue is not in the correct format');
852
- });
853
- it('should throw error when url is not correct while using domainUrlV2 formatting type', () => {
854
- // @ts-expect-error: this is a mock
855
- Date.now = jest.fn(() => new Date('2021-09-01T01:50:01.000Z'));
856
- const message = {
857
- url: 'gomim',
858
- };
859
- const mappingJson = [
860
- {
861
- sourceKeys: ['url'],
862
- destKey: 'UrlV2',
863
- metadata: {
864
- type: ['domainUrlV2'],
865
- },
866
- },
867
- ];
868
- expect(() => {
869
- json_1.JsonUtils.constructPayload(message, mappingJson);
870
- }).toThrow('Invalid URL: gomim');
871
- });
872
- });
873
- describe('construct payload edge cases', () => {
874
- it('should map destKey with undefined when multiKeyMap is an object', () => {
875
- const message = {
876
- event: 'purchase',
877
- properties: {
878
- item: 'Mobile',
879
- },
880
- timeStamp: '2021-09-01T00:00:00.000Z',
881
- };
882
- const mappingJson = [
883
- {
884
- sourceKeys: ['properties.item'],
885
- destKey: 'itemName',
886
- metadata: { multikeyMap: {} },
887
- },
888
- ];
889
- const expectedPayload = {
890
- itemName: undefined,
891
- };
892
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
893
- expect(payload).toEqual(expectedPayload);
894
- });
895
- it('should throw error when multiKeyMap but strictMultiMap is present', () => {
896
- const message = {
897
- event: 'purchase',
898
- properties: {
899
- item: 'Mobile',
900
- },
901
- timeStamp: '2021-09-01T00:00:00.000Z',
902
- };
903
- const mappingJson = [
904
- {
905
- sourceKeys: ['properties.item'],
906
- destKey: 'itemName',
907
- metadata: {
908
- strictMultiMap: {},
909
- },
910
- },
911
- ];
912
- expect(() => {
913
- json_1.JsonUtils.constructPayload(message, mappingJson);
914
- }).toThrow('Invalid entry for key itemName');
915
- });
916
- it('should throw error when multiKeyMap.sourceVal does not contain the sourceKey value', () => {
917
- const message = {
918
- event: 'purchase',
919
- properties: {
920
- item: 'Mobile',
921
- },
922
- timeStamp: '2021-09-01T00:00:00.000Z',
923
- };
924
- const mappingJson = [
925
- {
926
- sourceKeys: ['properties.item'],
927
- destKey: 'itemName',
928
- metadata: {
929
- multikeyMap: [
930
- {
931
- sourceVal: ['f', 'F', 'Female', 'female'],
932
- destVal: 'F',
933
- },
934
- ],
935
- },
936
- },
937
- ];
938
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
939
- itemName: undefined,
940
- });
941
- });
942
- it('should throw error when multiKeyMap.sourceVal is not array', () => {
943
- const message = {
944
- event: 'purchase',
945
- properties: {
946
- item: 'Mobile',
947
- },
948
- timeStamp: '2021-09-01T00:00:00.000Z',
949
- };
950
- const mappingJson = [
951
- {
952
- sourceKeys: ['properties.item'],
953
- destKey: 'itemName',
954
- metadata: {
955
- multikeyMap: [
956
- {
957
- sourceVal: {},
958
- destVal: 'F',
959
- },
960
- ],
961
- },
962
- },
963
- ];
964
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
965
- itemName: 'Mobile',
966
- });
967
- });
968
- it('should return null when given an empty mappingJson', () => {
969
- const message = {
970
- event: 'purchase',
971
- properties: {
972
- revenue: 100,
973
- currency: 'USD',
974
- },
975
- };
976
- const mappingJson = [];
977
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
978
- expect(payload).toBeNull();
979
- });
980
- it('should return null when given an invalid sourceKey', () => {
981
- const message = {
982
- event: 'purchase',
983
- properties: {
984
- revenue: 100,
985
- currency: 'USD',
986
- },
987
- };
988
- const sourceKey = 'invalidKey';
989
- const value = json_1.JsonUtils.getFieldValueFromMessage(message, sourceKey);
990
- expect(value).toBeNull();
991
- });
992
- it('should handle when metadata is invalid', () => {
993
- const message = {
994
- event: 'purchase',
995
- properties: {
996
- revenue: 100,
997
- currency: 'USD',
998
- products: [
999
- {
1000
- name: 'Product 1',
1001
- price: 50,
1002
- quantity: 2,
1003
- },
1004
- {
1005
- name: 'Product 2',
1006
- price: 30,
1007
- quantity: 1,
1008
- },
1009
- ],
1010
- },
1011
- };
1012
- const mappingJson = [
1013
- {
1014
- sourceKeys: 'properties.revenue',
1015
- destKey: 'revenue',
1016
- required: true,
1017
- metadata: {
1018
- type: 'invalidType',
1019
- },
1020
- },
1021
- ];
1022
- const value = json_1.JsonUtils.constructPayload(message, mappingJson);
1023
- expect(value).toEqual({
1024
- revenue: 100,
1025
- });
1026
- });
1027
- it('should throw an InstrumentationError when a required value is missing', () => {
1028
- const message = {
1029
- event: 'purchase',
1030
- properties: {
1031
- revenue: 100,
1032
- currency: 'USD',
1033
- products: [
1034
- {
1035
- name: 'Product 1',
1036
- price: 50,
1037
- quantity: 2,
1038
- },
1039
- {
1040
- name: 'Product 2',
1041
- price: 30,
1042
- quantity: 1,
1043
- },
1044
- ],
1045
- },
1046
- };
1047
- const mappingJson = [
1048
- {
1049
- sourceKeys: 'event',
1050
- destKey: 'event',
1051
- required: true,
1052
- metadata: {},
1053
- },
1054
- {
1055
- sourceKeys: 'properties.revenue',
1056
- destKey: 'revenue',
1057
- required: true,
1058
- metadata: {},
1059
- },
1060
- {
1061
- sourceKeys: 'properties.currency',
1062
- destKey: 'currency',
1063
- required: true,
1064
- metadata: {},
1065
- },
1066
- {
1067
- sourceKeys: 'properties.products',
1068
- destKey: 'products',
1069
- required: true,
1070
- metadata: {},
1071
- },
1072
- {
1073
- sourceKeys: 'properties.invalidKey',
1074
- destKey: 'invalidKey',
1075
- required: true,
1076
- metadata: {},
1077
- },
1078
- ];
1079
- expect(() => {
1080
- json_1.JsonUtils.constructPayload(message, mappingJson);
1081
- }).toThrow(errors_1.InstrumentationError);
1082
- });
1083
- it('should construct the payload correctly with a valid mappingJson and message object when destination key is an empty string', () => {
1084
- const message = {
1085
- event: 'purchase',
1086
- properties: {
1087
- revenue: 100,
1088
- currency: 'USD',
1089
- products: [
1090
- {
1091
- name: 'Product 1',
1092
- price: 50,
1093
- quantity: 2,
1094
- },
1095
- {
1096
- name: 'Product 2',
1097
- price: 30,
1098
- quantity: 1,
1099
- },
1100
- ],
1101
- },
1102
- };
1103
- const mappingJson = [
1104
- {
1105
- sourceKeys: 'event',
1106
- required: true,
1107
- metadata: {},
1108
- },
1109
- {
1110
- sourceKeys: 'properties.revenue',
1111
- required: true,
1112
- metadata: {},
1113
- },
1114
- {
1115
- sourceKeys: 'properties.currency',
1116
- required: true,
1117
- metadata: {},
1118
- },
1119
- {
1120
- sourceKeys: 'properties.products',
1121
- required: true,
1122
- metadata: {},
1123
- },
1124
- ];
1125
- // Not a correct payload as the destination keys are empty strings or not present
1126
- const expectedPayload = {
1127
- '': [
1128
- {
1129
- name: 'Product 1',
1130
- price: 50,
1131
- quantity: 2,
1132
- },
1133
- {
1134
- name: 'Product 2',
1135
- price: 30,
1136
- quantity: 1,
1137
- },
1138
- ],
1139
- };
1140
- const payload = json_1.JsonUtils.constructPayload(message, mappingJson);
1141
- expect(payload).toEqual(expectedPayload);
1142
- });
1143
- });
1144
- describe('json util other functions', () => {
1145
- it('should retrieve the field value correctly from the message using a valid sourceKey', () => {
1146
- const message = {
1147
- event: 'purchase',
1148
- properties: {
1149
- revenue: 100,
1150
- currency: 'USD',
1151
- },
1152
- traits: {
1153
- firstName: 'John',
1154
- lastName: 'Doe',
1155
- },
1156
- };
1157
- const sourceKey = 'firstName';
1158
- const expectedValue = 'John';
1159
- const value = json_1.JsonUtils.getFieldValueFromMessage(message, sourceKey);
1160
- expect(value).toEqual(expectedValue);
1161
- });
1162
- it('should throw when sourceKeys is not string, object or Array', () => {
1163
- expect(() => {
1164
- // @ts-expect-error: for testing purposes
1165
- json_1.JsonUtils.getValueFromMessage({}, 123);
1166
- }).toThrow('Wrong sourceKey type or blank sourceKey array');
1167
- });
1168
- it('should perform addition operation while getting value from message', () => {
1169
- const msg = {
1170
- a: 12,
1171
- c: 114,
1172
- };
1173
- const ops = {
1174
- operation: 'addition',
1175
- args: [
1176
- {
1177
- sourceKeys: ['a', 'b'],
1178
- defaultVal: 0,
1179
- },
1180
- {
1181
- sourceKeys: ['c.d'],
1182
- defaultVal: -1,
1183
- },
1184
- ],
1185
- };
1186
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(11);
1187
- });
1188
- it('should return defaultVal for addition operation while getting value from message', () => {
1189
- const msg = {
1190
- 1: 1234,
1191
- a: 12,
1192
- c: 114,
1193
- };
1194
- const ops = {
1195
- operation: 'addition',
1196
- args: [
1197
- {
1198
- sourceKeys: 1,
1199
- defaultVal: 0,
1200
- },
1201
- {
1202
- sourceKeys: ['c.d'],
1203
- defaultVal: -1,
1204
- },
1205
- ],
1206
- };
1207
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(-1);
1208
- });
1209
- it('should return null when no defaultValues are provided', () => {
1210
- const msg = {
1211
- a: 12,
1212
- c: 114,
1213
- };
1214
- const ops = {
1215
- operation: 'addition',
1216
- args: [
1217
- {
1218
- sourceKeys: ['D', 'W'],
1219
- defaultVal: 0,
1220
- },
1221
- {
1222
- sourceKeys: ['c.d'],
1223
- },
1224
- ],
1225
- };
1226
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(null);
1227
- });
1228
- it('should return null when string defaultValues are provided', () => {
1229
- const msg = {
1230
- a: 12,
1231
- c: 114,
1232
- };
1233
- const ops = {
1234
- operation: 'multiplication',
1235
- args: [
1236
- {
1237
- sourceKeys: ['D', 'W'],
1238
- defaultVal: '0',
1239
- },
1240
- {
1241
- sourceKeys: ['c.d'],
1242
- defaultVal: '12',
1243
- },
1244
- ],
1245
- };
1246
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(null);
1247
- ops.operation = 'addition';
1248
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(null);
1249
- ops.operation = 'randomOp';
1250
- expect(json_1.JsonUtils.getValueFromMessage(msg, ops)).toEqual(null);
1251
- });
1252
- it('should stringify json', () => {
1253
- expect(json_1.JsonUtils.stringify({ a: 1 })).toEqual(`{"a":1}`);
1254
- });
1255
- it('should return null when given an invalid sourceKey', () => {
1256
- const message = {
1257
- event: 'purchase',
1258
- properties: {
1259
- revenue: 100,
1260
- currency: 'USD',
1261
- },
1262
- };
1263
- const sourceKey = 'invalidKey';
1264
- const value = json_1.JsonUtils.getFieldValueFromMessage(message, sourceKey);
1265
- expect(value).toBeNull();
1266
- });
1267
- it('should return proper templated value', () => {
1268
- const message = {
1269
- event: 'purchase',
1270
- properties: {
1271
- revenue: 100,
1272
- currency: 'USD',
1273
- },
1274
- };
1275
- const mappingJson = [
1276
- {
1277
- sourceKeys: ['properties'],
1278
- destKey: 'itemName',
1279
- metadata: {
1280
- template: '{{value.revenue}} {{value.currency}}',
1281
- },
1282
- },
1283
- ];
1284
- expect(json_1.JsonUtils.constructPayload(message, mappingJson)).toEqual({
1285
- itemName: '100 USD',
1286
- });
1287
- });
1288
- });
1289
- });
1290
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2pzb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUFpRDtBQUNqRCxpQ0FBbUM7QUFFbkMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7SUFDMUIsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUM3QyxFQUFFLENBQUMseUdBQXlHLEVBQUUsR0FBRyxFQUFFO1lBQ2pILE1BQU0sT0FBTyxHQUFHO2dCQUNkLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFdBQVcsRUFBRSxHQUFHO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTt3QkFDMUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtxQkFDM0M7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDckIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNsQyxPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsd0JBQXdCLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxhQUFhO29CQUN0QixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2FBQ0YsQ0FBQztZQUVGLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixLQUFLLEVBQUUsVUFBVTtnQkFDakIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFdBQVcsRUFBRSxHQUFHO2dCQUNoQixRQUFRLEVBQUU7b0JBQ1IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtvQkFDMUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtpQkFDM0M7YUFDRixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwR0FBMEcsRUFBRSxHQUFHLEVBQUU7WUFDbEgsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsT0FBTztvQkFDaEIsV0FBVyxFQUFFLEdBQUc7aUJBQ2pCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDbEMsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUN0QyxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUUsS0FBSztvQkFDZixRQUFRLEVBQUUsRUFBRTtpQkFDYjthQUNGLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixXQUFXLEVBQUUsR0FBRzthQUNqQixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtR0FBbUcsRUFBRSxHQUFHLEVBQUU7WUFDM0csTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUU7d0JBQ0wsRUFBRSxFQUFFLE9BQU87d0JBQ1gsV0FBVyxFQUFFLEdBQUc7cUJBQ2pCO2lCQUNGO2FBQ0YsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLDhCQUE4QixDQUFDO29CQUM1QyxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLEtBQUssRUFBRSxVQUFVO2dCQUNqQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsV0FBVyxFQUFFLEdBQUc7YUFDakIsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0hBQXNILEVBQUUsR0FBRyxFQUFFO1lBQzlILE1BQU0sT0FBTyxHQUFHO2dCQUNkLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsV0FBVyxFQUFFLEtBQUs7aUJBQ25CO2FBQ0YsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDbEMsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUN0QyxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLEtBQUssRUFBRSxVQUFVO2dCQUNqQixPQUFPLEVBQUUsS0FBSztnQkFDZCxXQUFXLEVBQUUsS0FBSzthQUNuQixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrSEFBa0gsRUFBRSxHQUFHLEVBQUU7WUFDMUgsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixRQUFRLEVBQUU7d0JBQ1IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTt3QkFDMUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtxQkFDM0M7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDckIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNuQyxPQUFPLEVBQUUsVUFBVTtvQkFDbkIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLEtBQUssRUFBRSxVQUFVO2dCQUNqQixRQUFRLEVBQUU7b0JBQ1IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtvQkFDMUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtpQkFDM0M7YUFDRixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnSEFBZ0gsRUFBRSxHQUFHLEVBQUU7WUFDeEgsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsT0FBTztvQkFDaEIsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsTUFBTSxFQUFFLEVBQUU7aUJBQ1g7YUFDRixDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDckIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNsQyxPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFO3dCQUNWOzRCQUNFLFNBQVMsRUFBRSxnQkFBZ0I7NEJBQzNCLElBQUksRUFBRTtnQ0FDSjtvQ0FDRSxVQUFVLEVBQUUsa0JBQWtCO2lDQUMvQjtnQ0FDRDtvQ0FDRSxVQUFVLEVBQUUscUJBQXFCO29DQUNqQyxPQUFPLEVBQUUsQ0FBQztpQ0FDWDs2QkFDRjt5QkFDRjtxQkFDRjtvQkFDRCxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFO3dCQUNWOzRCQUNFLFNBQVMsRUFBRSxVQUFVOzRCQUNyQixJQUFJLEVBQUU7Z0NBQ0o7b0NBQ0UsVUFBVSxFQUFFLG1CQUFtQjtpQ0FDaEM7Z0NBQ0Q7b0NBQ0UsVUFBVSxFQUFFLG1CQUFtQjtvQ0FDL0IsT0FBTyxFQUFFLENBQUM7aUNBQ1g7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFLFlBQVk7b0JBQ3JCLFFBQVEsRUFBRSxJQUFJO2lCQUNmO2FBQ0YsQ0FBQztZQUVGLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixLQUFLLEVBQUUsVUFBVTtnQkFDakIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFdBQVcsRUFBRSxHQUFHO2dCQUNoQixVQUFVLEVBQUUsRUFBRTthQUNmLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4RSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtIQUFrSCxFQUFFLEdBQUcsRUFBRTtZQUMxSCxNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLE9BQU8sRUFBRSxLQUFLO29CQUNkLFdBQVcsRUFBRSxLQUFLO29CQUNsQixJQUFJLEVBQUUsUUFBUTtvQkFDZCxRQUFRLEVBQUU7d0JBQ1IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTt3QkFDMUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtxQkFDM0M7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRSxPQUFPO3dCQUNkLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNsQyxPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxVQUFVO3FCQUNqQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGFBQWE7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsVUFBVTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUUsSUFBSTtpQkFDZjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxXQUFXO3dCQUNqQixVQUFVLEVBQUUsdUJBQXVCO3FCQUNwQztvQkFDRCxPQUFPLEVBQUUsV0FBVztpQkFDckI7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO29CQUN0QixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFO3dCQUNSLFlBQVksRUFBRSxRQUFRO3FCQUN2QjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDcEMsT0FBTyxFQUFFLFdBQVc7b0JBQ3BCLFFBQVEsRUFBRTt3QkFDUixRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUNELGNBQWM7Z0JBQ2Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ2xDLE9BQU8sRUFBRSxZQUFZO29CQUNyQixRQUFRLEVBQUU7d0JBQ1IsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixXQUFXLEVBQUU7NEJBQ1g7Z0NBQ0UsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztnQ0FDbEMsT0FBTyxFQUFFLEtBQUs7NkJBQ2Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLEtBQUssRUFBRSxVQUFVO2dCQUNqQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsV0FBVyxFQUFFLEdBQUc7Z0JBQ2hCLFFBQVEsRUFBRTtvQkFDUixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO29CQUMxQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2lCQUMzQztnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLE9BQU87aUJBQ2Y7Z0JBQ0QsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixTQUFTLEVBQUUsMEJBQTBCO2FBQ3RDLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4RSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtZQUM1RSxNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixlQUFlLEVBQUU7NEJBQ2Y7Z0NBQ0UsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQzs2QkFDbkM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLFFBQVEsRUFBRSxRQUFRO2FBQ25CLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4RSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtZQUNsRixNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixlQUFlLEVBQUU7NEJBQ2Y7Z0NBQ0UsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQzs2QkFDaEM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4RSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGlGQUFpRixFQUFFLEdBQUcsRUFBRTtZQUN6RixNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixlQUFlLEVBQUU7NEJBQ2Y7Z0NBQ0UsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztnQ0FDbEMsSUFBSSxFQUFFLGFBQWE7NkJBQ3BCO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQztZQUVGLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxpRkFBaUYsRUFBRSxHQUFHLEVBQUU7WUFDekYsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsUUFBUTtpQkFDZjtnQkFDRCxTQUFTLEVBQUUsMEJBQTBCO2FBQ3RDLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsaUJBQWlCLENBQUM7b0JBQy9CLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUU7d0JBQ1IsZUFBZSxFQUFFOzRCQUNmO2dDQUNFLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7Z0NBQzVCLElBQUksRUFBRSxhQUFhOzZCQUNwQjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1lBQzVELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUFHO2dCQUNkLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixVQUFVLEVBQUUsYUFBYTtnQkFDekIsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLFVBQVUsRUFBRSxhQUFhLEVBQUUsOEJBQThCO2FBQzFELENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUMxQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsUUFBUSxFQUFFO3dCQUNSLGlCQUFpQixFQUFFOzRCQUNqQiwyQkFBMkIsRUFBRSxDQUFDOzRCQUM5QixxQkFBcUIsRUFBRSxTQUFTO3lCQUNqQztxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQzFCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsaUJBQWlCLEVBQUU7NEJBQ2pCLHlCQUF5QixFQUFFLENBQUM7NEJBQzVCLG1CQUFtQixFQUFFLFNBQVM7eUJBQy9CO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRTt3QkFDUixpQkFBaUIsRUFBRTs0QkFDakIsMkJBQTJCLEVBQUUsQ0FBQzs0QkFDOUIscUJBQXFCLEVBQUUsT0FBTzt5QkFDL0I7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUMxQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsUUFBUSxFQUFFO3dCQUNSLGlCQUFpQixFQUFFOzRCQUNqQix5QkFBeUIsRUFBRSxFQUFFOzRCQUM3QixtQkFBbUIsRUFBRSxTQUFTO3lCQUMvQjtxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQzFCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsaUJBQWlCLEVBQUU7NEJBQ2pCLHlCQUF5QixFQUFFLENBQUM7NEJBQzVCLG1CQUFtQixFQUFFLE9BQU87eUJBQzdCO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRTt3QkFDUixpQkFBaUIsRUFBRTs0QkFDakIsMkJBQTJCLEVBQUUsQ0FBQzs0QkFDOUIscUJBQXFCLEVBQUUsTUFBTTt5QkFDOUI7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUMxQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsUUFBUSxFQUFFO3dCQUNSLGlCQUFpQixFQUFFOzRCQUNqQix5QkFBeUIsRUFBRSxDQUFDOzRCQUM1QixtQkFBbUIsRUFBRSxNQUFNO3lCQUM1QjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLEtBQUssRUFBRSxhQUFhO2dCQUNwQixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLEtBQUssRUFBRSxhQUFhO2dCQUNwQixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsS0FBSyxFQUFFLGFBQWEsRUFBRSw4QkFBOEI7YUFDckQsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUFHO2dCQUNkLFVBQVUsRUFBRSxhQUFhLEVBQUUsOEJBQThCO2FBQzFELENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUMxQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsUUFBUSxFQUFFO3dCQUNSLGlCQUFpQixFQUFFOzRCQUNqQix5QkFBeUIsRUFBRSxDQUFDOzRCQUM1QixtQkFBbUIsRUFBRSxTQUFTO3lCQUMvQjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNWLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzFELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFLEdBQUcsRUFBRTtZQUM5RSxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLE9BQU8sR0FBRztnQkFDZCxVQUFVLEVBQUUsYUFBYSxFQUFFLDhCQUE4QjthQUMxRCxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRTt3QkFDUixpQkFBaUIsRUFBRTs0QkFDakIsMkJBQTJCLEVBQUUsQ0FBQzs0QkFDOUIscUJBQXFCLEVBQUUsU0FBUzt5QkFDakM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDVixnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxHQUFHLEVBQUU7WUFDcEUsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsVUFBVSxFQUFFLDBCQUEwQixFQUFFLDhCQUE4QjthQUN2RSxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFFBQVEsRUFBRTt3QkFDUixpQkFBaUIsRUFBRTs0QkFDakIsMkJBQTJCLEVBQUUsQ0FBQzs0QkFDOUIscUJBQXFCLEVBQUUsU0FBUzt5QkFDakM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDVixnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0SkFBNEosRUFBRSxHQUFHLEVBQUU7WUFDcEssTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLGlCQUFpQjtnQkFDeEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsR0FBRyxFQUFFLHdCQUF3QjtnQkFDN0IsRUFBRSxFQUFFLGtCQUFrQjtnQkFDdEIsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFO2dCQUN4QixFQUFFLEVBQUUsU0FBUztnQkFDYixHQUFHLEVBQUUsWUFBWTtnQkFDakIsSUFBSSxFQUFFLDBCQUEwQjthQUNqQyxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDckIsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO3FCQUMxQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxTQUFTO29CQUNsQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDO3FCQUN0QjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDbEIsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNuQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLHVCQUF1QixDQUFDO3FCQUNoQztpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxTQUFTO29CQUNsQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7cUJBQ3pCO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDbEIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDbEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUNsQixPQUFPLEVBQUUsTUFBTTtvQkFDZixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO3FCQUNoQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxNQUFNO29CQUNmLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQztvQkFDcEIsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDO3FCQUMxQjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztxQkFDL0I7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxDQUFDLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN0RSxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsR0FBRyxFQUFFLGdCQUFnQjtnQkFDckIsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLE1BQU0sRUFBRSxDQUFDLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLEdBQUcsRUFBRSxPQUFPO2dCQUNaLElBQUksRUFBRSxFQUFFO2dCQUNSLElBQUksRUFBRSxPQUFPO2dCQUNiLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEdBQUcsRUFBRSxnQkFBZ0I7YUFDdEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUdBQWlHLEVBQUUsR0FBRyxFQUFFO1lBQ3pHLE1BQU0sT0FBTyxHQUFHO2dCQUNkLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssRUFBRSxVQUFVO2FBQ2xCLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNuQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQztxQkFDbkI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNuQixPQUFPLEVBQUUsTUFBTTtvQkFDZixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDO3FCQUN4QjtpQkFDRjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsd0JBQXdCLENBQUM7cUJBQ2pDO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDckIsT0FBTyxFQUFFLEdBQUc7b0JBQ1osUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLG9CQUFvQixDQUFDO3FCQUM3QjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUMvQyxLQUFLLEVBQUUsb0NBQW9DO2dCQUMzQyxDQUFDLEVBQUUsZ0JBQWdCO2dCQUNuQixJQUFJLEVBQUUsc0NBQXNDO2FBQzdDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLE9BQU8sR0FBRztnQkFDZCxHQUFHLEVBQUUsTUFBTTthQUNaLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNuQixPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDO3FCQUMzQjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RFLE9BQU8sRUFBRSxLQUFLO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sT0FBTyxHQUFHO2dCQUNkLEdBQUcsRUFBRSxNQUFNO2FBQ1osQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxTQUFTO29CQUNsQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUM7cUJBQzNCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0ZBQW9GLEVBQUUsR0FBRyxFQUFFO1lBQzVGLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUFHO2dCQUNkLEdBQUcsRUFBRSxPQUFPO2FBQ2IsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDO3FCQUN0QjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNWLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzFELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxHQUFHLEVBQUU7WUFDekUsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsUUFBUTtpQkFDZjtnQkFDRCxTQUFTLEVBQUUsMEJBQTBCO2FBQ3RDLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLENBQUMsaUJBQWlCLENBQUM7b0JBQy9CLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO2lCQUM5QjthQUNGLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsbUVBQW1FLEVBQUUsR0FBRyxFQUFFO1lBQzNFLE1BQU0sT0FBTyxHQUFHO2dCQUNkLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUU7b0JBQ1YsSUFBSSxFQUFFLFFBQVE7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFLDBCQUEwQjthQUN0QyxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUMvQixPQUFPLEVBQUUsVUFBVTtvQkFDbkIsUUFBUSxFQUFFO3dCQUNSLGNBQWMsRUFBRSxFQUFFO3FCQUNuQjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNWLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzFELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLG9GQUFvRixFQUFFLEdBQUcsRUFBRTtZQUM1RixNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixXQUFXLEVBQUU7NEJBQ1g7Z0NBQ0UsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO2dDQUN6QyxPQUFPLEVBQUUsR0FBRzs2QkFDYjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RFLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNELFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixXQUFXLEVBQUU7NEJBQ1g7Z0NBQ0UsU0FBUyxFQUFFLEVBQUU7Z0NBQ2IsT0FBTyxFQUFFLEdBQUc7NkJBQ2I7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxDQUFDLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN0RSxRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDO1lBQ0YsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLGdCQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLGdCQUFTLENBQUMsd0JBQXdCLENBQUMsT0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztvQkFDZixRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsSUFBSSxFQUFFLFdBQVc7NEJBQ2pCLEtBQUssRUFBRSxFQUFFOzRCQUNULFFBQVEsRUFBRSxDQUFDO3lCQUNaO3dCQUNEOzRCQUNFLElBQUksRUFBRSxXQUFXOzRCQUNqQixLQUFLLEVBQUUsRUFBRTs0QkFDVCxRQUFRLEVBQUUsQ0FBQzt5QkFDWjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLG9CQUFvQjtvQkFDaEMsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsYUFBYTtxQkFDcEI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxLQUFLLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsT0FBTyxFQUFFLEdBQUc7YUFDYixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxHQUFHLEVBQUU7WUFDL0UsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztvQkFDZixRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsSUFBSSxFQUFFLFdBQVc7NEJBQ2pCLEtBQUssRUFBRSxFQUFFOzRCQUNULFFBQVEsRUFBRSxDQUFDO3lCQUNaO3dCQUNEOzRCQUNFLElBQUksRUFBRSxXQUFXOzRCQUNqQixLQUFLLEVBQUUsRUFBRTs0QkFDVCxRQUFRLEVBQUUsQ0FBQzt5QkFDWjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLE9BQU87b0JBQ25CLE9BQU8sRUFBRSxPQUFPO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLHFCQUFxQjtvQkFDakMsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxxQkFBcUI7b0JBQ2pDLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtnQkFDRDtvQkFDRSxVQUFVLEVBQUUsdUJBQXVCO29CQUNuQyxPQUFPLEVBQUUsWUFBWTtvQkFDckIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDVixnQkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsNkJBQW9CLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0SEFBNEgsRUFBRSxHQUFHLEVBQUU7WUFDcEksTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztvQkFDZixRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsSUFBSSxFQUFFLFdBQVc7NEJBQ2pCLEtBQUssRUFBRSxFQUFFOzRCQUNULFFBQVEsRUFBRSxDQUFDO3lCQUNaO3dCQUNEOzRCQUNFLElBQUksRUFBRSxXQUFXOzRCQUNqQixLQUFLLEVBQUUsRUFBRTs0QkFDVCxRQUFRLEVBQUUsQ0FBQzt5QkFDWjtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRztnQkFDbEI7b0JBQ0UsVUFBVSxFQUFFLE9BQU87b0JBQ25CLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxxQkFBcUI7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxxQkFBcUI7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2FBQ0YsQ0FBQztZQUNGLGlGQUFpRjtZQUNqRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsRUFBRSxFQUFFO29CQUNGO3dCQUNFLElBQUksRUFBRSxXQUFXO3dCQUNqQixLQUFLLEVBQUUsRUFBRTt3QkFDVCxRQUFRLEVBQUUsQ0FBQztxQkFDWjtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsV0FBVzt3QkFDakIsS0FBSyxFQUFFLEVBQUU7d0JBQ1QsUUFBUSxFQUFFLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtRQUN6QyxFQUFFLENBQUMsb0ZBQW9GLEVBQUUsR0FBRyxFQUFFO1lBQzVGLE1BQU0sT0FBTyxHQUFHO2dCQUNkLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLEdBQUc7b0JBQ1osUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2dCQUNELE1BQU0sRUFBRTtvQkFDTixTQUFTLEVBQUUsTUFBTTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFFN0IsTUFBTSxLQUFLLEdBQUcsZ0JBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxHQUFHLEVBQUU7WUFDckUsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDVix5Q0FBeUM7Z0JBQ3pDLGdCQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtZQUM1RSxNQUFNLEdBQUcsR0FBRztnQkFDVixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsR0FBRzthQUNQLENBQUM7WUFDRixNQUFNLEdBQUcsR0FBRztnQkFDVixTQUFTLEVBQUUsVUFBVTtnQkFDckIsSUFBSSxFQUFFO29CQUNKO3dCQUNFLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7d0JBQ3RCLFVBQVUsRUFBRSxDQUFDO3FCQUNkO29CQUNEO3dCQUNFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQzt3QkFDbkIsVUFBVSxFQUFFLENBQUMsQ0FBQztxQkFDZjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0ZBQWtGLEVBQUUsR0FBRyxFQUFFO1lBQzFGLE1BQU0sR0FBRyxHQUFHO2dCQUNWLENBQUMsRUFBRSxJQUFJO2dCQUNQLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxHQUFHO2FBQ1AsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHO2dCQUNWLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsVUFBVSxFQUFFLENBQUM7d0JBQ2IsVUFBVSxFQUFFLENBQUM7cUJBQ2Q7b0JBQ0Q7d0JBQ0UsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO3dCQUNuQixVQUFVLEVBQUUsQ0FBQyxDQUFDO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLEdBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxNQUFNLEdBQUcsR0FBRztnQkFDVixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsR0FBRzthQUNQLENBQUM7WUFDRixNQUFNLEdBQUcsR0FBRztnQkFDVixTQUFTLEVBQUUsVUFBVTtnQkFDckIsSUFBSSxFQUFFO29CQUNKO3dCQUNFLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7d0JBQ3RCLFVBQVUsRUFBRSxDQUFDO3FCQUNkO29CQUNEO3dCQUNFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztxQkFDcEI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLGdCQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJEQUEyRCxFQUFFLEdBQUcsRUFBRTtZQUNuRSxNQUFNLEdBQUcsR0FBRztnQkFDVixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsR0FBRzthQUNQLENBQUM7WUFDRixNQUFNLEdBQUcsR0FBRztnQkFDVixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzt3QkFDdEIsVUFBVSxFQUFFLEdBQUc7cUJBQ2hCO29CQUNEO3dCQUNFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQzt3QkFDbkIsVUFBVSxFQUFFLElBQUk7cUJBQ2pCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLEdBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSxHQUFHLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUMzQixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFckUsR0FBRyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDM0IsTUFBTSxDQUFDLGdCQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtZQUMvQixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDO1lBRUYsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBRS9CLE1BQU0sS0FBSyxHQUFHLGdCQUFTLENBQUMsd0JBQXdCLENBQUMsT0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7WUFDOUMsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDO1lBQ0YsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixRQUFRLEVBQUUsc0NBQXNDO3FCQUNqRDtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLENBQUMsZ0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RFLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluc3RydW1lbnRhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEpzb25VdGlscyB9IGZyb20gJy4vanNvbic7XG5cbmRlc2NyaWJlKCdKU09OIHV0aWxzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29uc3RydWN0IHBheWxvYWQgaGFwcHkgcGF0aHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb25zdHJ1Y3QgcGF5bG9hZCB3aXRoIHZhbGlkIG1hcHBpbmcgSlNPTiBhbmQgbWVzc2FnZSBvYmplY3QgY29udGFpbmluZyBhbGwgcmVxdWlyZWQgc291cmNlIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG9yZGVySWQ6ICcxMjM0NScsXG4gICAgICAgICAgdG90YWxBbW91bnQ6IDEwMCxcbiAgICAgICAgICBwcm9kdWN0czogW1xuICAgICAgICAgICAgeyBpZDogJ3AxJywgbmFtZTogJ1Byb2R1Y3QgMScsIHByaWNlOiA1MCB9LFxuICAgICAgICAgICAgeyBpZDogJ3AyJywgbmFtZTogJ1Byb2R1Y3QgMicsIHByaWNlOiA1MCB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsnZXZlbnQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnZXZlbnQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy5vcmRlcklkJ10sXG4gICAgICAgICAgZGVzdEtleTogJ29yZGVySWQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy50b3RhbEFtb3VudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0b3RhbEFtb3VudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLnByb2R1Y3RzJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3Byb2R1Y3RzJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFBheWxvYWQgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBvcmRlcklkOiAnMTIzNDUnLFxuICAgICAgICB0b3RhbEFtb3VudDogMTAwLFxuICAgICAgICBwcm9kdWN0czogW1xuICAgICAgICAgIHsgaWQ6ICdwMScsIG5hbWU6ICdQcm9kdWN0IDEnLCBwcmljZTogNTAgfSxcbiAgICAgICAgICB7IGlkOiAncDInLCBuYW1lOiAnUHJvZHVjdCAyJywgcHJpY2U6IDUwIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnN0cnVjdCBwYXlsb2FkIHdpdGggdmFsaWQgbWFwcGluZyBKU09OIGFuZCBtZXNzYWdlIG9iamVjdCBjb250YWluaW5nIHNvbWUgb3B0aW9uYWwgc291cmNlIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG9yZGVySWQ6ICcxMjM0NScsXG4gICAgICAgICAgdG90YWxBbW91bnQ6IDEwMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydldmVudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdldmVudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLm9yZGVySWQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnb3JkZXJJZCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLnRvdGFsQW1vdW50J10sXG4gICAgICAgICAgZGVzdEtleTogJ3RvdGFsQW1vdW50JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMucHJvZHVjdHMnXSxcbiAgICAgICAgICBkZXN0S2V5OiAncHJvZHVjdHMnLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFBheWxvYWQgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBvcmRlcklkOiAnMTIzNDUnLFxuICAgICAgICB0b3RhbEFtb3VudDogMTAwLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbik7XG4gICAgICBleHBlY3QocGF5bG9hZCkudG9FcXVhbChleHBlY3RlZFBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb25zdHJ1Y3QgcGF5bG9hZCB3aXRoIHZhbGlkIG1hcHBpbmcgSlNPTiBhbmQgbWVzc2FnZSBvYmplY3QgY29udGFpbmluZyBuZXN0ZWQgc291cmNlIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG9yZGVyOiB7XG4gICAgICAgICAgICBpZDogJzEyMzQ1JyxcbiAgICAgICAgICAgIHRvdGFsQW1vdW50OiAxMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydldmVudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdldmVudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLm9yZGVyLmlkJ10sXG4gICAgICAgICAgZGVzdEtleTogJ29yZGVySWQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy5vcmRlci50b3RhbEFtb3VudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0b3RhbEFtb3VudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgb3JkZXJJZDogJzEyMzQ1JyxcbiAgICAgICAgdG90YWxBbW91bnQ6IDEwMCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgZXhwZWN0KHBheWxvYWQpLnRvRXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29uc3RydWN0IHBheWxvYWQgd2l0aCB2YWxpZCBtYXBwaW5nIEpTT04gYW5kIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgc291cmNlIGtleXMgd2l0aCBkaWZmZXJlbnQgZGF0YSB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgb3JkZXJJZDogMTIzNDUsXG4gICAgICAgICAgdG90YWxBbW91bnQ6ICcxMDAnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2V2ZW50J10sXG4gICAgICAgICAgZGVzdEtleTogJ2V2ZW50JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMub3JkZXJJZCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdvcmRlcklkJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMudG90YWxBbW91bnQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAndG90YWxBbW91bnQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkUGF5bG9hZCA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIG9yZGVySWQ6IDEyMzQ1LFxuICAgICAgICB0b3RhbEFtb3VudDogJzEwMCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnN0cnVjdCBwYXlsb2FkIHdpdGggdmFsaWQgbWFwcGluZyBKU09OIGFuZCBtZXNzYWdlIG9iamVjdCBjb250YWluaW5nIHNvdXJjZSBrZXlzIHdpdGggYXJyYXlzIG9mIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcHJvZHVjdHM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdwMScsIG5hbWU6ICdQcm9kdWN0IDEnLCBwcmljZTogNTAgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdwMicsIG5hbWU6ICdQcm9kdWN0IDInLCBwcmljZTogNTAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2V2ZW50J10sXG4gICAgICAgICAgZGVzdEtleTogJ2V2ZW50JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMucHJvZHVjdHMnXSxcbiAgICAgICAgICBkZXN0S2V5OiAncHJvZHVjdHMnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkUGF5bG9hZCA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb2R1Y3RzOiBbXG4gICAgICAgICAgeyBpZDogJ3AxJywgbmFtZTogJ1Byb2R1Y3QgMScsIHByaWNlOiA1MCB9LFxuICAgICAgICAgIHsgaWQ6ICdwMicsIG5hbWU6ICdQcm9kdWN0IDInLCBwcmljZTogNTAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgZXhwZWN0KHBheWxvYWQpLnRvRXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29uc3RydWN0IHBheWxvYWQgd2l0aCB2YWxpZCBtYXBwaW5nIEpTT04gYW5kIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgc291cmNlIGtleXMgd2l0aCBmb3Igb3BlcmF0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgb3JkZXJJZDogJzEyMzQ1JyxcbiAgICAgICAgICBwcmljZTogMTAwLFxuICAgICAgICAgIHF1YW50aXR5OiAyLFxuICAgICAgICAgIGFkZG9uMTogMTAsXG4gICAgICAgICAgYWRkb24yOiAyMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydldmVudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdldmVudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLm9yZGVySWQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnb3JkZXJJZCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogJ211bHRpcGxpY2F0aW9uJyxcbiAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUtleXM6ICdwcm9wZXJ0aWVzLnByaWNlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUtleXM6ICdwcm9wZXJ0aWVzLnF1YW50aXR5JyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkZXN0S2V5OiAndG90YWxBbW91bnQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdhZGRpdGlvbicsXG4gICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5hZGRvbjEnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc291cmNlS2V5czogJ3Byb3BlcnRpZXMuYWRkb24yJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkZXN0S2V5OiAndG90YWxBZGRvbicsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFBheWxvYWQgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBvcmRlcklkOiAnMTIzNDUnLFxuICAgICAgICB0b3RhbEFtb3VudDogMjAwLFxuICAgICAgICB0b3RhbEFkZG9uOiAzMCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgZXhwZWN0KHBheWxvYWQpLnRvRXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29uc3RydWN0IHBheWxvYWQgd2l0aCB2YWxpZCBtYXBwaW5nIEpTT04gYW5kIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgc291cmNlIGtleXMgd2l0aCBtZXRhZGF0YSBjb25maWdzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBvcmRlcklkOiAxMjM0NSxcbiAgICAgICAgICB0b3RhbEFtb3VudDogJzEwMCcsXG4gICAgICAgICAgaXRlbTogJ01vYmlsZScsXG4gICAgICAgICAgcHJvZHVjdHM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdwMScsIG5hbWU6ICdQcm9kdWN0IDEnLCBwcmljZTogNTAgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdwMicsIG5hbWU6ICdQcm9kdWN0IDInLCBwcmljZTogNTAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGludmVudG9yeToge1xuICAgICAgICAgICAgaXRlbTE6ICdpdGVtMScsXG4gICAgICAgICAgICBpdGVtMjogJ2l0ZW0yJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0aW1lU3RhbXA6ICcyMDIxLTA5LTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2V2ZW50J10sXG4gICAgICAgICAgZGVzdEtleTogJ2V2ZW50JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogJ3RvU3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLm9yZGVySWQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnb3JkZXJJZCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0b1N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy50b3RhbEFtb3VudCddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0b3RhbEFtb3VudCcsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0b051bWJlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy5wcm9kdWN0cyddLFxuICAgICAgICAgIGRlc3RLZXk6ICdwcm9kdWN0cycsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAndGltZVN0YW1wJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogJ3RpbWVzdGFtcCcsXG4gICAgICAgICAgICB0eXBlRm9ybWF0OiAneXl5eS1NTS1ERFRISDptbTpzc1paJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lc3RhbXAnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydyYW5kb20nXSxcbiAgICAgICAgICBkZXN0S2V5OiAncmFuZG9tJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAncmFuZG9tJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLmludmVudG9yeSddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpbnZlbnRvcnknLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBleGNsdWRlczogWydpdGVtMiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHdhcm5pbmcgbG9nXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMub3JkZXJJZCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpbnZlbnRvcnkyJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZXhjbHVkZXM6IFsnaXRlbTInXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLml0ZW0nXSxcbiAgICAgICAgICBkZXN0S2V5OiAnaXRlbU5hbWUnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBtdWx0aWtleU1hcDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlVmFsOiBbJ01vYmlsZScsICdUZWxlcGhvbmUnXSxcbiAgICAgICAgICAgICAgICBkZXN0VmFsOiAnbW9iJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkUGF5bG9hZCA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIG9yZGVySWQ6ICcxMjM0NScsXG4gICAgICAgIHRvdGFsQW1vdW50OiAxMDAsXG4gICAgICAgIHByb2R1Y3RzOiBbXG4gICAgICAgICAgeyBpZDogJ3AxJywgbmFtZTogJ1Byb2R1Y3QgMScsIHByaWNlOiA1MCB9LFxuICAgICAgICAgIHsgaWQ6ICdwMicsIG5hbWU6ICdQcm9kdWN0IDInLCBwcmljZTogNTAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW52ZW50b3J5OiB7XG4gICAgICAgICAgaXRlbTE6ICdpdGVtMScsXG4gICAgICAgIH0sXG4gICAgICAgIGludmVudG9yeTI6IDEyMzQ1LFxuICAgICAgICBpdGVtTmFtZTogJ21vYicsXG4gICAgICAgIHJhbmRvbTogJ3JhbmRvbScsXG4gICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDktMDFUMDA6MDA6MDArMDAwMCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBwcm9wZXIgdmFsdWUgd2hlbiBhbGxvd2VkS2V5Q2hlY2sgY29udGFpbnMgdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpdGVtOiAnTW9iaWxlJyxcbiAgICAgICAgfSxcbiAgICAgICAgdGltZVN0YW1wOiAnMjAyMS0wOS0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLml0ZW0nXSxcbiAgICAgICAgICBkZXN0S2V5OiAnaXRlbU5hbWUnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBhbGxvd2VkS2V5Q2hlY2s6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNvdXJjZVZhbDogWydNb2JpbGUnLCAnVGVsZXBob25lJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFBheWxvYWQgPSB7XG4gICAgICAgIGl0ZW1OYW1lOiAnTW9iaWxlJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgZXhwZWN0KHBheWxvYWQpLnRvRXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiBhbGxvd2VkS2V5Q2hlY2sgZG9lcyBub3QgY29udGFpbnMgdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpdGVtOiAnTW9iaWxlJyxcbiAgICAgICAgfSxcbiAgICAgICAgdGltZVN0YW1wOiAnMjAyMS0wOS0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLml0ZW0nXSxcbiAgICAgICAgICBkZXN0S2V5OiAnaXRlbU5hbWUnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBhbGxvd2VkS2V5Q2hlY2s6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNvdXJjZVZhbDogWydEdW0nLCAnVGVsZXBob25lJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFBheWxvYWQgPSB7XG4gICAgICAgIGl0ZW1OYW1lOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbG93ZXJjYXNlZCB2YWx1ZSB3aGVuIGFsbG93ZWRLZXlDaGVjayBkb2VzIG5vdCBjb250YWlucyB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGl0ZW06ICdNb2JpbGUnLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lU3RhbXA6ICcyMDIxLTA5LTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMuaXRlbSddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpdGVtTmFtZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGFsbG93ZWRLZXlDaGVjazogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlVmFsOiBbJ21vYmlsZScsICd0ZWxlcGhvbmUnXSxcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9Mb3dlckNhc2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkID0ge1xuICAgICAgICBpdGVtTmFtZTogJ21vYmlsZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdXBwZXJjYXNlZCB2YWx1ZSB3aGVuIGFsbG93ZWRLZXlDaGVjayBkb2VzIG5vdCBjb250YWlucyB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGl0ZW06ICdNb2JpbGUnLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lU3RhbXA6ICcyMDIxLTA5LTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMuaXRlbSddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpdGVtTmFtZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGFsbG93ZWRLZXlDaGVjazogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlVmFsOiBbJ01PQklMRScsICdURUwnXSxcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9VcHBlckNhc2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkID0ge1xuICAgICAgICBpdGVtTmFtZTogJ01PQklMRScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0bHkgdmFsaWRhdGVkIHRpbWVzdGFtcCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB0aGlzIGlzIGEgbW9ja1xuICAgICAgRGF0ZS5ub3cgPSBqZXN0LmZuKCgpID0+IG5ldyBEYXRlKCcyMDIxLTA5LTAxVDAyOjAwOjAxLjAwMFonKSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICB0aW1lU3RhbXAxOiAxNjMwNDYxNjAwMDAwLCAvLyAnMjAyMS0wOS0wMVQwMjowMDowMC4wMDBaJyxcbiAgICAgICAgdGltZVN0YW1wMjogMTYzMDQ2MTU0MjAwMCwgLy8gJzIwMjEtMDktMDFUMDE6NTk6MDIuMDAwWicsXG4gICAgICAgIHRpbWVTdGFtcDM6IDE2MzA0NjUxNDAwMDAsIC8vICcyMDIxLTA5LTAxVDAyOjU5OjAwLjAwMFonLFxuICAgICAgICB0aW1lU3RhbXA0OiAxNjMwNDY1MTQwMDAwLCAvLyAnMjAyMS0wOS0wMVQwMjo1OTowMC4wMDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWyd0aW1lU3RhbXAxJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3RpbWUxJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdmFsaWRhdGVUaW1lc3RhbXA6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZEZ1dHVyZVRpbWVEaWZmZXJlbmNlOiAxLFxuICAgICAgICAgICAgICBhbGxvd2VkRnV0dXJlVGltZVVuaXQ6ICdzZWNvbmRzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndGltZVN0YW1wMiddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lMicsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRQYXN0VGltZURpZmZlcmVuY2U6IDEsXG4gICAgICAgICAgICAgIGFsbG93ZWRQYXN0VGltZVVuaXQ6ICdtaW51dGVzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndGltZVN0YW1wMyddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lMycsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRGdXR1cmVUaW1lRGlmZmVyZW5jZTogMSxcbiAgICAgICAgICAgICAgYWxsb3dlZEZ1dHVyZVRpbWVVbml0OiAnaG91cnMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWyd0aW1lU3RhbXAyJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3RpbWU0JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdmFsaWRhdGVUaW1lc3RhbXA6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZTogNzUsXG4gICAgICAgICAgICAgIGFsbG93ZWRQYXN0VGltZVVuaXQ6ICdzZWNvbmRzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndGltZVN0YW1wMiddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lNScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRQYXN0VGltZURpZmZlcmVuY2U6IDEsXG4gICAgICAgICAgICAgIGFsbG93ZWRQYXN0VGltZVVuaXQ6ICdob3VycycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RpbWVTdGFtcDQnXSxcbiAgICAgICAgICBkZXN0S2V5OiAndGltZTYnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcDoge1xuICAgICAgICAgICAgICBhbGxvd2VkRnV0dXJlVGltZURpZmZlcmVuY2U6IDEsXG4gICAgICAgICAgICAgIGFsbG93ZWRGdXR1cmVUaW1lVW5pdDogJ2RheXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWyd0aW1lU3RhbXAyJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3RpbWU3JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdmFsaWRhdGVUaW1lc3RhbXA6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZTogMSxcbiAgICAgICAgICAgICAgYWxsb3dlZFBhc3RUaW1lVW5pdDogJ2RheXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkID0ge1xuICAgICAgICB0aW1lMTogMTYzMDQ2MTYwMDAwMCwgLy8gJzIwMjEtMDktMDFUMDI6MDA6MDAuMDAwWicsXG4gICAgICAgIHRpbWUyOiAxNjMwNDYxNTQyMDAwLCAvLyAnMjAyMS0wOS0wMVQwMTo1OTowMi4wMDBaJyxcbiAgICAgICAgdGltZTQ6IDE2MzA0NjE1NDIwMDAsIC8vICcyMDIxLTA5LTAxVDAxOjU5OjAyLjAwMFonLFxuICAgICAgICB0aW1lNTogMTYzMDQ2MTU0MjAwMCwgLy8gJzIwMjEtMDktMDFUMDE6NTk6MDIuMDAwWicsXG4gICAgICAgIHRpbWUzOiAxNjMwNDY1MTQwMDAwLCAvLyAnMjAyMS0wOS0wMVQwMjo1OTowMC4wMDBaJyxcbiAgICAgICAgdGltZTY6IDE2MzA0NjUxNDAwMDAsIC8vICcyMDIxLTA5LTAxVDAyOjU5OjAwLjAwMFonLFxuICAgICAgICB0aW1lNzogMTYzMDQ2MTU0MjAwMCwgLy8gJzIwMjEtMDktMDFUMDI6NTk6MDAuMDAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdChwYXlsb2FkKS50b0VxdWFsKGV4cGVjdGVkUGF5bG9hZCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRoZSB0aW1lc3RhbXAgaXMgbW9yZSB0aGFuIGFsbG93ZWQgaW50byB0aGUgcGFzdCcsICgpID0+IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHRoaXMgaXMgYSBtb2NrXG4gICAgICBEYXRlLm5vdyA9IGplc3QuZm4oKCkgPT4gbmV3IERhdGUoJzIwMjEtMDktMDFUMDI6MDA6MDEuMDAwWicpKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHRpbWVTdGFtcDI6IDE2MzA0NjE1NDUwMDAsIC8vICcyMDIxLTA5LTAxVDAxOjU5OjA1LjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RpbWVTdGFtcDInXSxcbiAgICAgICAgICBkZXN0S2V5OiAndGltZTEnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcDoge1xuICAgICAgICAgICAgICBhbGxvd2VkUGFzdFRpbWVEaWZmZXJlbmNlOiAxLFxuICAgICAgICAgICAgICBhbGxvd2VkUGFzdFRpbWVVbml0OiAnc2Vjb25kcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgfSkudG9UaHJvdygnQWxsb3dlZCB0aW1lc3RhbXAgaXMgWzEgc2Vjb25kc10gaW50byB0aGUgcGFzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRoZSB0aW1lc3RhbXAgaXMgbW9yZSB0aGFuIGFsbG93ZWQgaW50byB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhpcyBpcyBhIG1vY2tcbiAgICAgIERhdGUubm93ID0gamVzdC5mbigoKSA9PiBuZXcgRGF0ZSgnMjAyMS0wOS0wMVQwMTo1MDowMS4wMDBaJykpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgdGltZVN0YW1wMjogMTYzMDQ2MTU0NTAwMCwgLy8gJzIwMjEtMDktMDFUMDE6NTk6MDUuMDAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndGltZVN0YW1wMiddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lMScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRGdXR1cmVUaW1lRGlmZmVyZW5jZTogMixcbiAgICAgICAgICAgICAgYWxsb3dlZEZ1dHVyZVRpbWVVbml0OiAnbWludXRlcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgfSkudG9UaHJvdygnQWxsb3dlZCB0aW1lc3RhbXAgaXMgWzIgbWludXRlc10gaW50byB0aGUgZnV0dXJlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRoZSB0aW1lc3RhbXAgaXMgc3RyaW5nIGFuZCBub3QgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB0aGlzIGlzIGEgbW9ja1xuICAgICAgRGF0ZS5ub3cgPSBqZXN0LmZuKCgpID0+IG5ldyBEYXRlKCcyMDIxLTA5LTAxVDAxOjUwOjAxLjAwMFonKSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICB0aW1lU3RhbXAyOiAnMjAyMS0wOS0wMVQwMTo1MDowMS4wMDBaJywgLy8gJzIwMjEtMDktMDFUMDE6NTk6MDUuMDAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndGltZVN0YW1wMiddLFxuICAgICAgICAgIGRlc3RLZXk6ICd0aW1lMScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRGdXR1cmVUaW1lRGlmZmVyZW5jZTogMixcbiAgICAgICAgICAgICAgYWxsb3dlZEZ1dHVyZVRpbWVVbml0OiAnbWludXRlcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgfSkudG9UaHJvdygnVGltZXN0YW1wIGlzIG5vdCBhIG51bWJlciwgY2Fubm90IHZhbGlkYXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBlcmZvcm0gdHJpbSwgc2Vjb25kVGltZXN0YW1wICYgbWljcm8sIGRvYkluTU1ERCwgdG9JbnQsIHRvTG93ZXIsIHRvRmxvYXQsIElzQm9vbGVhbiwgZG9tYWluVXJsVjIsIGRvbWFpblVybCwgZ2V0T2Zmc2V0SW5TZWMsIGpzb25TdHJpbmdpZnlPbk9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHRyaW1tOiAnIFNwYWNlZCBzdHJpbmcgJyxcbiAgICAgICAgYm9vbDogdHJ1ZSxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cuZ2dvb2xlLmNvbScsXG4gICAgICAgIHR6OiAnQW1lcmljYS9OZXdfWW9yaycsXG4gICAgICAgIGV0ejogJ0FtMCcsXG4gICAgICAgIG9iajogeyBhOiAxLCBiOiAnYmFsbCcgfSxcbiAgICAgICAgZmw6ICcxMi44ODE4JyxcbiAgICAgICAgZG9iOiAnMjAxMi0wMS0wMScsXG4gICAgICAgIHRpbWU6ICcyMDIxLTA5LTAxVDAxOjU5OjA1LjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RyaW1tJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3RyaW1tZWQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ3RyaW0nLCAndG9Mb3dlciddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RyaW1tJ10sXG4gICAgICAgICAgZGVzdEtleTogJ2lzYm9vbCcsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFsnSXNCb29sZWFuJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsnYm9vbCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpc2Jvb2wyJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydJc0Jvb2xlYW4nXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWyd1cmwnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnVXJsVjInLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ2RvbWFpblVybFYyJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndXJsJ10sXG4gICAgICAgICAgZGVzdEtleTogJ1VybCcsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFsnZG9tYWluVXJsJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsndHonXSxcbiAgICAgICAgICBkZXN0S2V5OiAnb2Zmc2V0JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydnZXRPZmZzZXRJblNlYyddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ29iaiddLFxuICAgICAgICAgIGRlc3RLZXk6ICdvYmplY3QnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ2pzb25TdHJpbmdpZnlPbk9iamVjdCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2V0eiddLFxuICAgICAgICAgIGRlc3RLZXk6ICdlb2Zmc2V0JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydnZXRPZmZzZXRJblNlYyddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2ZsJ10sXG4gICAgICAgICAgZGVzdEtleTogJ2ZsVicsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFsndG9GbG9hdCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2ZsJ10sXG4gICAgICAgICAgZGVzdEtleTogJ2ludFYnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ3RvSW50J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsnZG9iJ10sXG4gICAgICAgICAgZGVzdEtleTogJ21tZGQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ2RvYkluTU1ERCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RpbWUnXSxcbiAgICAgICAgICBkZXN0S2V5OiAndHMnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ3NlY29uZFRpbWVzdGFtcCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3RpbWUnXSxcbiAgICAgICAgICBkZXN0S2V5OiAnbXRzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydtaWNyb1NlY29uZFRpbWVzdGFtcCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKSkudG9FcXVhbCh7XG4gICAgICAgIHRyaW1tZWQ6ICdzcGFjZWQgc3RyaW5nJyxcbiAgICAgICAgaXNib29sOiBmYWxzZSxcbiAgICAgICAgaXNib29sMjogdHJ1ZSxcbiAgICAgICAgVXJsOiAnd3d3Lmdnb29sZS5jb20nLFxuICAgICAgICBVcmxWMjogJ2dnb29sZS5jb20nLFxuICAgICAgICBvZmZzZXQ6IC0xNDQwMCxcbiAgICAgICAgZW9mZnNldDogdW5kZWZpbmVkLFxuICAgICAgICBvYmplY3Q6ICd7XCJhXCI6MSxcImJcIjpcImJhbGxcIn0nLFxuICAgICAgICBmbFY6IDEyLjg4MTgsXG4gICAgICAgIGludFY6IDEyLFxuICAgICAgICBtbWRkOiAnMDEvMDEnLFxuICAgICAgICB0czogMTYzMDQ2MTU0NSxcbiAgICAgICAgbXRzOiAxNjMwNDYxNTQ1MDAwMDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBlcmZvcm0gZmxhdEpzb24sIGpzb25TdHJpbmdpZnksIGpzb25TdHJpbmdpZnlPbkZsYXR0ZW4sIGVuY29kZVVSSUNvbXBvbmVudCBzdWNjZXNzZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBvYmo6IHsgYTogMSwgYjogeyB3MTogJ2JhbGwnLCB3MjogJ2JhdCcgfSB9LFxuICAgICAgICBwYXJhbTogJz94PXRlc3Q/JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydvYmonXSxcbiAgICAgICAgICBkZXN0S2V5OiAnb2JqZWN0JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydmbGF0SnNvbiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ29iaiddLFxuICAgICAgICAgIGRlc3RLZXk6ICdzb2JqJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydqc29uU3RyaW5naWZ5J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsnb2JqJ10sXG4gICAgICAgICAgZGVzdEtleTogJ3NvYmpmJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydqc29uU3RyaW5naWZ5T25GbGF0dGVuJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncGFyYW0nXSxcbiAgICAgICAgICBkZXN0S2V5OiAncScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFsnZW5jb2RlVVJJQ29tcG9uZW50J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGV4cGVjdChKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pKS50b0VxdWFsKHtcbiAgICAgICAgb2JqZWN0OiB7IGE6IDEsICdiLncxJzogJ2JhbGwnLCAnYi53Mic6ICdiYXQnIH0sXG4gICAgICAgIHNvYmpmOiAne1wiYVwiOjEsXCJiLncxXCI6XCJiYWxsXCIsXCJiLncyXCI6XCJiYXRcIn0nLFxuICAgICAgICBxOiAnJTNGeCUzRHRlc3QlM0YnLFxuICAgICAgICBzb2JqOiAne1wiYVwiOjEsXCJiXCI6e1widzFcIjpcImJhbGxcIixcIncyXCI6XCJiYXRcIn19JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwZXJmb3JtIG51bWJlckZvclJldmVudWUgc3VjY2Vzc2Z1bGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcmV2OiAnJDEyNCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3JldiddLFxuICAgICAgICAgIGRlc3RLZXk6ICdyZXZlbnVlJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogWydudW1iZXJGb3JSZXZlbnVlJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBleHBlY3QoSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKSkudG9FcXVhbCh7XG4gICAgICAgIHJldmVudWU6IDEyNC4wLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHJldmVudWUgaXMgbm90IHNlbnQgYXMgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICByZXY6ICckMTJhJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncmV2J10sXG4gICAgICAgICAgZGVzdEtleTogJ3JldmVudWUnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBbJ251bWJlckZvclJldmVudWUnXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbik7XG4gICAgICB9KS50b1Rocm93KCdSZXZlbnVlIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB1cmwgaXMgbm90IGNvcnJlY3Qgd2hpbGUgdXNpbmcgZG9tYWluVXJsVjIgZm9ybWF0dGluZyB0eXBlJywgKCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhpcyBpcyBhIG1vY2tcbiAgICAgIERhdGUubm93ID0gamVzdC5mbigoKSA9PiBuZXcgRGF0ZSgnMjAyMS0wOS0wMVQwMTo1MDowMS4wMDBaJykpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgdXJsOiAnZ29taW0nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3VybCddLFxuICAgICAgICAgIGRlc3RLZXk6ICdVcmxWMicsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFsnZG9tYWluVXJsVjInXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIH0pLnRvVGhyb3coJ0ludmFsaWQgVVJMOiBnb21pbScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29uc3RydWN0IHBheWxvYWQgZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIG1hcCBkZXN0S2V5IHdpdGggdW5kZWZpbmVkIHdoZW4gbXVsdGlLZXlNYXAgaXMgYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpdGVtOiAnTW9iaWxlJyxcbiAgICAgICAgfSxcbiAgICAgICAgdGltZVN0YW1wOiAnMjAyMS0wOS0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogWydwcm9wZXJ0aWVzLml0ZW0nXSxcbiAgICAgICAgICBkZXN0S2V5OiAnaXRlbU5hbWUnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IG11bHRpa2V5TWFwOiB7fSB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkID0ge1xuICAgICAgICBpdGVtTmFtZTogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbik7XG4gICAgICBleHBlY3QocGF5bG9hZCkudG9FcXVhbChleHBlY3RlZFBheWxvYWQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBtdWx0aUtleU1hcCBidXQgc3RyaWN0TXVsdGlNYXAgaXMgcHJlc2VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgaXRlbTogJ01vYmlsZScsXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVTdGFtcDogJzIwMjEtMDktMDFUMDA6MDA6MDAuMDAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy5pdGVtJ10sXG4gICAgICAgICAgZGVzdEtleTogJ2l0ZW1OYW1lJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgc3RyaWN0TXVsdGlNYXA6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgfSkudG9UaHJvdygnSW52YWxpZCBlbnRyeSBmb3Iga2V5IGl0ZW1OYW1lJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIG11bHRpS2V5TWFwLnNvdXJjZVZhbCBkb2VzIG5vdCBjb250YWluIHRoZSBzb3VyY2VLZXkgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGl0ZW06ICdNb2JpbGUnLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lU3RhbXA6ICcyMDIxLTA5LTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwcGluZ0pzb24gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiBbJ3Byb3BlcnRpZXMuaXRlbSddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpdGVtTmFtZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIG11bHRpa2V5TWFwOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VWYWw6IFsnZicsICdGJywgJ0ZlbWFsZScsICdmZW1hbGUnXSxcbiAgICAgICAgICAgICAgICBkZXN0VmFsOiAnRicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBleHBlY3QoSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKSkudG9FcXVhbCh7XG4gICAgICAgIGl0ZW1OYW1lOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbXVsdGlLZXlNYXAuc291cmNlVmFsIGlzIG5vdCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgaXRlbTogJ01vYmlsZScsXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVTdGFtcDogJzIwMjEtMDktMDFUMDA6MDA6MDAuMDAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcy5pdGVtJ10sXG4gICAgICAgICAgZGVzdEtleTogJ2l0ZW1OYW1lJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgbXVsdGlrZXlNYXA6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNvdXJjZVZhbDoge30sXG4gICAgICAgICAgICAgICAgZGVzdFZhbDogJ0YnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgZXhwZWN0KEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbikpLnRvRXF1YWwoe1xuICAgICAgICBpdGVtTmFtZTogJ01vYmlsZScsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhbiBlbXB0eSBtYXBwaW5nSnNvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmV2ZW51ZTogMTAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtdO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbik7XG4gICAgICBleHBlY3QocGF5bG9hZCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhbiBpbnZhbGlkIHNvdXJjZUtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmV2ZW51ZTogMTAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSAnaW52YWxpZEtleSc7XG4gICAgICBjb25zdCB2YWx1ZSA9IEpzb25VdGlscy5nZXRGaWVsZFZhbHVlRnJvbU1lc3NhZ2UobWVzc2FnZSBhcyBhbnksIHNvdXJjZUtleSk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB3aGVuIG1ldGFkYXRhIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHJldmVudWU6IDEwMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgcHJvZHVjdHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ1Byb2R1Y3QgMScsXG4gICAgICAgICAgICAgIHByaWNlOiA1MCxcbiAgICAgICAgICAgICAgcXVhbnRpdHk6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnUHJvZHVjdCAyJyxcbiAgICAgICAgICAgICAgcHJpY2U6IDMwLFxuICAgICAgICAgICAgICBxdWFudGl0eTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6ICdwcm9wZXJ0aWVzLnJldmVudWUnLFxuICAgICAgICAgIGRlc3RLZXk6ICdyZXZlbnVlJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdHlwZTogJ2ludmFsaWRUeXBlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gSnNvblV0aWxzLmNvbnN0cnVjdFBheWxvYWQobWVzc2FnZSBhcyBhbnksIG1hcHBpbmdKc29uKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7XG4gICAgICAgIHJldmVudWU6IDEwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBJbnN0cnVtZW50YXRpb25FcnJvciB3aGVuIGEgcmVxdWlyZWQgdmFsdWUgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmV2ZW51ZTogMTAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBwcm9kdWN0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnUHJvZHVjdCAxJyxcbiAgICAgICAgICAgICAgcHJpY2U6IDUwLFxuICAgICAgICAgICAgICBxdWFudGl0eTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdQcm9kdWN0IDInLFxuICAgICAgICAgICAgICBwcmljZTogMzAsXG4gICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogJ2V2ZW50JyxcbiAgICAgICAgICBkZXN0S2V5OiAnZXZlbnQnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6ICdwcm9wZXJ0aWVzLnJldmVudWUnLFxuICAgICAgICAgIGRlc3RLZXk6ICdyZXZlbnVlJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5jdXJyZW5jeScsXG4gICAgICAgICAgZGVzdEtleTogJ2N1cnJlbmN5JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5wcm9kdWN0cycsXG4gICAgICAgICAgZGVzdEtleTogJ3Byb2R1Y3RzJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5pbnZhbGlkS2V5JyxcbiAgICAgICAgICBkZXN0S2V5OiAnaW52YWxpZEtleScsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIEpzb25VdGlscy5jb25zdHJ1Y3RQYXlsb2FkKG1lc3NhZ2UgYXMgYW55LCBtYXBwaW5nSnNvbik7XG4gICAgICB9KS50b1Rocm93KEluc3RydW1lbnRhdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29uc3RydWN0IHRoZSBwYXlsb2FkIGNvcnJlY3RseSB3aXRoIGEgdmFsaWQgbWFwcGluZ0pzb24gYW5kIG1lc3NhZ2Ugb2JqZWN0IHdoZW4gZGVzdGluYXRpb24ga2V5IGlzIGFuIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmV2ZW51ZTogMTAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBwcm9kdWN0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnUHJvZHVjdCAxJyxcbiAgICAgICAgICAgICAgcHJpY2U6IDUwLFxuICAgICAgICAgICAgICBxdWFudGl0eTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdQcm9kdWN0IDInLFxuICAgICAgICAgICAgICBwcmljZTogMzAsXG4gICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1hcHBpbmdKc29uID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogJ2V2ZW50JyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5yZXZlbnVlJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VLZXlzOiAncHJvcGVydGllcy5jdXJyZW5jeScsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlS2V5czogJ3Byb3BlcnRpZXMucHJvZHVjdHMnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICAvLyBOb3QgYSBjb3JyZWN0IHBheWxvYWQgYXMgdGhlIGRlc3RpbmF0aW9uIGtleXMgYXJlIGVtcHR5IHN0cmluZ3Mgb3Igbm90IHByZXNlbnRcbiAgICAgIGNvbnN0IGV4cGVjdGVkUGF5bG9hZCA9IHtcbiAgICAgICAgJyc6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUHJvZHVjdCAxJyxcbiAgICAgICAgICAgIHByaWNlOiA1MCxcbiAgICAgICAgICAgIHF1YW50aXR5OiAyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1Byb2R1Y3QgMicsXG4gICAgICAgICAgICBwcmljZTogMzAsXG4gICAgICAgICAgICBxdWFudGl0eTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pO1xuICAgICAgZXhwZWN0KHBheWxvYWQpLnRvRXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2pzb24gdXRpbCBvdGhlciBmdW5jdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXRyaWV2ZSB0aGUgZmllbGQgdmFsdWUgY29ycmVjdGx5IGZyb20gdGhlIG1lc3NhZ2UgdXNpbmcgYSB2YWxpZCBzb3VyY2VLZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBldmVudDogJ3B1cmNoYXNlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHJldmVudWU6IDEwMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWl0czoge1xuICAgICAgICAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgICAgICAgIGxhc3ROYW1lOiAnRG9lJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNvdXJjZUtleSA9ICdmaXJzdE5hbWUnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9ICdKb2huJztcblxuICAgICAgY29uc3QgdmFsdWUgPSBKc29uVXRpbHMuZ2V0RmllbGRWYWx1ZUZyb21NZXNzYWdlKG1lc3NhZ2UgYXMgYW55LCBzb3VyY2VLZXkpO1xuICAgICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKGV4cGVjdGVkVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHNvdXJjZUtleXMgaXMgbm90IHN0cmluZywgb2JqZWN0IG9yIEFycmF5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAgICAgSnNvblV0aWxzLmdldFZhbHVlRnJvbU1lc3NhZ2Uoe30gYXMgYW55LCAxMjMpO1xuICAgICAgfSkudG9UaHJvdygnV3Jvbmcgc291cmNlS2V5IHR5cGUgb3IgYmxhbmsgc291cmNlS2V5IGFycmF5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBlcmZvcm0gYWRkaXRpb24gb3BlcmF0aW9uIHdoaWxlIGdldHRpbmcgdmFsdWUgZnJvbSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICBhOiAxMixcbiAgICAgICAgYzogMTE0LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9wcyA9IHtcbiAgICAgICAgb3BlcmF0aW9uOiAnYWRkaXRpb24nLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlS2V5czogWydhJywgJ2InXSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWw6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2MuZCddLFxuICAgICAgICAgICAgZGVmYXVsdFZhbDogLTEsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBleHBlY3QoSnNvblV0aWxzLmdldFZhbHVlRnJvbU1lc3NhZ2UobXNnIGFzIGFueSwgb3BzKSkudG9FcXVhbCgxMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBkZWZhdWx0VmFsIGZvciBhZGRpdGlvbiBvcGVyYXRpb24gd2hpbGUgZ2V0dGluZyB2YWx1ZSBmcm9tIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgIDE6IDEyMzQsXG4gICAgICAgIGE6IDEyLFxuICAgICAgICBjOiAxMTQsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3BzID0ge1xuICAgICAgICBvcGVyYXRpb246ICdhZGRpdGlvbicsXG4gICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2VLZXlzOiAxLFxuICAgICAgICAgICAgZGVmYXVsdFZhbDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZUtleXM6IFsnYy5kJ10sXG4gICAgICAgICAgICBkZWZhdWx0VmFsOiAtMSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChKc29uVXRpbHMuZ2V0VmFsdWVGcm9tTWVzc2FnZShtc2cgYXMgYW55LCBvcHMpKS50b0VxdWFsKC0xKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBubyBkZWZhdWx0VmFsdWVzIGFyZSBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IHtcbiAgICAgICAgYTogMTIsXG4gICAgICAgIGM6IDExNCxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHMgPSB7XG4gICAgICAgIG9wZXJhdGlvbjogJ2FkZGl0aW9uJyxcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZUtleXM6IFsnRCcsICdXJ10sXG4gICAgICAgICAgICBkZWZhdWx0VmFsOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlS2V5czogWydjLmQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChKc29uVXRpbHMuZ2V0VmFsdWVGcm9tTWVzc2FnZShtc2cgYXMgYW55LCBvcHMpKS50b0VxdWFsKG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHN0cmluZyBkZWZhdWx0VmFsdWVzIGFyZSBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IHtcbiAgICAgICAgYTogMTIsXG4gICAgICAgIGM6IDExNCxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHMgPSB7XG4gICAgICAgIG9wZXJhdGlvbjogJ211bHRpcGxpY2F0aW9uJyxcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZUtleXM6IFsnRCcsICdXJ10sXG4gICAgICAgICAgICBkZWZhdWx0VmFsOiAnMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2VLZXlzOiBbJ2MuZCddLFxuICAgICAgICAgICAgZGVmYXVsdFZhbDogJzEyJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChKc29uVXRpbHMuZ2V0VmFsdWVGcm9tTWVzc2FnZShtc2cgYXMgYW55LCBvcHMpKS50b0VxdWFsKG51bGwpO1xuICAgICAgb3BzLm9wZXJhdGlvbiA9ICdhZGRpdGlvbic7XG4gICAgICBleHBlY3QoSnNvblV0aWxzLmdldFZhbHVlRnJvbU1lc3NhZ2UobXNnIGFzIGFueSwgb3BzKSkudG9FcXVhbChudWxsKTtcblxuICAgICAgb3BzLm9wZXJhdGlvbiA9ICdyYW5kb21PcCc7XG4gICAgICBleHBlY3QoSnNvblV0aWxzLmdldFZhbHVlRnJvbU1lc3NhZ2UobXNnIGFzIGFueSwgb3BzKSkudG9FcXVhbChudWxsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RyaW5naWZ5IGpzb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSnNvblV0aWxzLnN0cmluZ2lmeSh7IGE6IDEgfSkpLnRvRXF1YWwoYHtcImFcIjoxfWApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIGdpdmVuIGFuIGludmFsaWQgc291cmNlS2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgZXZlbnQ6ICdwdXJjaGFzZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICByZXZlbnVlOiAxMDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc291cmNlS2V5ID0gJ2ludmFsaWRLZXknO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IEpzb25VdGlscy5nZXRGaWVsZFZhbHVlRnJvbU1lc3NhZ2UobWVzc2FnZSBhcyBhbnksIHNvdXJjZUtleSk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gcHJvcGVyIHRlbXBsYXRlZCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGV2ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmV2ZW51ZTogMTAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXBwaW5nSnNvbiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZUtleXM6IFsncHJvcGVydGllcyddLFxuICAgICAgICAgIGRlc3RLZXk6ICdpdGVtTmFtZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHRlbXBsYXRlOiAne3t2YWx1ZS5yZXZlbnVlfX0ge3t2YWx1ZS5jdXJyZW5jeX19JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGV4cGVjdChKc29uVXRpbHMuY29uc3RydWN0UGF5bG9hZChtZXNzYWdlIGFzIGFueSwgbWFwcGluZ0pzb24pKS50b0VxdWFsKHtcbiAgICAgICAgaXRlbU5hbWU6ICcxMDAgVVNEJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19